Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- double Delta = 0.01;
- /*
- -1.7
- -1.73
- -1.729
- -1.7291
- -1.72912
- -1.729117
- -1.7291169
- */
- double Round(double X, double delta)
- {
- if(delta <= 1E-9)
- {
- std::wcout << "Неверное задание точности округления\n";
- return 0;
- }
- if(X > 0.0)
- return delta * long((X / delta) + 1.0 / 2);
- else
- return delta * long((X / delta) - 1.0 / 2);
- }
- double F(double x)
- {
- return cos(x*x) - 10 * x;
- }
- double F1(double x)
- {
- return -2*x * sin(x * x) - 10;
- }
- double newton(double x0, double eps, int &n)
- {
- double y, y1, dx;
- n = 0;
- y = F(x0); // скорость и результаты
- //y = Round(F(x0), Delta); //чувствительность к ошибкам
- if (y == 0.0)
- return x0;
- y1 = F1(x0); // скорость и результаты
- //y1 = Round(F1(x0), Delta); //чувствительность к ошибкам
- if (y1 == 0.0) {
- std::wcout << "Производная обратилась в ноль\n";
- return 0;
- }
- dx = y / y1;
- x0 -= dx;
- n++;
- while(fabs(dx) > eps)
- {
- y = F(x0);
- //y = Round(F(x0), Delta);
- if (y == 0.0)
- return x0;
- y1 = F1(x0);
- //y1 = Round(F1(x0), Delta); //чувствительность к ошибкам
- if (y1 == 0.0) {
- std::wcout << "Производная обратилась в ноль\n";
- return 0;
- }
- dx = y / y1;
- x0 -= dx;
- n++;
- }
- return Round(x0, eps);
- }
- int main() {
- int N;
- double eps = 0.1;
- double res;
- const double x = 0.0999950;
- for(int i = 0; i < 7; i++)
- {
- res = newton(0.7, eps, N);
- printf("F(x) = 0 => x = %.7f\n"
- "x* - x = %.7f\n"
- "N(EPS) = %u(%.7f)\n\n",
- res, fabs(res - x), N, eps);
- eps /= 10;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement