【问题标题】:rewrite MATLAB to Maple将 MATLAB 重写为 Maple
【发布时间】:2016-07-27 20:47:48
【问题描述】:

我有一个小的 MATLAB 符号脚本如下

syms z;
psi(2)=exp(2*z-exp(z))/(1-exp(-exp(z)));
psi(3)=exp(2*z-exp(z))/(1-exp(-exp(z)))*z;
psi(4)=exp(2*z-exp(z))/(1-exp(-exp(z)))*z^2;
f(1,1)=exp(2*z-exp(z))/(1-exp(-exp(z)));
for i=2:4
    f(i,1)=diff(psi(i),z);
    for j=2:i
        f(i,j)=diff(f(i,j-1)/f(j-1,j-1),z);
    end
end

给定一个由 z 的函数组成的符号向量 psi,它创建一个下三角符号矩阵 f。效果很好。

我正在尝试用 Maple 重写这部分,我是新手。我试过了

psi(2) := exp(2*z-exp(z))/(1-exp(-exp(z)));
psi(3) := exp(2*z-exp(z))*z/(1-exp(-exp(z)));
psi(4) := exp(2*z-exp(z))*z^2/(1-exp(-exp(z)));  
f(1, 1) := exp(2*z-exp(z))/(1-exp(-exp(z)));   
for i from 2 to 4 do f(i,1):=exp(2*z-exp(z))/(1-exp(-exp(z)));     
for j from 2 to i do f(i,j):=diff(f(i,j-1)/f(j-1,j-1),z);   
od;    
od;

“差异”行中有一些模棱两可的东西,我只是选择了函数定义。如果我让它输出 f(4,4),它会报告

Error, (in f) too many levels of recursion

但它确实打印了 f(4,1)。

有人能告诉我出了什么问题吗?谢谢!

【问题讨论】:

  • od 真的是你如何结束 Maple for 循环......?!您也许可以更改 Maple 中的最大递归深度,否则请尝试拆分为 4 个连续的 for 循环,每个循环一个 i,也许。
  • 您可以使用odend do 来终止Maple 中的循环。与fiend if 相同。就个人而言,我使用end 选项,但每个选项都有自己的。

标签: matlab maple


【解决方案1】:

您的代码非常接近(并且有时提醒我这两种语言有多么相似)。错误消息的原因是您需要在开始使用值填充之前声明f

这是一种可能的解决方案:

psi[2] := exp(2*z-exp(z))/(1-exp(-exp(z)));
psi[3] := exp(2*z-exp(z))*z/(1-exp(-exp(z)));
psi[4] := exp(2*z-exp(z))*z^2/(1-exp(-exp(z)));

f := Matrix(1..4,1..4):

f[1, 1] := exp(2*z-exp(z))/(1-exp(-exp(z))):   
for i from 2 to 4 do 
    f[i,1] := diff(psi[i],z):
    for j from 2 to i do 
        f[i,j] := diff(f[i,j-1]/f[j-1,j-1],z):   
    end do:  
end do:
f;

请注意,在开始填充之前,我将 f 声明为 4x4 Matrix。另外,这里使用[] 表示法来指定索引。

另一个可以更好地解决更大问题的选项是在向f 添加值时扩展您的数据结构。在这里,我们从 1x1 Array 开始并向其添加值。

psi[2] := exp(2*z-exp(z))/(1-exp(-exp(z)));
psi[3] := exp(2*z-exp(z))*z/(1-exp(-exp(z)));
psi[4] := exp(2*z-exp(z))*z^2/(1-exp(-exp(z)));  

f:=Array(1..1,1..1):

f(1, 1) := exp(2*z-exp(z))/(1-exp(-exp(z))):   
for i from 2 to 4 do 
    f(i,1):=diff(psi[i],z):
    for j from 2 to i do 
        f(i,j):=diff(f[i,j-1]/f[j-1,j-1],z):   
    end do:  
end do:
f;

您会注意到,我们在创建时使用() 表示法来表示数组索引。如果您使用 Array 进行存储,这是一种允许您在添加值时扩展 Array 的技术。

现在在这两种情况下,您还可以注意到我使用[] 来索引一个已经存在的术语;方括号是 Maple 中用于指定数据结构中的索引的默认符号。

还请注意,我使用: 运算符抑制了每个循环中的输出;这样你就可以在最后回显生成的矩阵f

【讨论】:

  • 非常感谢。有用。你是一位好老师。我学到了很多东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
相关资源
最近更新 更多