Использование fzero: неопределенная функция или метод isfinite для входных аргументов типа 'sym' - PullRequest
1 голос
/ 20 мая 2011

Я использую matlab для символических вычислений. После долгих вычислений у меня есть функция x, которая является комбинацией функций Бесселя, и я хочу найти ее нули.

Для этой цели я использую функцию fzero в Matlab. Но хотя он отлично работает для одиночных бесселевых функций, он не будет работать и для шахты. >> fzero(@(x)besselj(0,x), 3.5) ans = 2.4048</p> <p>>> fzero(@(x)DELTA_xi, 3.5) ??? Undefined function or method 'isfinite' for input arguments of type 'sym'.</p> <p>Error in ==> fzero at 333 elseif ~isfinite(fx) || ~isreal(fx)</p> <p>>> DELTA_xi besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)

Почему это происходит? Как решить проблему?

Заранее спасибо

Ответы [ 2 ]

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

Расман уже дал вам одно решение вашей проблемы, но я подумал, что объясню более подробно, почему вы получаете свою ошибку, и дам вам другое возможное решение.

Во-первых,рассмотрим эту анонимную функцию из вашего кода:

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)

Поскольку имя входной переменной и символическая переменная не совпадают.

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

Я думаю, вы ошиблись дескрипторами функций с символическим представлением.

fzero нужна ручка функции.

так что если вы делаете:

DELTA_xi = @(x) besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(1, x)*bessely(0, x) - besseli(1, (3*x)/10)*besselj(1, (3*x)/10)*besselk(0, x)*bessely(1, x) - besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(0, x)*besselk(1, x) + besseli(1, (3*x)/10)*bessely(1, (3*x)/10)*besselj(1, x)*besselk(0, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(0, x)*bessely(1, x) - besselj(1, (3*x)/10)*besselk(1, (3*x)/10)*besseli(1, x)*bessely(0, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(0, x)*besselj(1, x) + besselk(1, (3*x)/10)*bessely(1, (3*x)/10)*besseli(1, x)*besselj(0, x)
fzero(DELTA_xi, 3.5)

вы получите

3.8173

обратите внимание, что если вы хотите вызвать символическую функцию, вам придется сделать это косвенно:

fzero(@(x)eval(DELTA_xi), 3.5)
...