2016-07-27 33 views
2

我有一个小MATLAB脚本符号如下重写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。它运作良好。

我想重写这部分在枫树,我是新来的。我试过

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)。

有人可以说出了什么问题吗?谢谢!

+0

是否认为你是如何结束Maple的for循环....?!你可能能够改变Maple中递归的最大深度,否则尝试分割成4个连续的for循环,也许每个循环都有一个for循环。 – David

+0

您可以使用'od'或'end do'来终止Maple中的循环。 'fi'和'end if'一样。就我个人而言,我使用'end'选项,但每个选项都是自己的。 – DSkoog

回答

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增加数据结构。在这里,我们从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; 

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

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

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

+0

非常感谢。有用。你是一位好老师。我学到了很多。 – user2792830