Нули и экстремумы функций
Как известно, решение уравнений и поиск экстремумов функций - родственные задачи. Так решение системы fi(X)=0, i=1,...,n можно заменить поиском минимума , заведомо равного нулю, если система имеет решение. С другой стороны, поиск экстремумов функции можно свести к решению системы уравнений относительно нулевых значений ее производных.
Для некоторых классов функций имеются вполне универсаль-ные методы решения: так для полиномов поиск корней реализуется без каких-то условий обобщенным методом Ньютона - функцией roots(...) . В общем случае при великом многообразии методов реше-ние подобных задач отнюдь нетроивиально. В системе реализованы функции лишь для простейших задач без гарантий получения реше-ния.
xmin=fmin('имя',a,b), xmin=fmin('имя',a,b,<опции>), xmin= fmin ('имя', a,b,<опции>, p1,...,p10), [xmin,options]=fmin(...) - поиск минимума функции одной переменной на интервале [a,b]; в списке <опции> можно указать option(1)=1 (вывод промежуточных результатов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4) и option(14)- максимальное число итераций (по умолчанию 500). Используется метод золотого сечения и параболической интерполяции.
function r=m1(x) | |||
r=x^2-x-3; | |||
>> xm=fmin('m1',-2,3,[1, 1e-6]) | |||
Func | evals x | f(x) | Procedure |
-0.0901699 | -2.9017 | initial | |
1.09017 | -2.9017 | golden | |
1.81966 | -1.5085 | golden | |
0.5 | -3.25 | parabolic | |
0.5 | -3.25 | parabolic | |
0.5 | -3.25 | parabolic | |
xm = | |||
0.5000 |
xmin=fmins('имя',x0), xmin=fmins('имя',x0,<опции>), xmin= fmins ('имя', x0,<опции>или [], p1,...,p10), [xmin,options]=fmins(...) - поиск минимума функции нескольких переменных: x0 - начальное приближение; p1,...,p10 - дополнительные параметры; в списке <опции> можно указать option(1)=1 (вывод промежуточных результа-тов), option(2)- погрешность итераций для аргумента (разница между смежными приближениями; по умолчанию 10-4), option(3)-итерационная погрешность для функции и option(14)- максимальное число итераций (по умолчанию 200 x n).
function r=m2(x) | |||||||||
r=(x(1)-1)^2+(x(2)-3)^2; | |||||||||
>> [xmin,opt]=fmins('m2',[0.5 2.5]) | |||||||||
xmin = | |||||||||
1.0000 | 3.0000 | ||||||||
opt = | |||||||||
0.0001 | 0.0001 | 0.0000 | 0.0000 | ||||||
0.0000 | 0.1000 |
(возвращаемые здесь опции 8 и 10 определяют минимум функции и число итераций). Используется метод Нелдера-Мида (строится симплекс из n+1 вершины в n-мерном пространстве, берется новая точка внутри или вблизи симплекса и может заменить одну из вершин; процесс повторяется до малого диаметра симплекса).
fzero('имя',x0), fzero('имя',x0,eps), fzero ('имя', x0, eps , trace), fzero ('имя', x0, eps, trace,p1,...,p10) - поиск действительных корней функции одной переменной при начальном приближении х0 (можно взять и в форме [a,b] при условии f(a) x f(b) < 0) с заданной относительной погрешностью; trace=1 - вывод промежуточных результатов. Используется метод дихотомии, хорд и обратной квадратической интерполяции. При поиске корней полинома см.roots.
Процесс поиска корня виден из примера:
>>> fzero('sin',6,[],1) | |||
Func evals | x | f(x) | Procedure |
-0.279415 | initial | ||
5.83029 | -0.437567 | search | |
6.16971 | -0.113236 | search | |
5.76 | -0.499642 | search | |
6.24 | -0.0431719 | search | |
5.66059 | -0.583146 | search | |
6.33941 | 0.0561963 | search | |
Looking for a zero in the interval [5.6606, 6.3394] | |||
6.27974 | -0.00344052 | interpolation | |
6.28319 | 1.70244e-006 | interpolation | |
6.28319 | -3.35667e-012 | interpolation | |
6.28319 | -2.44921e-016 | interpolation | |
6.28319 | 2.41961e-015 | interpolation | |
ans = 6.28318530717959 | |||
>> 2*pi | |||
ans = 6.28318530717959 |
Заметим, что в случае двух переменных существенную помощь для выбора начального приближения может оказать функция gradient (cм. 8.2) и contour(...), которая будет рассмотрена при ознакомлении с функциями графики.