Лабораторная работа №5
РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ
Задана
нелинейная функция, график, построенный в Excel, приведен
на рис.1. Требуется найти один корень, т.к. график пересекает ось абсцисс
только в одной точке на промежутке
. Требуется найти эту точку.
Процесс отыскания корней производится в два этапа:
1.
|
2. Нахождение корней с заданной точностью.
Отделить корень в некоторых случаях можно
и графически. Для этого необходимо построить график соответствующей функции и
найти точку пересечения с осью абсцисс (рис.2).
Но этот метод может привести к большим погрешностям.
Можно использовать
программный метод. При этом отыскиваются два таких соседних значения , для которых
имеет
противоположные знаки.
Зададим код ошибки
равный единице, предполагая, что на отрезки
, где
- левая граница, а
-
правая, нет корней. В дальнейшем проверим, так ли это. Затем зададим значение
и вычислим значение функции в точке
. Изменим значение аргумента по формуле
, где
- шаг
перебора аргумента. Проверим, лежит ли
нутрии
промежутка
. Если
, то на
отрезке нет корня. Нужно возвратиться в вызывающую программу. Затем вычисляем
значение функции в новой точке
и проверяем, изменила
ли функция знак или нет. Если нет, то опять изменяем
.
Если да, то определяем границы отрезка
по
формулам
,
. В
данном случае код ошибки равен единице, отрезок найден (рис. 3).
Для уточнения корня нелинейного уравнения до заданной точности используем два метода:
1. Метод половинного деления. 2.Метод Ньютона.
Метод половинного деления
Данный метод
заключается в разбиении отрезка пополам при условии, если корень попадает в
данный отрезок. Эту операцию можно повторять несколько раз до получения
заданной точности. Зададим код ошибки равный единице. Проверим произведение , если знак положительный, то возвращаемся
в вызывающую программу. Зададим границы отрезка содержащего корень
,
;
зададим начальное
значение итерации
, код ошибки равен нулю.
Вычислим значение функции в точке
. Вычислим середину
отрезка
:
. Изменим,
счетчик итераций на
. Если длина отрезка
меньше заданной точности, то возвращаемся
в вызывающую программу. Необходимо проверить, в каком из отрезков
или
лежит
корень. Если корень лежит внутри первого отрезка, то изменяем правую границу
отрезка, в противном случае – левую: если
, то
, иначе
(рис.4).
Метод Ньютона
Метод состоит в построении
итерационной последовательности , сходящейся к корню
уравнения
(рис. 5). Зададим код ошибки равный
единице, и изначальное количество итераций
,
текущее значение корня
. Выполним итерационный цикл, изменим,
количество итераций на
, если количество итераций
превысило
, осуществим возврат в вызывающую
программу, вычислим уточненное значение по формуле:
,
вычислим модуль разности
. В качестве нового
значения зададим уточненное значение корня
. Если
, то итерационный цикл необходимо
повторить. После достижения заданной точности, код ошибки, меняем на ноль и
осуществляем возврат в вызывающую программу.
На языке Fortran программа примет следующий вид:
Function F(x)
F=sqrt(x)-cos(.387*x)
end
Function PF(x)
PF=1/(2*sqrt(x))+.387*sin(.387*x)
end
Program L5
External F,PF
x0=0.5
do ; call OKNU(F,x0,1.5,0.1,a,b,ier1); if(ier1==1) exit
print*,a,b,ier1 ; x0=b
call MPD(F,a,b,1E-5,C,ier2)
print*,C,ier2
call MN(F,PF,0.5*(a+b),1E-5,20,C1,ier3)
print*,C1,ier3
enddo
End
Subroutine OKNU(F,XL,XR,h,a,b,ier)
X=XL; y=F(x); ier=1
do; x=x+h; if(x>XR) Return
Z=F(x); if(y*Z<=0) then
ier=0; a=x-h; b=x;
return; end if
enddo
End
Subroutine MPD(F,a1,b1,eps,c,ier)
a=a1; b=b1
ier=1; if(F(a)*F(b)>0) Return
ier=0; y=F(a)
do; c=0.5*(a+b)
if(y*F(c)>0) then; a=c; else; b=c; end if
if(b-a<eps) Return
enddo
End
Subroutine MN(F,FP,x0,eps,mmax,x,ier)
x=x0; m=0
do; m=m+1; if(m>mmax) Return
y=x-F(x)/FP(x); e=abs(y-x); x=y
if(e<eps) then; ier=0; Return; end if
enddo
End
8.000001E-01 |
9.000001E-01 |
0 |
8.867738E-01 |
0 |
|
8.867772E-01 |
0 |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.