Форум программистов, компьютерный форум CyberForum.ru

Метод Ньютона и итераций для нелинейного уравнения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 117, средняя оценка - 4.91
\\Olka
 Аватар для \\Olka
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 10
03.11.2012, 21:56     Метод Ньютона и итераций для нелинейного уравнения #1
Всем доброго времени суток) Помогите реализовать программу на С++ решающую уравнение 2x-2*x2-1=0 методом итерации и методом Ньютона:
привести уравнение f(x)= 0 к эквивалентному уравнению x =φ(x) Метод Ньютона можно рассматривать как частный случай метода итераций, если положить φ(x)=x-(f(x)/f'(x))
корни я посчитала:
X[1]=0
X[2]=0.399280757
X[3]=6.35234489

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
#include <conio.h>
#include <math.h>
#include <iostream>
using namespace std; 
 
double f(double x) {
 
    return   pow(2,x)-2*x*x-1;
}
 
int main() {
     int n=0;
     double a,b,c,eps;
     cout<<"a="; cin>>a;//начало интервала на котором ищется решение
     cout<<"b="; cin>>b;//конец интервала
     cout<<"eps="; cin>>eps;// точность решения
/*
cout<<"Метод_итераций\n";
cout<<"Метод_Ньютона\n";
*/
 
     cout<<"c="<<c<<"\n";//ответы
     cout<<"n="<<n<<"\n";//количество итераций
     getch();
 return 0;
}
эти методы хорошо реализованы тут, помогите сделать программу для моего уравнения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2012, 03:15     Метод Ньютона и итераций для нелинейного уравнения #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
\\Olka, метод простых итераций предполагает схему
xk = g(xk-1) где g(x) = x + b*f(x) где b - произвльное число
Этой схемы в твоём решении не было, я бы сказал ничего кроме ввода не было.
Цитата Сообщение от \\Olka Посмотреть сообщение
помогите сделать программу для моего уравнения
- хорошо, но при условии что вникнешь в теорию метода
Метод простых итерации
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
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double f(double x)
{
    return pow(2.0,x) - 2*pow(x, 2.0) - 1;
}
 
double g(double x)
{
    return x + 0.5*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;
        cout<<"x    = "<<x   <<endl;
        cout<<"g(x) = "<<g(x)<<endl;
        cout<<"f(x) = "<<f(x)<<endl;
        x = g(x);
    }
    system("pause");
    return 0;
}
Отработка и проверка в MathCAD на скриншоте
Миниатюры
Метод Ньютона и итераций для нелинейного уравнения  
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2012, 03:26     Метод Ньютона и итераций для нелинейного уравнения #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
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
 
double f(double x)
{
    return pow(2.0,x) - 2*pow(x, 2.0) - 1;
}
 
double df(double x)
{
    return pow(2.0,x)*log(2.0) - 4*x;
}
 
double g(double x)
{
    return x - f(x)/df(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(df(x) == 0)//Чёртовский важный момент(!)
            break;//ведь если df(x) == 0, то будет деление на ноль x - f(x)/df(x)
        cout<<"x    = "<<x    <<endl;
        cout<<"g(x) = "<<g(x) <<endl;
        cout<<"df(x)= "<<df(x)<<endl;
        cout<<"f(x) = "<<f(x) <<endl;
        x = g(x);
    }
    system("pause");
    return 0;
}
Отработка и проверка в MathCAD на скриншоте
Миниатюры
Метод Ньютона и итераций для нелинейного уравнения  
-=ЮрА=-
Заблокирован
Автор FAQ
04.11.2012, 03:35     Метод Ньютона и итераций для нелинейного уравнения #4
Для всех
Мы использовали два разных метода и получили два разных результата
Метод простых итераций x = 0,4
Метод Ньютона х = 6,
что это некоррект алгоритмов, либо в коде ошибка? Нет всё с кодами и алгоритмами хорошо, просто если внимательно рассмотреть график функции увидим, что она пересекает ось в нескольких точках, как раз точках 0,4 и 6. Метод простых итераций определили первый корень, метод Ньютона второй.
РЕЗЮМЕ
Метод Ньютона, быстрей чем метод простых итераций, но имеет колосальный недостаок, он неприменим для значений аргумента вблизи от экстремумов функции(т.к в этом случае производная весьма и весьма близка к нулю и кроме того что в этом отношении x - f(x)/df(x) при df(x)->0 получаем колосальные значения частного, так в точке df(x) == 0 имеем деление на ноль, потому сфера применение метода Ньютона ограничена.

Не по теме:

Также если посмотреть на отношение f(x)/df(x) можно легко догадаться что метод Ньютона как бы отскакивает от корней вблизи экстемальных значений функции, т.к как уже было сказано выше, отношение f(x)/df(x) вблизи экстремума близко к бесконечности.

pavel1992
0 / 0 / 0
Регистрация: 26.12.2009
Сообщений: 27
04.11.2012, 12:51     Метод Ньютона и итераций для нелинейного уравнения #5
-=ЮрА=- гляньте мою тему....
\\Olka
 Аватар для \\Olka
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 10
05.11.2012, 17:10  [ТС]     Метод Ньютона и итераций для нелинейного уравнения #6
-=ЮрА=-, огромное спасибо! всё понятно и доступно объяснено
Trafi
Сообщений: n/a
16.03.2014, 17:45     Метод Ньютона и итераций для нелинейного уравнения #7
-=ЮрА=-, Enter initial root value - что просят ввести? примерное значения корня, или что?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 19:23     Метод Ньютона и итераций для нелинейного уравнения
Еще ссылки по теме:

Метод простых итераций для одного уравнения C++
C++ Решение нелинейного уравнения методом простых итераций
Поиск корня нелинейного уравнения простой итерацией, половинным делением, методом Ньютона C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
16.03.2014, 19:23     Метод Ньютона и итераций для нелинейного уравнения #8
Цитата Сообщение от Trafi Посмотреть сообщение
что просят ввести? примерное значения корня, или что?
да требуется ввести начальное приближение корня.
Yandex
Объявления
16.03.2014, 19:23     Метод Ньютона и итераций для нелинейного уравнения
Ответ Создать тему
Опции темы

Текущее время: 08:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru