我正在尝试运行类似下面的代码,我用一个小得多的函数替换了我的函数,提供了一个最小的工作示例:
clear
syms k m
n=2;
symsum(symsum(k*m,m,0,min(k,n-k)),k,0,n)
我收到以下错误消息:
"使用sym / min时出错(第86行) 输入参数必须可转换为浮点数。"
我认为这意味着min函数不能与符号参数一起使用。但是,我希望MATLAB能够通过迭代k=0:n
替换实际数字。
有没有办法让它发挥作用?任何帮助非常感谢。到目前为止,我发现最相关的页面是here,但我有点犹豫,因为我发现很难理解这个功能的作用。
编辑@horchler之后,我把它放在各个地方试图让它工作,并且这个做了:
clear
syms k m
n=2;
symsum(symsum(k*m,m,0,feval(symengine, 'min', k,n-k)),k,0,n)
因为我并不真正理解这个feval
函数,所以我很想知道是否有更好的,可能更常用的解决方案。虽然它是一个不同的功能,但是有许多在线建议反对eval
功能。我想也许这个也可能带来问题。
答案 0 :(得分:0)
我同意Matlab应该能够像你期望的那样解决这个问题,即使文档清楚它不会。
为什么会出现问题
问题是由于内部符号求和,min
函数本身首先被评估:
symsum(k*m,m,0,min(k,n-k))
在这种情况下,sym/min
的输入参数不是"可转换为浮点数"因为k
是一个符号变量。只有在你将上面的另一个符号总和包裹起来k
变得明确定义并且可以想象地简化为数字之后,内部表达式才会产生错误,所以它太晚了。
我认为sym/min
返回错误是一个糟糕的选择。相反,它应该回归自己。这是sym/int函数在无法用符号或数字方式评估积分时所执行的操作。 MuPAD(见下文)和Mathematica 10也做了类似的事情以及他们的最小功能。
关于解决方法
这直接调用了MuPAD的min
功能。在MathWorks的this article中更详细地讨论了从Matlab调用MuPAD函数。
如果您愿意,可以将其包装在函数或匿名函数中,以使其称为更清晰,例如:
symmin = @(x,y)feval(symengine,'min',x,y);
然后,你的代码就是:
syms k m
n = 2;
symsum(symsum(k*m,m,0,symmin(k,n-k)),k,0,n)
如果您在符号数学工具箱中查看sym/min
的代码(在命令窗口中输入edit sym/min
),您会发现它基于不同的功能:symobj::maxmin
。除了性能原因之外,我不知道它为什么不打电话给MuPAD min
。您可以考虑向The MathWorks提交service request以询问此问题。