我正在研究非线性微分方程求解器。我可以使用一般解决方案,但不能使用特定解决方案。当我尝试查找积分常量时,出现错误:E_x不可调用,并且我的解决方案被分类为列表,因此我无法将任何内容替换为列表。
这是我的代码:
j, u, eps, V_0, d = sympy.symbols("j, u, eps, V_0, d")
E = sympy.Function("E_x") (x) #set up symbolic solver
Vi = sympy.Derivative(E)
ode = E*Vi+j/(u*eps) #define the differential equation
E_sol = sympy.dsolve(ode) #solve
print(E_sol) #print general solution
ics = {E(0):0}
C_eq = E_sol.subs(x,0).subs(ics)
C_ = sympy.solve(C_eq)
我收到可调用错误ics = {E(0):0}
和列表错误C_eq = E_sol.subs(x,0).subs(ics)
我的书中的示例(数字Python)解决了线性ODE,但未收到此错误。有没有其他方法可以解决非线性DE或将E定义为可调用的,将E_sol定义为不是列表的?]
一个函数f
可以像在f(x)
中那样被调用,但是您不能像在f(x)(1)
中那样被调用一个函数-您需要使用subs。另外,Python列表不理解subs
,但列表中的内容可以理解。因此,您要么必须遍历列表,然后在了解替换的列表元素上进行替换或,则可以将列表转换为可以理解替换的SymPy容器,例如
>>> [x, 1/x].subs(x, 2) # no
>>> L = [x, 1/x]
>>> [i.subs(x, 2) for i in L] # yes
[2, 1/2]
>>> from sympy import Tuple
>>> Tuple(*L).subs(x, 2)
(2, 1/2)
因此,使用这两个想法并定义了x
,您的代码给出了
import sympy
x, j, u, eps, V_0, d = sympy.symbols("x, j, u, eps, V_0, d")
E = sympy.Function("E_x") (x) #set up symbolic solver
Vi = sympy.Derivative(E)
ode = E*Vi+j/(u*eps) #define the differential equation
E_sol = sympy.dsolve(ode) #solve
ics = {E.subs(x,0):0}
C_eq = [i.subs(x,0).subs(ics) for i in E_sol]
C_ = sympy.solve(C_eq)
>>> print(E_sol) #print general solution
[Eq(E_x(x), -sqrt(C1 - 2*j*x/(eps*u))), Eq(E_x(x), sqrt(C1 - 2*j*x/(eps*u)))]
>>> print(C_)
[{C1: 0}]