Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- double AntiDerivative(double x) {
- return x * x + 2 * sin(x) - 1;
- }
- double FirstDerivative(double x) {
- return 2 * (x + cos(x));
- }
- double SecondDerivative(double x) {
- return 2 - 2 * sin(x);
- }
- double Phi(double x, double lambda) {
- return FirstDerivative(x) > 0.0 ? x - lambda * AntiDerivative(x) : x + lambda * AntiDerivative(x);
- }
- double Iterative(double a, double b, double eps, double &delta, unsigned int &iterations) {
- double m1, M1;
- if (fabs(FirstDerivative(a)) >= fabs(FirstDerivative(b))) {
- m1 = fabs(FirstDerivative(b));
- M1 = fabs(FirstDerivative(a));
- } else {
- m1 = fabs(FirstDerivative(a));
- M1 = fabs(FirstDerivative(b));
- }
- double xk = (a + b) * 0.5;
- double lambda = 1.0 / M1;
- double q = 1.0 - m1 * lambda;
- double t = q / (1 - q);
- iterations = 0;
- do {
- double x0 = xk;
- xk = Phi(x0, lambda);
- iterations++;
- delta = fabs(xk - x0) * t;
- } while (delta > eps);
- return xk;
- }
- double Tangets(double a, double b, double eps, double &delta, unsigned int &iterations) {
- double m1;
- if (fabs(FirstDerivative(a)) >= fabs(FirstDerivative(b))) {
- m1 = fabs(FirstDerivative(b));
- } else {
- m1 = fabs(FirstDerivative(a));
- }
- double xk = AntiDerivative(a) * SecondDerivative(a) > 0 ? a : b;
- iterations = 0;
- do {
- xk -= AntiDerivative(xk) / FirstDerivative(xk);
- iterations++;
- delta = fabs(AntiDerivative(xk)) / m1;
- } while (delta > eps);
- return xk;
- }
- void FindRoots(double a, double b, double step, double *X, int count) {
- int n = (int((b - a) / step) >> 1) << 1;
- step = (b - a) / (double) n;
- for (int i = 0, roots = 0; (i < n) && (roots < count); i++) {
- double x = a + i * step;
- if (AntiDerivative(x) * AntiDerivative(x + step) < 0) {
- X[roots++] = x;
- }
- }
- }
- int main() {
- double X[2];
- FindRoots(-2, 1, 0.1, X, 2);
- for (int i = 0; i < 2; i++) {
- double x = X[i];
- printf("| eps | equation root | Iterative accuracy |\n");
- for (double eps = 1e-2, delta = 0; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations;
- double y = Iterative(x, x + 0.1, eps, delta, iterations);
- printf("| %.0e | %23.20f | %.12e |\n", eps, y, delta);
- }
- printf("\n");
- }
- for (int i = 0; i < 2; i++) {
- double x = X[i];
- printf("| eps | equation root | Tangets accuracy |\n");
- for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations;
- double y = Tangets(x, x + 0.1, eps, delta, iterations);
- printf("| %.0e | %23.20f | %.12e |\n", eps, y, delta);
- }
- printf("\n");
- }
- printf("| eps | Iterative iteration | Tangets iteration |\n");
- for (double eps = 1e-2, delta, x = X[0]; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations1, iterations2;
- Iterative(x, x + 0.1, eps, delta, iterations1);
- Tangets(x, x + 0.1, eps, delta, iterations2);
- printf("| %.0e | %19d | %17d |\n", eps, iterations1, iterations2);
- }
- printf("\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement