首页 > 解决方案 > 非线性 ODE 求解器

问题描述

我正在研究非线性微分方程求解器。我能够得到一般的解决方案,但不是具体的解决方案。当我尝试查找积分常量时,我​​收到错误: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 不是列表?

标签: pythonsympyode

解决方案


问题是你用过

E = Function('E')(x)

以交互方式尝试:

In [12]: E = Function('E')                                                                                                                                    

In [13]: E                                                                                                                                                    
Out[13]: E

In [14]: E(x)                                                                                                                                                 
Out[14]: E(x)

In [20]: E(1)                                                                                                                                                 
Out[20]: E(1)

In [15]: E(x)(1)                                                                                                                                              
...
TypeError: 'E' object is not callable

In [16]: E = Function('E')(x)                                                                                                                                 

In [17]: E                                                                                                                                                    
Out[17]: E(x)

In [18]: E(1)                                                                                                                                                 
...
TypeError: 'E' object is not callable

通常最好先定义E = Function('E')然后E(x)在其余代码中使用。

dsolve可以为您处理初始条件,因此请记住:

import sympy

j, u, eps, V_0, d = sympy.symbols("j, u, eps, V_0, d")
E = sympy.Function("E")

ode = E(x)*E(x).diff(x) + j/(u*eps)    #define the differential equation

E_sol = sympy.dsolve(ode, ics={E(0):0})   #solve with initial conditions

print(E_sol) #print particular solution

这给了

In [25]: E_sol                                                                                                                                                
Out[25]: 
⎡               _______                _______⎤
⎢              ╱ -j⋅x                 ╱ -j⋅x  ⎥
⎢E(x) = -√2⋅  ╱  ───── , E(x) = √2⋅  ╱  ───── ⎥
⎣           ╲╱   eps⋅u             ╲╱   eps⋅u ⎦

推荐阅读