Разница между fzero и fsolve для одной переменной - PullRequest
7 голосов
/ 01 мая 2011

Есть ли разница между использованием fzero и fsolve для уравнения с одной переменной?

Ответы [ 2 ]

20 голосов
/ 01 мая 2011

Да, есть.Я просто упомяну самую прямую разницу между ними:

fsolve можно использовать для определения нуля уравнения с одной переменной.Однако fzero найдет ноль тогда и только тогда, когда функция пересекает ось X.

Вот простой пример: рассмотрим функциюf=x^2.Функция неотрицательна для всех действительных значений x.Это имеет корень в x=0.Мы определим анонимную функцию как f=@(x)x.^2; и попытаемся найти корень, используя оба метода.

Используя fsolve

options=optimset('MaxIter',1e3,'TolFun',1e-10);
fsolve(f,0.1,options)


Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the selected value of the function tolerance, and
the problem appears regular as measured by the gradient.

<stopping criteria details>


ans =

   1.9532e-04

Не ноль, но близко.

Использование fzero

fzero(f,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.

ans =

   NaN

Он не может найти ноль.

Рассмотрим еще один пример с функцией f=@(x)x.^3;, которая пересекает ось X и имеет корень в x=0.

fsolve(f,0.1)

ans =

    0.0444

fzero(f,0.1)

ans =

  -1.2612e-16

fsolve не возвращает точно 0в этом случае тоже.Даже использование options, которое я определил выше, только приводит меня к 0.0017 с fsolve.Тем не менее, ответ fzero является правильным с точностью до машины !.Разница в ответах не из-за неэффективных алгоритмов.Это потому, что их цели разные .

fzero имеет четкую цель: найти ноль!Просто.Никаких двусмысленностей нет.Если он пересекает ось X, там равен нулю, и он найдет его (только реальное).Если он не пересекает, он ноет.

Однако область действия fsolve шире.Он предназначен для решения системы нелинейных уравнений.Часто вы не можете найти точное решение этих уравнений, и вам придется установить уровень допуска, в рамках которого вы готовы принять решение в качестве ответа.В результате, существует множество опций и допусков, которые необходимо установить вручную, чтобы получить точный корень.Конечно, у вас есть более тонкий контроль, но для нахождения нуля одного уравнения var, я считаю это боль.Я бы, вероятно, использовал fzero в этом случае (при условии, что он пересекает ось X).

Помимо этого основного различия, есть различия в реализациях и используемых алгоритмах.Для этого я отошлю вас к онлайн-документации по функциям (см. Ссылки выше).

8 голосов
/ 01 мая 2011

Хотя мне нравится ответ, данный Йодой, я просто добавлю несколько пунктов. Да, между этими двумя функциями есть разница, поскольку они имеют разные базовые алгоритмы. Должна быть разница. Так что вам нужно понять алгоритмы! Это верно для любого сравнения между различными инструментами в Matlab, оба из которых должны дать решение.

Вы можете думать о fzero как о сложной версии деления пополам. Если вы дадите алгоритму деления пополам две конечные точки интервала, которые заключают в корень корень функции f (x), он может выбрать среднюю точку этого интервала. Это позволяет подпрограмме сократить интервал пополам, поскольку теперь она ДОЛЖНА иметь новый интервал, содержащий корень из f (x). Выполните эту операцию несколько раз, и вы обязательно с уверенностью найдете решение, если ваша функция непрерывна.

Если fzero задается только одна отправная точка, то он пытается найти пару точек, которые заключают в корень. Как только он это делает, он следует схеме, описанной выше.

Как видите, такая схема будет очень хорошо работать в одном измерении. Однако его нельзя заставить работать в более чем одном измерении. Таким образом, fsolve не может использовать аналогичную схему. Вы можете думать о fsolve как о вариации метода Ньютона. Из начальной точки вычислите наклон вашей функции в этом месте. Если вы приблизите свою функцию прямой линией, где эта линия пересечет ноль?

Таким образом, по сути, fsolve использует схему, в которой вы аппроксимируете свою функцию локально, а затем используете это приближение для экстраполяции в новое место, где, как ожидается, решение находится вблизи этой точки. Затем повторяйте эту схему, пока не получите сходимость. Эта схема будет более легко распространена на задачи с большими измерениями, чем на fzero.

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

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