0

我一直在研究一个程序来解决使用修正单纯形法的任何最大化 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;

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

4

2 回答 2

0

linalg如果您在调用您的matxmaxthen 命令之前没有加载包,那么coldim将简化不起作用并且不会产生整数结果,n并且m在使用调用范围内的结果时是预期的seq。我相信这就是您seq发生错误的原因,因为nm没有像您期望的那样被分配整数中间结果。

您可以尝试通过在调用之前加载包来解决此问题matmax,使用with(linalg). 但这并不是那么强大,并且在某些情况下它可能不起作用。该with命令在过程主体中不起作用,因此您不能将其放在 proc 的 defn 中matmax

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

uses linalg;

这将使包装中coldim的朋友们发挥作用。linalg不幸的是,您将该名称pivot用作局部变量,这与pivot从 package.json 中的导出冲突linalg。所以这个简单的修复通过uses是不够的。pivot当然,您可以使用除, 和那条简单的uses行之外的其他名称。

我自己的偏好是将所有内容都完全明确,以便以后您或其他阅读代码的人可以更清楚地理解它,即使它更长。所以我会使用linalg[coldim]而不是coldim, 以此类推来linalg用于matmax.

说了以上所有内容,您应该知道该linalg软件包在现代 Maple 中已被弃用,这LinearAlgebra是提供您似乎正在使用的功能的新软件包。命令名称更长,但使用较新的包意味着您不需要所有这些evalm调用(或类似的调用)。

于 2013-11-16T23:24:40.753 回答
-1

问题可能在于您的 gauss 和 getpiv 命令,因为它们可能无法与您的程序一起使用,您能否详细说明它们的作用?

于 2013-11-18T11:39:50.047 回答