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 来询问这个问题。
我正在尝试 运行 类似于以下的代码,我用一个更小的函数替换了我的函数,以提供一个最小的工作示例:
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 来询问这个问题。