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
функция путем установки опций. Вы устанавливаете опции с помощью optimset
Опции включают:
Выбор суммы отображения fzero
генерирует — см. Опции Оптимизации Набора, Используя Стартовый Интервал, и Используя Начальную точку.
Выбор различных допусков то управление, как 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
представляет лучшую конечную точку до сих пор. 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
.