Нахождение нулей и экстремумов функций

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

function y=myf(x)

y=sin(x)-x.^2.*cos(x);

на интервале [-3 -1] будет найдено нулевое значение функции

>> x2=fzero(‘myf’, [-3 -1])

Zero found in the interval: [-3 -1].

x2 = -1.8539

На границах указываемого интервала функция должна принимать значения разных знаков, иначе выдается сообщение об ошибке.

В качестве исследуемой функции может выступать и встроенная математическая функция, например:

>> fzero(‘sin’, [2 4])

Zero found in the interval: [2 4].

ans = 3.1416

Кроме того, функцию можно задать при помощи указателя на нее:

>> x2=fzero(@myf, [-3 -1])

x2 = -1.8539

Допустимо использование inline-функции:

>> fun=inline(‘sin(x)-x.^2.*cos(x)’)

fun = Inline function:

fun(x) = sin(x)-x.^2.*cos(x)

>>x1=fzero(fun, -5)

x1 = -4.7566

>> fun(x1)

ans = 2.6645e-015

Допустимо использование анонимной функции:

>> fun=@(x) sin(x)-x.^2.*cos(x)

fun = @(x) sin(x)-x.^2.*cos(x)

>> x1=fzero(fun, -5)

x1 = -4.7566

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

>> fun=inline(‘x.^2’);

>> x=fzero(fun, -0.1)

Exiting fzero: aborting search for an interval containing a sign change

because NaN or Inf function value encountered during search.

(Function value at 1.37296e+154 is Inf.)

Check function or try again with a different starting value.

x = NaN

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

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

>> [x2, f] = fzero(@myf, -2)

x2 = -1.8539

f = -2.2204e-016

Обращение к функции fzero с тремя выходными аргументами позволяет выбрать дальнейшие действия в зависимости от значения третьего аргумента (в примере – это flag):

>> [x1, f1, flag] = fzero(fun, [-3 -1]);

Положительное значение flag свидетельствует об успешном завершении процесса. Отрицательное значение говорит о том, что не удалось определить интервал со сменой знака функции, либо в процессе вычислений получилось комплексное значение, бесконечность, или выполнена операция с неопределенным результатом, например, деление нуля на ноль.

Поиск локального минимума функции одной переменной на некотором интервале осуществляется при помощи fminbnd. Вначале необходимо создать файл-функцию, использовать inline или анонимную функцию. Например, при поиске локальных минимумов функции на отрезке [-1.5 1.5]:

function y=ftest(x)

y=exp(x.^2)+sin(3*pi.*x);

>> x2=fminbnd(@ftest, -0.5, 0)

x2 = -0.1629

Допустимо задать интервал поиска, содержащий все четыре точки локальных минимумов:

>> xx=fminbnd(@ftest, -1.5, 1.5)

xx =0.4861

Для одновременного вычисления значения функции в точке минимума следует вызвать fminbnd с двумя аргументами:

>> [x2, f]=fminbnd(@ftest, -0.5, 0)

x2 = -0.1629

f = 0.0275

Функция fminbnd может быть вызвана с тремя выходными аргументами:

>> [x2, f, flag]=fminbnd(@ftest, -0.5, 0);

Аргумент flag может принимать три значения: положительное – при нахождении локального минимума, нулевое – при достижении максимального количества вызовов исследуемой функции и отрицательное – в случае расходимости вычислительного процесса.

Найти минимум можно и с помощью fminsearch, требующей указания начального приближения для искомой точки. Например:

>> x2=fminsearch(@ftest, -0.5)

x2 = -0.1629

Для определения точек локального максимума нет специальной функции, поскольку достаточно искать минимум функции с обратным знаком.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: