Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- double f(double x) {
- return x * x + 2 * sin(x) - 1;
- }
- double f1(double x) {
- return 2 * (x + cos(x));
- }
- double f2(double x) {
- return 2 - 2 * sin(x);
- }
- double phi(double x, double lambda) {
- return f1(x) > 0.0 ? x - lambda * f(x) : x + lambda * f(x);
- }
- double iterative(double a, double b, double eps, double &delta, unsigned int &iter) {
- double m1 = fabs(f1(a)), M1 = fabs(f1(b));
- if (m1 > M1) {
- double t = m1;
- m1 = M1;
- M1 = t;
- }
- double x0, xk = (a+b)/2, lambda = 1.0/M1, q = 1.0 - m1/M1;
- iter = 0;
- do {
- x0 = xk;
- xk = phi(x0, lambda);
- iter++;
- } while (fabs(xk-x0) > (1-q)/q*eps);
- delta = fabs(xk-x0)*q/(1-q);
- return xk;
- }
- double tangents(double a, double b, double eps, double &delta, unsigned int &iter) {
- double m1 = fabs(f1(a)), M1 = fabs(f1(b)), xk;
- if (m1 > M1) {
- double t = m1;
- m1 = M1;
- M1 = t;
- }
- xk = f(a)*f2(a) > 0 ? a : b;
- iter = 0;
- do {
- xk = xk - f(xk)/f1(xk);
- iter++;
- } while (fabs(f(xk))/m1 > eps);
- delta = fabs(f(xk))/m1;
- return xk;
- }
- void Iterative(double a, double b) {
- printf("| eps | equation root | accuracy estimation for I |\n");
- for (double eps = 1e-2, delta = 0; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations;
- double x = iterative(a, b, eps, delta, iterations);
- printf("| %.0e | %13.10f | %25.23f |\n", eps, x, delta);
- }
- printf("\n");
- }
- void Tangents(double a, double b) {
- printf("| eps | equation root | accuracy estimation for T |\n");
- for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations;
- double x = tangents(a, b, eps, delta, iterations);
- printf("| %.0e | %13.10f | %25.23f |\n", eps, x, delta);
- }
- printf("\n");
- }
- void Compare(double a, double b) {
- printf("| eps | iteration count for I | iteration count for T |\n");
- for (double eps = 1e-2, delta; eps > 1e-14; eps *= 1e-3) {
- unsigned int iterations1, iterations2;
- iterative(a, b, eps, delta, iterations1);
- tangents(a, b, eps, delta, iterations2);
- printf("| %.0e | %21d | %21d |\n", eps, iterations1, iterations2);
- }
- printf("\n");
- }
- int main() {
- Iterative(-2, -1.5);
- Tangents(-2, -1.5);
- Iterative(0, 0.5);
- Tangents(0, 0.5);
- Compare(-2, -1.5);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement