我有一个齐次二阶 ODE,其通解是
ur(r) = C1*u1(r) + C2*u2(r)
。
如何通过分别设置
u1(r)
和 u2(r)
来获得 (C1=1, C2=0)
和 (C1=0, C2=1)
作为单独的函数?
这是我尝试过的(以及其他变体)
import IPython.display as disp
import sympy as sym
sym.init_printing(latex_mode='equation')
r = sym.symbols('r', real=True, positive=True)
ur = sym.Function('ur', real=True)
def Naxp(ur):
return r**2 * sym.diff(ur(r), r, 2) + r * sym.diff(ur(r), r) - ur(r)
Naxp_ur = Naxp(ur)
EqNaxpur = sym.Eq(Naxp_ur)
#print('Radial ODE:')
#display(Naxp_ur)
ur_sol = sym.dsolve(Naxp_ur, ur(r))
ur_sol1 = ur_sol.rhs
#display(sym.Eq(ur(r), ur_sol1))
# I still have to find how to extract the two basis functions
#u1 = sym.Function('u1', real=True)
C1, C2 = sym.symbols('C1, C2', real=True)
u1 = ur_sol1.subs([(C1, 1), (C2, 0)])
print(u1)
我总是得到一个结果,就好像
subs
被忽略了
C1/r + C2*r
Sympy 无法识别它生成的常量与您生成的常量之间的相等性。这似乎是由于用
real=True
设置了常量。删除它,代码就可以工作了。
C1, C2 = sym.symbols("C1 C2")
print(ur_sol1.subs({C1:1, C2:0})) # 1/r
print(ur_sol1.subs({C1:0, C2:1})) # r
可能有一种方法可以提取常量并避免自己定义它们,但我不确定最好的方法。它可能涉及
ur_sol1.free_symbols
,但这也会返回 r
。
此外,您可能需要考虑设置 ODE 的初始条件以获得特定的解决方案。