The fzero
функция пытается найти корень из одного уравнения с одной переменной. Можно вызвать эту функцию с помощью либо одноэлементной начальной точки, либо двухэлементного вектора, который обозначает начальный интервал. Если вы дадите fzero
а начальная точка x0
, fzero
сначала ищет интервал вокруг этой точки, где функция изменяет знак. Если интервал найден, fzero
возвращает значение вблизи, где функция изменяет знак. Если такой интервал не найден, fzero
возвращает NaN
. Кроме того, если вы знаете две точки, где значение функции отличается знаком, можно задать этот начальный интервал с помощью двухэлементного вектора; fzero
гарантированно сужает интервал и возвращает значение около изменения знака.
Следующие разделы содержат два примера, которые иллюстрируют, как найти нуль функции с помощью начального интервала и начальной точки. В примерах используется функция humps.m
, который поставляется с MATLAB ®. Следующий рисунок показывает график humps
.
x = -1:.01:2; y = humps(x); plot(x,y) xlabel('x'); ylabel('humps(x)') grid on
fzero
Можно управлять несколькими аспектами fzero
функция путем установки опций. Вы настраиваете опции используя optimset
. Опции включают:
Выбор величины отображения fzero
generates - см. «Установка опций оптимизации», «Использование начального интервала» и «Использование начальной точки».
Выбор различных допусков, которые управляют тем, как fzero
определяет его в корне - см. «Задать опции оптимизации».
Выбор функции построения графика для наблюдения прогресса fzero
к корню - см. Оптимизация Решателя Функций построения графика.
Использование пользовательской запрограммированной выходной функции для наблюдения прогресса fzero
в направлении корня - см. «Выходные функции решателя оптимизации».
Область графика humps
указывает, что функция отрицательная на x = -1
и положительный при x = 1
. Подтвердить это можно путем вычисления humps
в этих двух точках.
humps(1)
ans = 16
humps(-1)
ans = -5.1378
Следовательно, можно использовать [-1 1]
как начальный интервал для fzero
.
Итерационный алгоритм для fzero
находит меньшие и меньшие подынтервалы [-1 1]
. Для каждого подынтервала - знак humps
отличается в двух конечных точках. Когда конечные точки подынтервалов становятся все ближе и ближе, они сходятся к нулю для humps
.
Чтобы показать прогресс fzero
при каждой итерации устанавливайте Display
опция для iter
использование optimset
функция.
options = optimset('Display','iter');
Затем позвоните fzero
следующим образом:
a = fzero(@humps,[-1 1],options)
Func-count x f(x) Procedure 2 -1 -5.13779 initial 3 -0.513876 -4.02235 interpolation 4 -0.513876 -4.02235 bisection 5 -0.473635 -3.83767 interpolation 6 -0.115287 0.414441 bisection 7 -0.115287 0.414441 interpolation 8 -0.132562 -0.0226907 interpolation 9 -0.131666 -0.0011492 interpolation 10 -0.131618 1.88371e-07 interpolation 11 -0.131618 -2.7935e-11 interpolation 12 -0.131618 8.88178e-16 interpolation 13 -0.131618 8.88178e-16 interpolation Zero found in the interval [-1, 1]
a = -0.1316
Каждое значение x
представляет лучшую конечную точку на данный момент. The Procedure
столбец сообщает, использует ли каждый шаг алгоритма бисекцию или интерполяцию.
Можно проверить, что значение функции в a
близок к нулю путем ввода
humps(a)
ans = 8.8818e-16
Предположим, что вы не знаете двух точек, в которых значения функции humps
отличаются знаком. В этом случае можно выбрать скаляр x0
в качестве начальной точки для fzero
. fzero
сначала ищет интервал вокруг этой точки, на котором функция изменяет знак. Если fzero
находит такой интервал, он переходит к алгоритму, описанному в предыдущем разделе. Если такой интервал не найден, fzero
возвращает NaN
.
Для примера установите начальную точку равной -0.2
, а Display
опция для Iter
, и звоните fzero
:
options = optimset('Display','iter'); a = fzero(@humps,-0.2,options)
Search for an interval around -0.2 containing a sign change: Func-count a f(a) b f(b) Procedure 1 -0.2 -1.35385 -0.2 -1.35385 initial interval 3 -0.194343 -1.26077 -0.205657 -1.44411 search 5 -0.192 -1.22137 -0.208 -1.4807 search 7 -0.188686 -1.16477 -0.211314 -1.53167 search 9 -0.184 -1.08293 -0.216 -1.60224 search 11 -0.177373 -0.963455 -0.222627 -1.69911 search 13 -0.168 -0.786636 -0.232 -1.83055 search 15 -0.154745 -0.51962 -0.245255 -2.00602 search 17 -0.136 -0.104165 -0.264 -2.23521 search 18 -0.10949 0.572246 -0.264 -2.23521 search Search for a zero in the interval [-0.10949, -0.264]: Func-count x f(x) Procedure 18 -0.10949 0.572246 initial 19 -0.140984 -0.219277 interpolation 20 -0.132259 -0.0154224 interpolation 21 -0.131617 3.40729e-05 interpolation 22 -0.131618 -6.79505e-08 interpolation 23 -0.131618 -2.98428e-13 interpolation 24 -0.131618 8.88178e-16 interpolation 25 -0.131618 8.88178e-16 interpolation Zero found in the interval [-0.10949, -0.264]
a = -0.1316
Конечные точки текущего подынтервала при каждой итерации перечислены под заголовками a
и b
, в то время как соответствующие значения humps
конечные точки перечислены в разделе f(a)
и f(b)
, соответственно.
Примечание: Конечные точки a
и b
не указаны в каком-либо конкретном порядке: a
может быть больше b
или менее b
.
Для первых девяти шагов, знак humps
отрицательно на обеих конечных точках текущего подынтервала, что показано на выходе. На десятом шаге знак humps
положительно на a
, -0.10949
, но отрицательно на b
, -0.264
. С этого момента алгоритм продолжает сужать интервал [-0.10949 -0.264]
, как описано в предыдущем разделе, пока оно не достигает значения -0.1316
.