我在Matlab中遇到了一个使用函数subs
和内置besselj
的奇怪行为:
syms x
f = besselj(1,x)
subs(f,1)
返回
besselj(1, 1)
即使文档说明
“
subs(s,new)
会返回s
的副本,将s
中所有出现的默认变量替换为新的,然后评估s
。
默认变量由symvar定义。
所以我希望subs(f,1)
的输出为0.4401
。 eval(subs(f,1))
生成0.4401
的正确输出。有谁知道为什么会这样?
答案 0 :(得分:2)
我觉得你在尝试定义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
函数和符号函数句柄而不是{{1} }。
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
时没有“评估”答案...这可能是因为subs(f, 1)
函数的性质。因为您使用的是symvars,所以您使用的是符号数学包的besselj
函数(而不是同名的核心包函数)。
这意味着当使用besselj
时,符号表达式将显示在命令窗口中,与显示任何其他符号表达式的方式相同,无需进行评估 - 即它们可以简化< / em>但不要运行其他功能。
这就是您需要运行subs
,评估简化符号表达式的原因。