Корни скалярных функций

Решение нелинейного уравнения в одной переменной

Функция 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. Опции включают:

Используя стартовый интервал

График 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 положителен в конечной точке, -0.10949, но отрицателен в конечной точке, -0.264. С этого момента алгоритм продолжает сужать интервал [-0.10949 -0.264], как описано в предыдущем разделе, пока это не достигает значения -0.1316.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте