MATLAB:在symsum中使用最小函数

时间:2015-04-09 00:21:22

标签: matlab min symbolic-math

我正在尝试运行类似下面的代码,我用一个小得多的函数替换了我的函数,提供了一个最小的工作示例:

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功能。我想也许这个也可能带来问题。

1 个答案:

答案 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以询问此问题。