当前位置: 首页 > 知识库问答 >
问题:

非线性常微分方程求解器

范飞翰
2023-03-14

我正在研究一个非线性微分方程求解器。我能得到一般的解决方案,但不能得到具体的解决方案。当我试图找到集成常量时,我得到了错误: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定义为非列表?

共有2个答案

柴砚文
2023-03-14

问题是你用了

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 ⎦
华温书
2023-03-14

函数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}]
 类似资料:
  • 问题内容: 我有三个未知数4非线性方程,和我想要解决。等式的形式为: …其中,和是取决于四个方程式中每个值的常数。 解决此问题的最佳方法是什么? 问题答案: 有两种方法可以做到这一点。 使用非线性求解器 线性化问题并以最小二乘法解决 设定 因此,据我所知,您知道在4个不同点处的F,a,b和c,并且想要对模型参数X,Y和Z求逆。我们有3个未知数和4个观测数据点,因此这个问题太确定了。因此,我们将在最

  • 我正试图找到一个用Python解决一个非线性超定系统的好方法。我在这里查看了优化工具http://docs.cipy.org/doc/scipy/reference/optimize.nonlin.html,但我不知道如何使用它们。到目前为止我所掌握的是 你能帮我一下吗?

  • 我试图用Scipy的fsolve找到两个非线性方程组的答案。这两个方程是: 在这种情况下,和是常量。基本目标是找到同时满足和的,。我知道,的初始猜测是和。下面是我的代码。 当我执行代码时,我总是遇到数学域错误。但是,如果我尝试使用MAPLE解决它。我可以得到答案。 通过将这些插入方程,我得到,这表明答案是正确的。我不知道如何让西皮解决问题。任何建议将不胜感激。

  • 我正在用pyomo编程求解非线性优化问题(使用ipopt求解器)。稍后,我想在模型中添加随机元素。我知道在Pyomo中,可以使用复数形式来处理随机规划,但复数形式只能处理线性规划、混合整数规划和二次规划。 一般非线性随机规划问题有求解器吗?如果没有,我们如何使用现有的求解器来处理它?

  • 我有一个由12个非线性方程组成的系统,如下所示: 我知道系统有一个解决方案,因为在这种情况下,当我打印eq列表时,所有条目的计算结果都为零(即最小化)。 但是,使用以下实现的方法解决系统不适用于我 我收到一条错误信息 我尝试过改变的参数,但没有效果。有人能帮我解决问题吗,这样求解者就能找到我正在寻找的解决方案?干杯。

  • 问题内容: 我想用三个或更多变量求解线性方程。python中有一个好的库吗? 问题答案: 参见http://sympy.org/和http://numpy.scipy.org/。 具体来说,http://docs.scipy.org/doc/numpy/reference/routines.linalg.html 和http://docs.sympy.org/0.7.0/tutorial.html