Численные методы решения нелинейных уравнений.


Задание: Найти наименьший по абсолютной величине корень нелинейного уравнения F(x)=0 с помощью .

Ход работы:
Так как данная функция достаточно сложная, то представим ее в следующем виде:
, где .
Исследуем отдельно функции и , а затем начертим их графики на одном чертеже для того, чтобы отделить заданный корень исходного уравнения:
I Приведем полное исследование функции
1) Область определения функции
2) Находим точки пересечения с ОХ:
; т. А (1;0)
Находим точки пересечения с ОУ, но график не пересекает ось ОУ.
3) Промежутки знакопостоянства:

— + f(x)
|
1 x
Таким образом: >0 при ,
<0 при .
4) Чтобы найти точки max и min определим первую производную и найдем ее нули:

5) Находим точки перегиба графика функции, для чего находим вторую производную функцию и определяем ее нули:

Точка перегиба

0,74 0,7
max точка перегиба

II
Находим точки пересечения с ОХ:
; т. В(2;0) т. С(3;0)
ОУ:
; т. D(0;6)

Значит т. (2.5;-0.25)

Метод половинного деления:

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
int func(double);
void main(){
clrscr();
float a,b;
float eps;
double x1,x2;
printf(«Введите диапазон:»);
scanf(«%f %f»,&a,&b);
x1=b;
if(func(a)*func(b)!=-1){
printf(«На этом отрезке корней нет»);
exit(1);
}
printf(«Введите погрешность:»);
scanf(«%f»,&eps);
for(;;){
x2=(a+b)/2;
if(fabs(x2-x1)<eps)break;
if(func(a)*func(x2)==-1)b=x2;
if(func(x2)*func(b)==-1)a=x2;
x1=x2;
}
printf(«Ответ:%.10f»,x2);
getch();
}
int func(double x){
double result;
result=log(x)/sqrt(x)-(x-2)*(x-3);
if(result>0)return 1;
else return -1;
}

Ответ: Наименьший по абсолютной величине корень нелинейного уравнения посчитанный с точностью , r =1.691223, e=0.0000610.

Метод хорд:

#include<stdio.h>
#include<conio.h>
#include<math.h>
int func1(float);
int func2(float);
float F(float);
void main(){
clrscr();
float a,b,na,nb,eps,xn,x;
printf(«Введите границы отрезка:»);
scanf(«%f %f»,&a,&b);
if(func1((a+b)/2)*func2((a+b)/2)>0){
nb=b;xn=a;
}
else{nb=a;xn=b;}
printf(«Введите погрешность:»);
scanf(«%f»,&eps);
for(;;){
x=xn;
xn=xn-(F(xn)*(nb-xn))/(F(nb)-F(xn));
if(fabs(x-xn)<eps)break;
}
printf(«Ответ:%.10f»,xn);
getch();
}
int func1(float x){
return (2-log(x))/(2*x*sqrt(x));
}
int func2(float x){
return (3*log(x)-8)/(4*x*x*sqrt(x));
}
float F(float x){
return log(x)/sqrt(x)-(x-2)*(x-3);
}

Ответ: Наименьший по абсолютной величине корень нелинейного уравнения посчитанный с точностью , r =1.6913055182, e=0.0000942.

Метод касательных:
#include<stdio.h>
#include<conio.h>
#include<math.h>
float func1(float);
float func2(float);
float F(float);
float Fr(float);
void main(){
clrscr();
float a,b,x,xn,eps;
printf(«Введите границы отрезка:»);
scanf(«%f %f»,&a,&b);
printf(«Введите погрешность:»);
scanf(«%f»,&eps);
if(func1((a+b)/2)*func2((a+b)/2)>0){
xn=a;x=b;
}
else{xn=a;x=b;}
for(;;){
x=xn;
xn=xn-F(xn)/Fr(xn);
if(fabs(xn-x)<eps)break;
}
printf(«Ответ:%.10f»,xn);
getch();
}
float F(float x){
return (log(x)/sqrt(x))-(x-2)*(x-3);
}
float Fr(float x){
return (2-log(x))/2*x*sqrt(x);
}
float func1(float x){
return (2-log(x))/2*x*sqrt(x);
}
float func2(float x){
return (3*log(x)-8)/4*x*x*sqrt(x);
}

Ответ: Наименьший по абсолютной величине корень нелинейного уравнения посчитанный с точностью , r =1.6912496090, e=0.0000626.

Вывод: В данном примере самым точным является метод половинного деления, погрешность которого , корень .

Загрузка...