Разница между fzero и fsolve для одной переменной

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

2 ответа

Решение

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

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

Вот простой пример: рассмотрим функцию 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=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).

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

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

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

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

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

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

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

Другие вопросы по тегам