MATLAB:在 symsum 中使用最小函数

MATLAB: using a minimum function within symsum

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

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 函数。我想也许这个也有问题。

我同意 Matlab 应该能够按照您的预期解决这个问题,即使文档明确表示它不会。

为什么会出现这个问题
问题是由于内部符号求和和 min 函数本身首先被评估:

symsum(k*m,m,0,min(k,n-k))

在这种情况下,sym/min 的输入参数不是 "convertible to floating-point numbers",因为 k 是一个符号变量。只有在将上面的内容用另一个符号求和后,k 才变得明确定义并且可以想象地减少为数字,但内部表达式已经产生错误所以为时已晚。

我认为 sym/min 到 return 错误是一个糟糕的选择。相反,它应该只是 return 本身。这就是 sym/int function does when it can't evaluate an integral symbolically or numerically. MuPAD(见下文)和 Mathematica 10 也为它们的最小函数做类似的事情。

关于解决方法
这直接从 The MathWorks 调用 MuPAD 的 min function. Calling MuPAD functions from Matlab is discussed in more detail in this article

如果你愿意,你可以将它包装在一个函数或匿名函数中,使调用更清晰,例如:

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 的代码(在命令 Window 中键入 edit sym/min),您会发现它基于不同的函数:symobj::maxmin。我不知道为什么它不只是调用 MuPAD 的 min,也许除了性能原因。您可以考虑向 The MathWorks 提交 service request 来询问这个问题。