Да, есть.Я просто упомяну самую прямую разницу между ними:
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).
Помимо этого основного различия, есть различия в реализациях и используемых алгоритмах.Для этого я отошлю вас к онлайн-документации по функциям (см. Ссылки выше).