我在使用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);
但是此操作返回初始函数不变。 有没有人知道如何进行替换?谢谢!
答案 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)
但一般来说,替换一个程序的主体可能要困难得多。 eval
不algsubs
都不起作用,而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)
,则会在此处获得相同的结果。因此,您可以通过使用表达式而不是过程来获得,在这种情况下,您可以选择更多的替代方法。