Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/55: Рейтинг темы: голосов - 55, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 20.12.2015
Сообщений: 80
1

Найти корни уравнения методом Ньютона

20.02.2017, 19:27. Показов 10744. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задание Найти корень уравнения с помощью указанного метода

return pow(0.2*(x),3)-cos(x) ;//моя функия


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "stdafx.h"
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double f(double x)
{
     return pow(0.2*(x),3)-cos(x) ;//моя функия
}
 
 
 
double g(double x)
{
    return x - f(x);
}
 
int main()
{
    double x;
    double eps;
    cout<<"Enter initial root value   : ";cin>>x;
    cout<<"Enter error of calculation : ";cin>>eps;
    for(double iter = 1; eps < fabs(f(x)); iter = iter + 1)
    {
        system("cls");
        //*Итераций может быть очень много, поэтому рекомендую забыть
        //о целых а использовать дабл как счётчик, хотя в принципе если 
        //решение не нашли за 10-100 итераций то решения для данного коэффициента
        //при f(x) в g(x) нет и надо его менять
        cout<<"Iteration : "<<setprecision(0)<<iter<<endl;
        if(f(x) == 0)//Чёртовский важный момент(!)
            break;//ведь если df(x) == 0, то будет деление на ноль x - f(x)/df(x)
        cout<<"x    = "<<x    <<endl;
    
     
        cout<<"f(x) = "<<f(x) <<endl;
        x = g(x);
        
    return 0;
 
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.02.2017, 19:27
Ответы с готовыми решениями:

Найти корни уравнения методом Ньютона с произвольной точностью
Найти корни уравнения y = f(x) методом Ньютона. Точность подбирается самостоятельно. Формулы для...

Вычислить методом Ньютона корни уравнения с заданной точностью
Задание такое: Вычислить методом Ньютона корни уравнения cos(x)-3x+1=0 с заданной точностью eps....

Уточнить корни уравнения в заданном диапазоне с погрешностью методом Ньютона
Уточнить корни уравнения в заданном диапазоне с погрешностью E &lt; 10 -3 методом Ньютона: ...

Найти корни уравнений методом Ньютона
Решить 2 уравнения с точностью 0.0001 1. 3 * ln^2 (x) + 6 * ln (x) – 5 = 0 на отрезке 2....

2
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,714
20.02.2017, 19:37 2
Для сходимости решения нужно проверять, что |g'(x)|<1

И переставьте закрывающую скобку со строки 43 на строку 40!!!
0
Эксперт CЭксперт С++
5113 / 4552 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
20.02.2017, 21:22 3
Посмотрите мое решение.
Вводим отрезок, на котором ищем корень.
Проверяются ряд условий, при которых ищется корень, иначе на повтор запроса отрезка.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <cmath>
 
using namespace std;
 
double f(double x)      //возвращает значение функции f(x) = (0.2x)^3-cos(x)
{
    return (0.008*x*x*x-cos(x));
}
double df(double x)     //возвращает значение производной
{
    return (0.024*x*x+sin(x));
}
double d2f(double x)    //возвращает значение второй производной
{
    return (0.048*x+cos(x));
}
 
int main()
{
    int exit = 0, i;    // переменные для выхода из цикла
    double x0, xn;      // вычисляемые приближения для корня
    double a, b, eps;   // границы отрезка и необходимая точность
    do 
    {
        i=0;
        cout<<"Please input [a b]\n=>";
 
        while(1)
        {
            while (!(cin >> a >> b) || (cin.peek() != '\n'))
            {
                cin.clear();
                cin.ignore(20, '\n'); 
                cout << "Input error! Retry input" << endl;
            }
            //Проверяем условия:
            //f(a)*f(b) < 0 (функция принимает значения разных знаков на концах отрезка [a;b]);
            //Производные f'(x) и f"(x) сохранят знак на отрезке [a;b],
            //т.е. функция либо возрастает на отрезке, либо убывает,
            //сохраняя при этом направление выпуклости
            if ((f(a)*f(b)<0) && (df(a)*df(b)>0) && (d2f(a)*d2f(b)>0) )
                break;
            cout << "Input error! Extremum! Retry input" << endl;
        }
 
        // вводим нужную точность вычислений
        cout<<"\nPlease input epsilon\n=>";
        while (!(cin >> eps) || (cin.peek() != '\n'))
        {
            cin.clear();
            cin.ignore(10, '\n'); 
            cout << "Input error! Retry input" << endl;
        }       
 
        //выбираем за начало тот конец отрезка, где касательная к кривой y=f(x) на отрезке [a;b] пересекает ось Ох
        x0 = (df(a)*a-f(a))/df(a);          //абцисса, в которой касательная пересекает ось Ох
        x0 = ((x0>=a) && (x0<=b)) ? a : b;  //Начальная точка из условия a < f'(x)*x-f(x))/df(x) < b
        
        xn = x0-f(x0)/df(x0);               // считаем первое приближение
            
        cout<<++i<<"-th iteration = "<<xn<<"\n";    //выведем
            
        while(fabs(x0-xn) > eps)        // пока не достигнем необходимой точности, будет продолжать вычислять
        {
            x0 = xn;
            xn = x0-f(x0)/df(x0);       // непосредственно формула Ньютона
            
            cout<<++i<<"-th iteration = "<<xn<<"\n";//выведем
        }
            
        cout<<"\nRoot = "<<xn;          // вывод вычисленного корня
 
        cout<<"\nExit?=>";
        cin>>exit;
    } while (exit!=1);  // пока пользователь не ввел exit = 1
    return 0;
}
Для наглядности можно посмотреть на график функции:
Миниатюры
Найти корни уравнения методом Ньютона  
0
20.02.2017, 21:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.02.2017, 21:22
Помогаю со студенческими работами здесь

Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления
Здравствуйте, господа программисты, помогите пожалуйста код написать, очень нужна ваша помощь) Вот...

Найти корни уравнения на указанном промежутке с заданной точностью (метод Ньютона)
Добрый вечер! Помогите пожалуйста с лабой. Написать программу по нахождению корня уравнения...

Найти корень уравнения методом хорд и модифицированным методом Ньютона
Требуется решить уравнение 5sinx – x = 0 на отрезке с точностью E методом хорд и...

Численным методом найти корни уравнения
5x5 – 44x3 + 4.5x2 =12 нужно: 1 Найти корни уравнения на интервале от 2.930 до 2.931 с точностью...

Найти корни уравнения методом хорд
Доброго времени суток,Помогите пожалуйста написать программу для нахождения корней ф-ции методом...

Найти корни уравнения методом половинного деления
Отделить корни уравнения графически. Уточнить корни уравнения методом половинного деления, указать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru