Matlab的潜艇不计算符号贝塞尔函数
问题描述:
我经历了一个奇怪的现象在Matlab与功能subs
和内置besselj
:Matlab的潜艇不计算符号贝塞尔函数
syms x
f = besselj(1,x)
subs(f,1)
回报
besselj(1, 1)
即使文档指出
“
subs(s,new)
”返回的副本用新的替换s
中所有出现的默认变量,然后评估s
。
默认变量由symvar定义。
所以我期望subs(f,1)
的输出为0.4401
。 eval(subs(f,1))
产生0.4401
的正确输出。有谁知道这是为什么?
答
我觉得你试图定义一个anonymous function,你不需要subs
或eval
在这里,只需使用f
作为一个实际的功能...
% No need to use symbolic math toolbox for x or f
f = @(x) besselj(1,x); % Define f as an anonymous function of x
f(1) % Evaulate f at a given point, say x = 1
>> ans = 0.4401
附注:如果出于某种原因,你真的设置使用符号变量(他们似乎在这里矫枉过正),那么你可能只想使用eval
函数和符号函数句柄,而不是subs
。
syms f(x) % Defines f as a symfun and x as a sym variable
f(x) = besselj(1,x); % Define the function
eval(f(1)) % Evaluate at x=1
>> ans = 0.4401
在回答你关于为什么使用subs(f, 1)
时subs
不“评估”的答案的问题...这可能是因为besselj
函数的性质。因为你使用的是symvars,所以你正在使用符号数学包的besselj
函数(与核心包函数相反)。
这意味着,当使用subs
符号表达式被显示给命令窗口,以同样的方式,任何其它符号表达式被显示,而不需要进行评估 - 即,它们可以是简化但不运行其他功能。
这就是为什么您需要运行eval
,到评估的简化符号表达式。
感谢您的回答!我正在使用符号变量,因为我让Matlab为我获得它们的衍生物。感谢您指出我实际上可以使用符号函数句柄。 – TheodorBecker
不用担心,很高兴这回答了你的问题:) – Wolfie