Решить нелинейное уравнение методом Ньютона

Мне нужно найти корни уравнения в интервале -1;3 методом Ньютона. Это задача из моей лабораторной работы. В ней сказано, что всего 3 корня есть. У меня есть код, который находит корень, но он один. Я не особо понимаю в матем, поэтому прошу помощи.

Функция x2-10·(sin(x))2+2 = 0

Как мне найти все 3 корня? При этом необходимо сделать запрос на ввод начального приближения к тому корню, который надо получить с заданной точностью;

#include <conio.h>
#include <math.h>
#include <iostream>
#define pi 3.14

using namespace std;

 
double f(double x) {
 
    return pow(x,2) - 10*pow(sin(x), 2) + 2;
}
 
double f1(double x) {
 
    return 2*x - 20*sin(x)*cos(x);
}
 
double f2(double x) {
 
    return   20*pow(sin(x),2)-20*pow(cos(x),2)+2;
}
 
int main() {
    int n=0;
    double a,b,c,eps;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"eps="; cin>>eps;
    if(f(a)*f2(a)>0) c=a;
    else c=b;
    printf("    x         f(x)      f'(x)  \n");
    printf("-------------------------------\n");
    do {
        printf("%7.4f  |  %7.3f |  %7.3f \n",c,f(c),f1(c));
        printf("-------------------------------\n");
        //cout<<c<<"\n";
        c=c-f(c)/f1(c);
        n+=1;
    }
    while (fabs(f(c))>=eps);
        cout<<"c="<<c<<"\n";
        cout<<"n="<<n<<"\n";
        getch();
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Ну, поскольку вообще говоря, вы не знаете, сколько корней и какие они, имеет смысл либо набросать график исходной функции
введите сюда описание изображения
в интересующем вас диапазоне (можно только в положительной части, с учетом симметрии):

введите сюда описание изображения

и прикинуть, где находятся корни, и соответственно выбрать нужные начальные значения для метода Ньютона, либо применить метод к разным начальным точкам и посмотреть, что получится...

double next_x(double x)
{
    double s = sin(x), c = cos(x);
    return x - (x*x-10*s*s+2)/(2*x-20*s*c);
}

double Solve(double start, double eps = 1e-8)
{
    double x = start, y = next_x(x);
    while(abs(x-y) > eps)
    {
        x = y;
        y = next_x(x);
    }
    return y;
}

int main(int argc, char * argv[])
{
    for(double x = 0.2; x <= 3; x += 0.2)
    {
        cout << x << "   " << Solve(x) << endl;
    }
}

А получится что-то вроде:

0.2   0.493435
0.4   0.493435
0.6   0.493435
0.8   0.493435
1   0.493435
1.2   -2.17806
1.4   -0.493435
1.6   2.17806
1.8   2.17806
2   2.17806
2.2   2.17806
2.4   2.17806
2.6   2.17806
2.8   2.17806

и вы видите, что в рассмотренном диапазоне [0,3] есть корни 0.493435 и 2.17806. Рассматривая симметричные корни из начального диапазона, получаем

-0.493435, 0.493435 и 2.17806

Или расширьте начальные точки на весь диапазон...

Но график лучше набросать, он подскажет, сколько корней и где примерно они находятся.

"По-моему, так" (с) Пух

→ Ссылка