Главная / Математика / Решение нелинейных уравнений

Решение нелинейных уравнений

Постановка задачи.

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

Xlgx –1.2=0

X^3 – 0.1x^2 + 0.4x –1.5 = 0

Алгоритм решения уравнений.

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

1 этап. Шаговый метод. Для нахождения корня выбирается отрезок от а до b. Предполагается, что функция на отрезке непрерывна. Ищется отрезок, у которого на концах разные знаки. Если производная функции на отрезке сохраняет знак, значит данный корень единственный.

2 этап. Метод Ньютона.

Исходя из уравнения касательной находим, что

Xn+1=xn-F(xn)/F’(xn)

F(x0)*F’’(x0)>0 – условие выбора точки x0.

Ручная прокрутка методом половинного деления:

1 этап: a=0;E=0,5;

1)a=b=0 F(0)=-1,5 —

b=a+h=0,5 F(0,5)=-1,2 —

2)a=b=0,5 F(0,5)=-1,2 —

b=a+h=1 F(1)=-0,2 —

3)a=b=1 F(1)=-0,2 —

b=a+h=1,5 F(1,5)=2,25 +

Таким образом мы получили интервал изоляции [1;1,5].

2 этап:

[1;1,5]

c=1,25 Fc=0,7968

c=1,125 Fc=0,2472

c=1,0625 Fc=0,01157

c=1,03125 Fc=-0,0971

c=1,04688 Fc=-0,04352

c=1,05469 Fc=-0,0161

C=1,05859 Fc=-0,00234

Ответ: 1,05859

Результат работы программы:

Функция x^3 – 0.1x^2 + 0.4x –1.5 = 0

flip_a0

Функция xlgx –1.2=0

flip_a1

Листинг программы:

//возвращает значение корня по методу Ньютона, [a, b]-интервал изоляции

Double metod_neutona(double a, double b, double (*function)(double, int));

//x0-нач. приближение, h-шаг, E-точность

Double x0,x1,h, E=0.00000001;

Double F1(double y);

Double F2(double y);

Double func1(double y, int mode);

Double func2(double y, int mode);

Void main ()

{

int quit=1;

double a, b;

init_graph(1);

while(quit)

{

switch(main_menu()){

case 1: grafic(3,3,-10,10,-10,10,633,449,WHITE, LIGHTGRAY,1,F1);

x0=-15;h=0.3;

a=-15;b=15;

find_interval_izol(&a,&b, func1);

gprintf(0,459,"Интервал изоляции [%g,%g]",a, b);

x0=metod_neutona(a, b,func1);

gprintf(0,469,"Корень уравнения x=%g",x0);

gprintf(350,469,"Press SPACE bar to continue…");

while(1)if(bioskey(1))if(bioskey(0)==SPACE) break;

break;

case 2: grafic(3,3,0.0001,5,-2,2,633,449,WHITE, LIGHTGRAY,1,F2);

x0=0.0001;h=0.1;

a=0.0001;b=5;

find_interval_izol(&a,&b, func2);

gprintf(0,459,"Интервал изоляции [%g,%g]",a, b);

x0=metod_neutona(a, b,func2);

gprintf(0,469,"Корень уравнения x=%g",x0);

gprintf(350,469,"Press SPACE bar to continue…");

while(1)if(bioskey(1))if(bioskey(0)==SPACE) break;

break;

case 3: quit=0;break;

}

}

init_graph(0);

}

Double func1(double y, int mode)

{ double rez;

if(!mode) rez=y*y*y-0.1*y*y+0.4*y-1.5;

if(mode==1) rez=3*y*y-0.2*y+0.4; //1-я производная

if(mode==2) rez=6*y-0.2;//2-я производная

return rez;

}

Double func2(double y, int mode)

{ double rez;

if(!mode) rez=y*log10(y)-1.2;

if(mode==1) rez=log10(y)+0.4343; //1-я производная

if(mode==2) rez=0.4343/y;//2-я производная

return rez;

}

Double F1(double y)

{ return (y*y*y-0.1*y*y+0.4*y-1.5);}

Double F2(double y)

{ return (y*log10(y)-1.2);}

Void find_interval_izol(double *a, double *b, double (*function)(double, int))

{

double y1,y2;

*a=x0;

y1=function(*a,0);

*b=*a+h;

y2=function(*b,0);

while(y1*y2>=0) {*a=*b;

y1=y2;

*b=*a+h;

y2=function(*b,0);

}

}

Double metod_neutona(double a, double b, double (*function)(double, int))

{

double y1,y2;

if(function(a,0)*function(a,2)>0) x0=a; //выбор точки x0

else if(function(b,0)*function(b,2)>0) x0=b; //

y1=function(x0,0);

y2=function(x0,1);

x1=x0-y1/y2;

y1=function(x1,0);

while(fabs(x1-x0)>=E)

{

x0=x1;

y2=function(x1,1);

x1=x0-y1/y2;

y1=function(x1,0);

}

return(x0);}