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

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

Для нахождения решения рассматриваемой задачи в системе MATLAB используется функция fzero:

fzero(hFunction,x0)

где hFunction – дескриптор функции, задающий исходное уравнение; x0 – начальное приближение к корню (заметим, что аргумент x0 может быть задан в виде скалярного значения, вблизи которого возможно наличие корня, либо в виде вектора из двух значений [x0s x0f] (причем x0s<x0f), элементы которого представляют собой интервал, на границе которого функция, заданная дескриптором hFunction имеет разные знаки, означающие наличие хотя бы одного корня на соответствующем интервале).

Функция fzero возвращает значение нуля вещественнозначной функции, зависящей от одной вещественной переменной и заданной дескриптором hFunction в окрестности точки x0.

Рассмотрим в качестве примера задачу о нахождении нулей функции на отрезке . В качестве начального приближения выберем x0=pi/4. Имеем:

>> x0=pi/4;

>> x=fzero(@sin,x0)

x =

8.4566e-28

В качестве нуля функции получено значение, практически идентичное точному значению корня, равному 0. Дескриптор функции здесь получен с помощью символа «@» и имени функции.

Если требуется найти корень функции, не являющейся встроенной в систему MATLAB (т.е. не имеющей в MATLAB фиксированного имени), то следует использовать функцию inline, например, при поиске нулей функции будем иметь:

>> f=inline('sin(x)-x','x')

f =

Inline function:

f(x) = sin(x)-x

>> x=fzero(f,pi/4)

x =

-1.6901e-08

>> f(x)

ans =

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

function y=MyFunction(x)

y=sin(x)-x

после чего обратиться к функции fzero:

>> x=fzero(@MyFunction,pi/4)

или, что эквивалентно,

>> x=fzero('MyFunction',pi/4)

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

>> fzero(hFunction,x0,options)

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

>> options=optimset('TolX',1e-8)

В приведенном примере обращения к функции optimset было указано имя дополнительного параметра TolX (сокращение от Tolerance of X; перевод с английского языка – точность нахождения корня), а также его числовое значение ( ).

>> options=optimset('TolX',1e-3);

>> x=fzero(f,pi/4)

x =

-1.6901e-08

>> x=fzero(f,pi/4,options)

x =

-2.2912e-04

>> f(x)

ans =

2.0048e-12

>> options=optimset('TolX',1e-8);

>> x=fzero(f,pi/4,options)

x =

-2.1238e-08

>> f(x)

ans =

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

>> Coeff=[1 -3 3 -3 2]

Coeff =

1 -3 3 -3 2

>> r=roots(Coeff)

r =

2.0000 + 0.0000i

0.0000 + 1.0000i

0.0000 - 1.0000i

1.0000 + 0.0000i

т.е. рассматриваемый многочлен имеет два действительных корня (1.0 и 2.0) и два комплексно сопряженных корня ( и ), что полностью согласуется с соответствующими аналитическими значениями.

Большое значение при использовании функции fzero имеет выбор начального приближения. Чтобы сделать этот выбор корректным целесообразно предварительно отобразить график соответствующей функции , воспользовавшись для этих целей, например, функцией fplot, обращение к которой может иметь вид:

fplot(hFunction,[x0 xl])

В результате будет построен график функции с дескриптором hFunction, равным @name (name – имя функции) на отрезке от x0 до xl. Таким образом, можем записать (рис. 2.20.1):

>> fplot(f,[-pi/2,pi/2])

>> fplot(@MyFunction,[-pi/2,pi/2])

>> fplot('MyFunction',[-pi/2,pi/2])

В заключение отметим, что для решения систем нелинейных уравнений вида F(x)=0 (где x – вектор или матрица неизвестных; F – функция, значением которой является вектор или матрица) в системе MATLAB имеется функция fsolve. Для получения более подробной информации о последней следует обратиться к справочной системе MATLAB.