Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Matlab_04.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
1.42 Mб
Скачать

4.8. Программное обеспечение

Ниже приведены тексты программ на алгоритмическом языке FORTRAN, реализующие:

- метод половинного деления Subroutine Polov(a, b, eps, F, x);

- метод хорд Subroutine Horda(a, b, eps, F, x);

- метод простой итерации

Subroutine Iter(eps, km, Fi, x0, x, kErr);

- метод Ньютона

Subroutine Newton(eps, km, F, dF, x0, x, kErr).

В качестве формальных параметров в подпрограммах используются:

a и b - левая и правая границы отрезка изоляции корня;

eps - относительная погрешность вычисления корня уравнения;

km - предельное количество итераций (параметр, обеспечивающий аварийный выход из подпрограммы при расходящемся итерационном процессе);

Fi и F - имена внешних подпрограмм-функций, в которых вычисляются значения функций (x) и f(x), соответственно;

dF - имя подпрограммы-функции, в которой вычисляется значение первой производной функции f(x) (подпрограмма оформляется так же, как и подпрограмма F);

x - вычисленное значение корня уравнения;

x0 - для метода Ньютона и метода простой итерации это начальное приближение корня;

kErr - признак успешности поиска корня: kErr = 0 , если корень вычислен с заданной точностью, и kErr = 1 , если исходное уравнение неразрешимо данной подпрограммой (заданная точность не достигнута за заданное предельное количество итераций).

Предполагается, что подпрограммы Fi, F, dF оформлены в виде

Function Fun(x)

...............

Fun =...........

End

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

Subroutine Polov (aa, bb, eps, F, x)

a=aa

b=bb

n=0

Do

x=(a+b)/2.

If (abs(2*(b-a)/(b+a)) .lt. eps) Exit

n=n+1

If (F(a)*F(x) .gt. 0.0) Then

a=x

Else

b=x

End if

End do

End

Метод хорд

Subroutine Horda (aa, bb, eps, F, x)

a=aa

b=bb

n=0

x1=a

f1=F(a)

f2=F(b)

Do

x=a-(b-a)*f1/(f2-f1)

If (abs(2*(x-x1)/(x+x1)) .lt. eps) Exit

n=n+1

ff=F(x)

If (ff*f1.GE.0.0) Then

a=x

f1=ff

Else

b=x

f2=ff

End if

x1=x

End do

End

Метод простой итерации

Subroutine Iter (eps, km, Fi, x0, x, kErr)

kErr = 0

n = 0

Do

x=Fi(x0)

If (abs(2*(x-x0)/(x+x0)) .lt. eps) Exit

x0=x

n=n+1

if (n .eq. km) then

kErr=1

Exit

End if

End do

End

Метод Ньютона

Subroutine Newton (eps, km, F, dF, x0, x, kErr)

kErr = 0

n=0

Do

x=x0-F(x0)/dF(x0)

n=n+1

if (abs(2*(x-x0)/(x+x0)).lt.eps) Exit

If (n.ge.km) Then

kErr=1

Exit

End if

x0=x

End do

End

В системе MATLAB вычисление корня нелинейного уравнения реализуется при помощи функции fzero, которую можно использовать следующими способами:

x = fzero(fun,x0) – вычисляет корень уравнения , левая часть которая представлена параметром fun, определяющим имя m-функции, ее вычисляющей. Аргумент x0 задает начальное приближение к корню. Если x0 = [a b] – вектор, содержащий границы интервала локализации искомого корня, то вычисляется значение корня, лежащего в интервале [a, b];

[x, fval] = fzero(fun,x0) – вычисляет корень уравнения и дополнительно значение функции на вычисленном значении x;

[x, fval, flag] = fzero(fun,x0) – выдает дополнительно признак flag, характеризующий обстоятельства завершения вычислений, например:

1 – соответствует успешному завершению вычислений,

-3 – соответствует тому, что в процессе вычислений получено значение NaN или Inf функции ,

-4 – получено комплексное значение функции ,

-5 – точка перемены знака соответствует вертикальной асимптоте графика функции , а не корню.

Точность вычисления корня при описанных способах вызова функции fzero определяется по умолчанию значением встроенной константы eps системы MATLAB, равной 2.22044604925031e-016.

Параметр fun , являющийся фактическим параметром, указывающим функцию для вычисления левой части уравнения , задается в виде:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]