替换符号Maple向量中的数值

时间:2013-10-03 16:16:17

标签: variable-assignment linear-algebra symbolic-math maple

我下载了一个Maple proc,它返回一个Vector(比方说,v)表达式,其中每个单独的表达式都是带有符号条目的其他Vector(p,a)。例如:

> v := myProc();
> v[1];
p[2] + a[1]
> v[2];
p[5] + a[3] + sqrt(a[1])
...

我希望能够通过为Vector'p'和'a'分配数值来评估Vector'v'中生成后的表达式,但是如果我定义了Vector'a '和'p'如下:

a := Vector(3,1):  
p := Vector(5,2):

我得到一个结果,其中一个Vector的值被重新分配,但其他Vector的值不是:

> v[1]; 
p[2] + 1
> v[2];
p[5] + 1 + sqrt(1)

任何有关此问题性质的见解将不胜感激。我一直在浏览与此proc相对应的Maple文件,试图在Vector'v'返回表达式之前为'p'和'a'赋值,但这相对不成功,因为我对Maple相对较新,主过程中的众多子过程似乎最终需要符号向量来成功返回向量'v'。

2 个答案:

答案 0 :(得分:0)

您是否完全确定已将p成功分配为通话Vector(5,2)

对我来说,以下工作符合预期。

restart:

myProc:=proc()
           local w;
           w:=Vector(2);
           w[1]:=p[2] + a[1];
           w[2]:=p[5] + a[3] + sqrt(a[1]);
           return w;
        end proc:

v:=myProc():

v[1];
                             p[2] + a[1]

v[2];
                                         (1/2)
                       p[5] + a[3] + a[1]     

a:=Vector(3,1):
p:=Vector(5,2):

v[1];
                                  3

v[2];
                                  4

我可以想到一些棘手的方法来编写myProc,使其表现得像你描述的那样,但它们大多是非常人为的。例如,我可以在p[5]主体内p[2]myProc的实例周围放置两对无评价引号(两对单引号)。

如果在查询v[2]之后立即获得(并获得涉及p的未评估索引引用的意外输出),那么您将发出命令,

%;

如果在问题点上你只发出命令

,你会得到什么?
p;

如果在问题点发出命令

,你会得到什么?
map(eval,v);

您是否可以自由地提供myProc来源的网址?

答案 1 :(得分:0)

p[i]返回的第一个Vector条目中的xearm是所谓的转义本地人。因此,它们与全局p向量的条目具有不同的地址,这就是为什么它们无法按预期进行评估的原因。

你可以像下面这样解决这个问题。替换,

v:=f[1];

通过

v:=f[1];
v:=convert(v,`global`);

a[i]返回的第一个结果中的b[i]xearm似乎已被编入全局名称ab,而不是与p[i]具有相同的问题。

使用我之前回答的正确工作示例,这是一个有问题的版本,表现出类似的行为。

restart:

myProc:=proc()
       local w, p;
       w:=Vector(2);
       w[1]:=p[2] + a[1];
       w[2]:=p[5] + a[3] + sqrt(a[1]);
       return w;
    end proc:

v:=myProc():

v[1];
                             p[2] + a[1]

v[2];
                                         (1/2)
                       p[5] + a[3] + a[1]     

a:=Vector(3,1):
p:=Vector(5,2):

v[1];
                              p[2] + 1

v[2];
                              p[5] + 2

v:=convert(v,`global`):

v;
                                 [3]
                                 [ ]
                                 [4]