Санкт-Петербургский Государственный Университет Низкотемпературных и Пищевых Технологий
Лабораторная работа №1
«Численные методы решения нелинейных уравнений»
Проверил: Малышева Т.А.
Выполнил: Ковалёв А.Г.
Санкт-Петербург
2011 г
Цель работы: Освоить методы решения нелинейных уравнений: метод бисекций, касательной и библиотечной процедуры Zreal.
Метод половинного деления
Код программы:
program polovin
real a,b,x,eps,y
integer n
print *, 'Please, fill in a,b,eps'
read *, a,b,eps
n=0
do while (abs(a-b)>=eps)
x=(a+b)/2 ; n=n+1
if (f(a)*f(x)>0) then
a=x
else
b=x
end if
end do
x=(a+b)/2
y=f(x)
print *, 'x=', x
print *, 'f(x)=', y
print *, ‘ chislo interacii=', n
end
function f(x)
real f,x
f=((x**3)-(1.5*(x**2))+(0.58*x)-(0.057))
end
Подбор одного корня вручную:
Метод Ньютона
Код программы:
program hbk
real xn,x,e
integer n
print*, 'e='
read*, e
print*, 'x='
read*, x
n=0
n=n+1
do
xn=x-f(x)/f1(x)
if ((abs(x-xn)<=e).and.((f(x))<=e))then
exit
else
x=xn
n=n+1
end if
end do
print*, 'x=', x
print*, 'n=', n
print*,'f=',f(x)
end
function f1(x)
real f1, x
f1=3*x**2-3*x+0.58
end
function f(x)
real f, x
f= x**3-1.5*x**2+0.58*x-0.057
end
Библиотечная процедура Z Real
Код программы:
program lab1
use msimslms
parameter (n=3)
external fx
real fx,x(n),errabs,errel,eps,eta,xguess(n)
integer itmax ,info(n)
errabs=0.00001
errel=0.00001
eta=0.00001
eps=0.00001
itmax=100
xguess(1)=1.5
xguess(2)=0
xguess(3)=6
call zreal(fx,errabs,errel,eps,eta,n,itmax,xguess,x,info)
do i=1,n
print*, i,x(i),fx(x(i)), info(i)
end do
end
function fx(x)
fx= x**3-1.5*x**2+0.58*x-0.057
end
Вывод: Метод деления отрезка пополам медленный, но он всегда сходится, то есть решение получается всегда. Он требует большее число итераций по сравнению с другими методами.
Одним из лучших методов решения нелинейных уравнений является метод Ньютона. Скорость сходимости метода гораздо выше, чем в других методах. Метод хорош и тем, что быстро сходится, потому что имеет квадратичную скорость сходимости. Однако трудность в применении данного метода состоит в выборе начального приближения.
Трудность в методе секущих заключается в том, что он тоже может не сходиться.
program asd
real a,b,E1,E2,x1,y,k,n,x
E1=1E-5; E2=1E-5
print*,'vvedite kol korney'
read*,k
do i=1,k
do
print*,'vvedite a,b',i
read*,a,b
print*,'f(a)=',f(a),'f(b)=',f(b)
if(f(a)*f(b)>0)then
cycle
else
exit
end if
end do
n=0
do
x=(a+b)/2
n=n+1
if (f(a)*f(x)>0)then
a=x
else
b=x
end if
if(abs(f(x))<=E1 .and. abs(a-b)<=E2)exit
end do
x1=(a+b)/2
y=f(x1)
print*,'kolvo iteracii',n
print*,'y=',y,'x1=' ,x1
end do
end
function f(x)
f=x**3-1.5*x**2+0.58*x-0.057
end