Maple中的序列[无法执行]

时间:2013-11-15 15:49:33

标签: methods sequence maple simplex

我一直致力于使用Revised Simplex方法解决任何最大化LPP的程序。我有一个问题,因为我正在尝试输入一个序列来解决非基本变量的问题。 我的代码如下:

matmax:=proc(tableau,basic)
local pivot,T,nbv,n,m,b;
T:=evalm(tableau);
n:=coldim(T); m:=rowdim(T);
b:=evalm(basic);
print(evalm(T));
nbv:={seq(i,i=2..n-1)}minus{seq(b[i],i=1..m)};
pivot:=getpiv(T,nbv);
while not pivot=FAIL do
b[pivot[1]]:=pivot[2];
T:=evalm(gauss(col(T,pivot[2]),pivot[1])&*T);
print(evalm(T));
nbv:={seq(i,i=2,..n-1)}minus{seq(b[i],i=1..m)};
pivot:=getpiv(T,nbv);
od;
[evalm(T),evalm(b)];
end;

高斯和getpiv命令是为此程序编写的程序,这些工作正常。但是,在执行此过程时,Maple返回消息“Error,(在matmax中)无法执行seq”如果有人可以就如何解决此问题给我任何帮助,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果在调用linalg之前尚未加载matxmax包,则coldim之类的命令将简化不起作用,并且不会为n和{{生成整数结果1}}在m调用的范围内使用时所期望的。我相信这就是您发生seq错误的原因,因为seqn没有像您期望的那样被分配整数中间结果。

您可以尝试通过在使用m调用matmax之前加载包来解决此问题。但这并不是那么强大,而且有些情况可能无法奏效。 with(linalg)命令在程序体内不起作用,因此你不能把它放在proc with的defn中。

您可以在matmax上面的matmax插入一行,比如local声明行,例如,

uses linalg;

这会使coldim和来自linalg广告的朋友工作。很遗憾,您已将名称pivot用作本地变量,并且与pivot包中的linalg导出冲突。所以通过uses进行的简单修复还不够。你可以使用除pivot之外的其他名称,以及那个简单的uses行,当然。

我自己的偏好是让所有内容都完全明确,以便稍后您或其他任何阅读代码的人都可以更清楚地理解它,即使它更长。因此,我会使用linalg[coldim]代替coldim,依此类推linalgmatmax包中的其他导出用途。

说完以上所有内容后,您应该知道现代Maple中不推荐使用linalg软件包,而LinearAlgebra是提供您似乎正在使用的功能的新软件包。命令名称较长,但使用较新的包意味着您不需要所有evalm次调用(或任何类似的调用)。

答案 1 :(得分:-1)

问题可能在于你的gauss和getpiv命令,因为它们可能无法用于你的程序,你能扩展他们的工作吗?