将 MATLAB 重写为 Maple
rewrite MATLAB to 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
给定一个由 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;
"diff" 行有些不明确,我只是 select 函数定义。如果我让它输出 f(4,4),它会报告
Error, (in f) too many levels of recursion
但它确实打印了 f(4,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;
在这里您会注意到我们在创建数组索引时使用 ()
表示法。如果您使用数组进行存储,这是一种允许您在添加值时增大数组的技术。
现在在这两种情况下,您还可以注意到我使用了 []
来索引一个已经存在的术语;方括号是 Maple 中用于在数据结构中指定索引的默认符号。
另请注意,我使用 :
运算符抑制了每个循环中的输出;这样你就可以在最后回显结果矩阵 f
。
我有一个小的 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;
"diff" 行有些不明确,我只是 select 函数定义。如果我让它输出 f(4,4),它会报告
Error, (in f) too many levels of recursion
但它确实打印了 f(4,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;
在这里您会注意到我们在创建数组索引时使用 ()
表示法。如果您使用数组进行存储,这是一种允许您在添加值时增大数组的技术。
现在在这两种情况下,您还可以注意到我使用了 []
来索引一个已经存在的术语;方括号是 Maple 中用于在数据结构中指定索引的默认符号。
另请注意,我使用 :
运算符抑制了每个循环中的输出;这样你就可以在最后回显结果矩阵 f
。