Расман уже дал вам одно решение вашей проблемы, но я подумал, что объясню более подробно, почему вы получаете свою ошибку, и дам вам другое возможное решение.
Во-первых,рассмотрим эту анонимную функцию из вашего кода:
fcn1 = @(x) besselj(0,x);
Эта функция принимает один входной аргумент x
и передает его функции BESSELJ для оценки и возврата в качестве вывода. FZERO не имеет проблем с использованием этой функции.
Теперь рассмотрим эту другую анонимную функцию из вашего кода, в качестве выражения которой используется символическое уравнение DELTA_xi
, созданное с использованием символической переменной 'x'
:
fcn2 = @(x) DELTA_xi;
Эта функция принимает входной аргумент x
, но что делать с этим входным аргументом?MATLAB автоматически не знает, подключить ли входную переменную x
к символической переменной 'x'
в DELTA_xi
, поэтому, когда эта функция оценивается FZERO, она просто возвращает символическое уравнение DELTA_xi
(которое FZERO не можетиспользуйте, как указано в появившейся ошибке).
Использование функции EVAL , как в Решение Расмана оценит DELTA_xi
, используя доступное значение для x
перешел от FZERO к анонимной функции, решая вашу проблему.Однако другое решение состоит в том, чтобы использовать функцию SUBS следующим образом:
fzero(@(x) subs(DELTA_xi,'x',x), 3.5)
, которая будет заменять входное значение x
для каждого вхождения символической переменной 'x'
в DELTA_xi
, по существу делает то же самое, что и EVAL, но явно указывает, какую символическую переменную заменяет входной аргумент.Различия?Обратите внимание, что это будет работать:
fzero(@(y) subs(DELTA_xi,'x',y), 3.5)
Но это не будет:
fzero(@(y) eval(DELTA_xi), 3.5)
Поскольку имя входной переменной и символическая переменная не совпадают.