如何使用 SymPy 重新排列变量
How to rearrange for a variable with SymPy
我有一个复杂的方程式,我想为变量重新排列 vz(t) = ...
。
SymPy 中最优雅的方式是什么?我已将上式确定为 ODE 的解:
import sympy as sym
sym.init_printing()
t,m,k,g,v0,psi = sym.symbols("t,m,k,g,v_0,psi")
vz = sym.Function('v_z')
eqn = sym.Eq(-k*vz(t)**2 - m*vz(t).diff(t) - m*g,0)
sol = sym.dsolve(eqn, ics = {vz(0): v0*sym.sin(psi)})
您给出的解法可以简化为涉及atan
的解法,然后重新排列。不过,需要对符号进行一些假设才能使重新排列成为可能。实际上,如果您将所有符号都设置为正数,那么您首先会从 dsolve
得到一个更简单的结果:
In [51]: import sympy as sym
...: sym.init_printing()
...: t,m,k,g,v0,psi = sym.symbols("t,m,k,g,v_0,psi", positive=True)
...:
...: vz = sym.Function('v_z', positive=True)
...:
...:
...: eqn = sym.Eq(-k*vz(t)**2 - m*vz(t).diff(t) - m*g,0)
...:
...: sol = sym.dsolve(eqn, ics = {vz(0): v0*sym.sin(psi)})
In [52]:
In [52]: sol
Out[52]:
⎛ ⎛ ⎛√k⋅v₀⋅sin(ψ)⎞⎞⎞
⎜ ⎜ atan⎜────────────⎟⎟⎟
⎜ ⎜ t ⎝ √g⋅√m ⎠⎟⎟
√g⋅√m⋅tan⎜√g⋅√k⋅⎜- ── + ──────────────────⎟⎟
⎝ ⎝ √m √g⋅√k ⎠⎠
v_z(t) = ────────────────────────────────────────────
√k
引入一个参数α = sqrt(m*g/k)
这就变成了:
In [65]: sol.subs(sqrt(k), sqrt(m)*sqrt(g)/alpha).expand()
Out[65]:
⎛ ⎛v₀⋅sin(ψ)⎞ g⋅t⎞
v_z(t) = α⋅tan⎜atan⎜─────────⎟ - ───⎟
⎝ ⎝ α ⎠ α ⎠
我有一个复杂的方程式,我想为变量重新排列 vz(t) = ...
。
SymPy 中最优雅的方式是什么?我已将上式确定为 ODE 的解:
import sympy as sym
sym.init_printing()
t,m,k,g,v0,psi = sym.symbols("t,m,k,g,v_0,psi")
vz = sym.Function('v_z')
eqn = sym.Eq(-k*vz(t)**2 - m*vz(t).diff(t) - m*g,0)
sol = sym.dsolve(eqn, ics = {vz(0): v0*sym.sin(psi)})
您给出的解法可以简化为涉及atan
的解法,然后重新排列。不过,需要对符号进行一些假设才能使重新排列成为可能。实际上,如果您将所有符号都设置为正数,那么您首先会从 dsolve
得到一个更简单的结果:
In [51]: import sympy as sym
...: sym.init_printing()
...: t,m,k,g,v0,psi = sym.symbols("t,m,k,g,v_0,psi", positive=True)
...:
...: vz = sym.Function('v_z', positive=True)
...:
...:
...: eqn = sym.Eq(-k*vz(t)**2 - m*vz(t).diff(t) - m*g,0)
...:
...: sol = sym.dsolve(eqn, ics = {vz(0): v0*sym.sin(psi)})
In [52]:
In [52]: sol
Out[52]:
⎛ ⎛ ⎛√k⋅v₀⋅sin(ψ)⎞⎞⎞
⎜ ⎜ atan⎜────────────⎟⎟⎟
⎜ ⎜ t ⎝ √g⋅√m ⎠⎟⎟
√g⋅√m⋅tan⎜√g⋅√k⋅⎜- ── + ──────────────────⎟⎟
⎝ ⎝ √m √g⋅√k ⎠⎠
v_z(t) = ────────────────────────────────────────────
√k
引入一个参数α = sqrt(m*g/k)
这就变成了:
In [65]: sol.subs(sqrt(k), sqrt(m)*sqrt(g)/alpha).expand()
Out[65]:
⎛ ⎛v₀⋅sin(ψ)⎞ g⋅t⎞
v_z(t) = α⋅tan⎜atan⎜─────────⎟ - ───⎟
⎝ ⎝ α ⎠ α ⎠