首页 文章

Maple中的序列[无法执行]

提问于
浏览
0

我一直致力于使用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;

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

2 回答

  • -1

    如果在调用 matxmax 之前尚未加载 linalg 包,那么像 coldim 这样的命令将简化不起作用,并且不会产生 nm 的整数结果,这些结果是在 seq 调用的范围内使用时所期望的 . 我相信这就是您出现 seq 错误的原因,因为 nm 未按预期分配整数中间结果 .

    您可以尝试通过在使用 with(linalg) 调用 matmax 之前加载包来解决此问题 . 但这并不是那么强大,而且有些情况可能无法奏效 . with 命令赢得了't work within a procedure body, so you can' t,将其置于proc matmax 的defn中 .

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

    uses linalg;
    

    这将使 coldim 和来自 linalg 包的朋友工作 . 不幸的是,您使用了名称 pivot 作为局部变量,并且与 linalg 包中的 pivot 导出冲突 . 所以通过 uses 的简单修复还不够 . 您可以使用除 pivot 之外的某个名称,以及那个简单的 uses 行,当然 .

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

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

  • 0

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

相关问题