我一直致力于使用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”如果有人可以就如何解决此问题给我任何帮助,我们将不胜感激。
答案 0 :(得分:0)
如果在调用linalg
之前尚未加载matxmax
包,则coldim
之类的命令将简化不起作用,并且不会为n
和{{生成整数结果1}}在m
调用的范围内使用时所期望的。我相信这就是您发生seq
错误的原因,因为seq
和n
没有像您期望的那样被分配整数中间结果。
您可以尝试通过在使用m
调用matmax
之前加载包来解决此问题。但这并不是那么强大,而且有些情况可能无法奏效。 with(linalg)
命令在程序体内不起作用,因此你不能把它放在proc with
的defn中。
您可以在matmax
上面的matmax
插入一行,比如local
声明行,例如,
uses linalg;
这会使coldim
和来自linalg
广告的朋友工作。很遗憾,您已将名称pivot
用作本地变量,并且与pivot
包中的linalg
导出冲突。所以通过uses
进行的简单修复还不够。你可以使用除pivot
之外的其他名称,以及那个简单的uses
行,当然。
我自己的偏好是让所有内容都完全明确,以便稍后您或其他任何阅读代码的人都可以更清楚地理解它,即使它更长。因此,我会使用linalg[coldim]
代替coldim
,依此类推linalg
中matmax
包中的其他导出用途。
说完以上所有内容后,您应该知道现代Maple中不推荐使用linalg
软件包,而LinearAlgebra
是提供您似乎正在使用的功能的新软件包。命令名称较长,但使用较新的包意味着您不需要所有evalm
次调用(或任何类似的调用)。
答案 1 :(得分:-1)
问题可能在于你的gauss和getpiv命令,因为它们可能无法用于你的程序,你能扩展他们的工作吗?