非线性ODE求解器

问题描述 投票:1回答:1

我正在研究非线性微分方程求解器。我可以使用一般解决方案,但不能使用特定解决方案。当我尝试查找积分常量时,出现错误: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定义为不是列表的?]

python sympy ode
1个回答
0
投票

一个函数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}]
© www.soinside.com 2019 - 2024. All rights reserved.