Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <iostream>
- using namespace std;
- float f(double x)
- {
- return x*x - 4;
- }
- double fp(double x, double d) // Перша похідна
- {
- return (f(x + d) - f(x)) / d;
- }
- double f2p(double x, double d) // Друга похідна
- {
- return (f(x + d) + f(x - d) - 2 * f(x) )/ (d * d);
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int i = 0;
- double x0, xn;
- double a, b, eps;
- i = 0;
- std::cout << "Please input [a;b]\n=>";
- std::cin >> a >> b; // вводим границы отрезка, на котором будем искать корень
- std::cout << "\nPlease input epsilon\n=>";
- std::cin >> eps; // вводим нужную точность вычислений
- double d = eps / 1000;
- if (a > b) // если пользователь перепутал границы отрезка, меняем их местами
- {
- x0 = a;
- a = b;
- b = x0;
- }
- if (f(a)*f(b) > 0) {
- std::cout << "\nError! No roots in this interval\n";
- system("pause");
- exit;
- }
- if (f(a)*f2p(a, d) > 0) x0 = a; // для выбора начальной точки проверяем f(x0)*d2f(x0)>0 ?
- else x0 = b;
- xn = x0 - f(x0) / fp(x0, d); // считаем первое приближение
- std::cout << ++i << "-th iteration = " << xn << "\n";
- while (fabs(x0 - xn) > eps) // пока не достигнем необходимой точности, будет продолжать вычислять
- {
- x0 = xn;
- xn = x0 - f(x0) / fp(x0, d); // непосредственно формула Ньютона
- std::cout << ++i << "-th iteration = " << xn << "\n";
- }
- std::cout << "\nRoot = " << xn; // вывод вычисленного корня
- system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement