python - 非线性 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 不是列表?
解决方案
问题是你用过
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 ⎦
推荐阅读
- c - MSVC 错误 LNK2001:未解析的外部符号
- ios - iOS 上的 react-native-share 无法读取未定义的属性“FACEBOOK”
- sql - 将事实表连接到维度并为每个连接创建新行
- python - QWizard 取消注册已注册的字段
- angular - 平移管道在角度材料对话框中不起作用
- python - 我正在编写我的第一个 Gui 游戏并且遇到了一些小部件问题
- node.js - 部署后从简单的 Node.js Express 应用程序中获取
- json - 如何在 Hashicorp Nomad 中连接前端应用程序和数据库应用程序?
- c# - 在 C# 中获取当月第一周的日期列表
- sonarqube - 是否有 PMD/Checkstyle/Findbugs 到 Sonar 规则映射?