将MATLAB重写为Maple

时间:2016-07-27 20:47:48

标签: matlab maple

我有一个小的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

给定符号向量psi由z的函数组成,它创建一个下三角符号矩阵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;

" diff"中有些含糊不清的东西我只选择功能定义。如果我让它输出f(4,4),它会报告

Error, (in f) too many levels of recursion

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

有人可以说出错的是什么吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您的代码非常接近(并提醒我这两种语言有时相似)。出现错误消息的原因是您需要在开始填充值之前声明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添加值时增加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; 的数据结构。在这里,我们从1x1 Array开始,并为其添加值。

()

在这里,您会注意到我们在创建时正在使用数组索引的[]表示法。如果使用Array进行存储,这是一种允许您在添加值时增大Array的技术。

现在,在这两种情况下,您还可以注意到我已使用:索引已存在的字词;方括号是Maple中用于指定数据结构中索引的默认表示法。

另请注意,我已使用f运算符抑制了每个循环中的输出;通过这种方式,您可以在最后回显生成的矩阵apt-get update