Решить нелинейное уравнение методом Ньютона
Мне нужно найти корни уравнения в интервале -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 шт):
Ну, поскольку вообще говоря, вы не знаете, сколько корней и какие они, имеет смысл либо набросать график исходной функции

в интересующем вас диапазоне (можно только в положительной части, с учетом симметрии):
и прикинуть, где находятся корни, и соответственно выбрать нужные начальные значения для метода Ньютона, либо применить метод к разным начальным точкам и посмотреть, что получится...
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
Или расширьте начальные точки на весь диапазон...
Но график лучше набросать, он подскажет, сколько корней и где примерно они находятся.
"По-моему, так" (с) Пух
