枫功能的子功能

时间:2014-05-14 10:27:02

标签: maple

我在使用maple中的subs函数时遇到了问题。这是我的问题。 我有一个功能。

  

psi:= x-> c1 * exp(sqrt(2 * m *(V0-E))/ hbar * x)+ c2 * exp(-sqrt(2 * m *(V0-E))/ HBAR * X);

现在我想让它更简单,我想替换sqrt(2*m*(V0-E))/hbar=k

  

潜艇(SQRT(2 * M *(V0-E))/ HBAR = k时,PSI);

但是此操作返回初始函数不变。 有没有人知道如何进行替换?谢谢!

1 个答案:

答案 0 :(得分:1)

如果您正在使用表达式而不是psi的过程,那么您可以使用algsubs命令完成该替换。即,

psiexpr := c1*exp(sqrt(2*m*(V0-E))/hbar*x)    
           + c2*exp(-sqrt(2*m*(V0-E))/hbar*x):

simplify(algsubs(sqrt(2*m*(V0-E))/hbar=k,psiexpr));

                      c1 exp(x k) + c2 exp(-x k)

但一般来说,替换一个程序的主体可能要困难得多。 evalalgsubs都不起作用,而subs可以替换为过程体,但在这里尝试它有两个问题。第一个问题是sqrt(2*m*(V0-E))/hbar在您的程序psi中不存在“自己”。即,

psi:=x->c1*exp(sqrt(2*m*(V0-E))/hbar*x)
        + c2*exp(-sqrt(2*m*(V0-E))/hbar*x):

subs(sqrt(2*m*(V0-E))/hbar=k,eval(psi)); # returns unchanged, the same as psi itself

第二个是,即使您尝试替换hbar=sqrt(2*m*(V0-E))/k,也不会有简化,因为替换只是语法。 (而且你甚至只想考虑如果hbar只出现在你的目标子表达式中。)即,

subs(hbar=sqrt(2*m*(V0-E))/k,eval(psi));

                                    1/2
                sqrt(2 m (V0 - E)) 2    k x
x -> c1 exp(1/2 ---------------------------)
                                  1/2
                      (m (V0 - E))

                                       1/2
                   sqrt(2 m (V0 - E)) 2    k x
     + c2 exp(-1/2 ---------------------------)
                                     1/2
                         (m (V0 - E))

如果您首先没有生成该过程psi,但是通过某些计算返回,那么您可以对其进行函数调用,替换,然后将结果转回到过程中。如果你真的更喜欢程序而不是表达。即,

unapply(simplify(algsubs(sqrt(2*m*(V0-E))/hbar=k,psi(x))),x);  

                    x -> c1 exp(x k) + c2 exp(-x k)

当然,如果您的原始程序主体很复杂(多行,或有条件等)并且您希望通过并通过语法替换,则上述操作将无效。

与您相关的是,虽然过程称为一个任意值,但表达式可以以任意值进行计算。如果您执行psi(3)eval(psiexpr,x=3),则会在此处获得相同的结果。因此,您可以通过使用表达式而不是过程来获得,在这种情况下,您可以选择更多的替代方法。