【问题标题】:substituting numerical values in symbolic Maple Vector用符号 Maple Vector 替换数值
【发布时间】:2013-10-03 16:16:16
【问题描述】:

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

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

我希望能够通过将数值分配给向量“p”和“a”来评估向量“v”中的表达式生成后但是如果我定义向量“a” '和'p'如下:

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

我得到的结果是一个向量的值被重新分配但另一个向量的值没有被重新分配:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    您可以通过以下方式解决此问题。替换,

    v:=f[1];
    

    由,

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

    xearm 返回的第一个结果中的a[i]b[i] 似乎被索引到全局名称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]
    

    【讨论】:

      【解决方案2】:

      您是否完全确定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,以便它的行为与您描述的一样,但它们大多是做作的。例如,我可以在myProc 的主体内的p[5]p[2] 的实例周围放置两对非求值引号(两对左单引号)。

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

      %;
      

      ?

      如果在有问题的地方只发出命令,你会得到什么,

      p;
      

      ?

      如果在问题点发出命令,你会得到什么,

      map(eval,v);
      

      ?

      您是否可以随意提供指向myProc 来源的 URL?

      【讨论】:

      • link 的文件 pysub.zip 包含我正在使用的 Maple 代码(主文件是 xearm.mpl,它从 pysub.mpl、loadXearm.mpl、printvar 读取 procs。倍)。从工作表中,我读入 xearm.mpl 并执行“f:=xearm('verbose'=true, 'doUnsub'=false);”并分配“v:=f[1];”至于其他问题:“map(eval,v)”返回错误,“p”返回符号“p”(在我将其分配给数字向量之前),“%”返回确切的表达式“v [2]”确实如此。希望一切都有意义,感谢您的意见!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多