I have an ordinary differential equation like this:
JavaScript
x
2
1
DiffEq = Eq(-ℏ*ℏ*diff(Ψ,x,2)/(2*m) + m*w*w*(x*x)*Ψ/2 - E*Ψ , 0)
2
I want to perform a variable change :
JavaScript
1
3
1
sp.Eq(u , x*sqrt(m*w/ℏ))
2
sp.Eq(Ψ, H*exp(-u*u/2))
3
How can I do this with sympy?
Advertisement
Answer
Use the following function:
JavaScript
1
61
61
1
def variable_change(ODE,dependent_var,
2
independent_var,
3
new_dependent_var = None,
4
new_independent_var= None,
5
6
7
dependent_var_relation = None,
8
independent_var_relation = None,
9
order = 2):
10
11
12
13
14
15
if new_dependent_var == None:
16
new_dependent_var = dependent_var
17
if new_independent_var == None:
18
new_independent_var = independent_var
19
20
21
22
23
# dependent variable change
24
25
if new_independent_var != independent_var:
26
27
for i in range(order, -1, -1):
28
29
# remplace derivate
30
a = D(dependent_var , independent_var, i )
31
ξ = Function("ξ")(independent_var)
32
33
b = D( dependent_var.subs(independent_var, ξ), independent_var ,i)
34
35
rel = solve(independent_var_relation, new_independent_var)[0]
36
37
38
for j in range(order, 0, -1):
39
b = b.subs( D(ξ,independent_var,j), D(rel,independent_var,j))
40
41
b = b.subs(ξ, new_independent_var)
42
43
rel = solve(independent_var_relation, independent_var)[0]
44
b = b.subs(independent_var, rel)
45
46
47
ODE = ODE.subs(a,b)
48
49
ODE = ODE.subs(independent_var, rel)
50
51
52
# change of variables of indpendent variable
53
54
55
if new_dependent_var != dependent_var:
56
57
ODE = (ODE.subs(dependent_var.subs(independent_var,new_independent_var) , (solve(dependent_var_relation, dependent_var)[0])))
58
ODE = ODE.doit().expand()
59
60
return ODE.simplify()
61
For the example posted:
JavaScript
1
40
40
1
from sympy import *
2
from sympy import diff as D
3
4
E, ℏ ,w,m,x,u = symbols("E, ℏ , w,m,x,u")
5
Ψ ,H = map(Function, ["Ψ ","H"])
6
Ψ ,H = Ψ(x), H(u)
7
8
9
10
DiffEq = Eq(-ℏ*ℏ*D(Ψ,x,2)/(2*m) + m*w*w*(x*x)*Ψ/2 - E*Ψ,0)
11
display(DiffEq)
12
13
14
15
display(Eq(u , x*sqrt(m*w/ℏ)))
16
display(Eq(Ψ, H*exp(-u*u/2)))
17
18
19
newODE = variable_change(ODE = DiffEq,
20
21
22
independent_var = x,
23
new_independent_var= u,
24
independent_var_relation = Eq(u , x*sqrt(m*w/ℏ)),
25
dependent_var = Ψ,
26
27
28
new_dependent_var = H,
29
dependent_var_relation = Eq(Ψ, H*exp(-u*u/2)),
30
31
order = 2)
32
33
34
35
36
37
38
39
display(newODE)
40
Under this substitution the differential equation outputted is then:
JavaScript
1
2
1
Eq((-E*H + u*w*ℏ*D(H, u) + w*ℏ*H/2 - w*ℏ*D(H, (u, 2))/2)*exp(-u**2/2), 0)
2