如何使用 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⎜─────────⎟ - ───⎟
              ⎝    ⎝    α    ⎠    α ⎠