odeint没有给我期望

时间:2019-09-22 17:27:34

标签: python-2.x ode odeint

我从ODE开始,我有一个Python代码,该代码首先尝试使用odeint函数求解DOE,然后将该解决方案与您自己计算出的ODE的解决方案进行比较(必须将其插入到码)。但是它们并不完全一致。

我已经尝试过软件程序,而且看来我手动计算的解决方案还可以,所以我想知道为什么odeint函数不能提供我期望的结果。

import numpy as np
import matplotlib.pyplot as plt

# Define a function which calculates the derivative
def dy_dx(y,x):
    dydx = 2.0*x*(y-1)/(1-x**2) #
    return dydx

xs = np.linspace(-4,4,100) 

for i in range(-10,10,1):
    y0 = i
    ys = odeint(dy_dx, y0, xs) 
    ys = np.array(ys).flatten() 
    plt.plot(xs, ys);

# SECOND PART:

y_exact =  1+(y0)/(1-x**2) # manually computed solution

y_difference = ys - y_exact 
plt.subplot(2, 1, 1)
plt.plot(xs, ys, xs, y_exact, "--"); 
plt.title("Difference between exact solution and computed solution");

因此,我添加了“ range()部分”,以了解它在不同的初始条件下如何变化,但它们都沿x = -1轴

我手动找到的解决方案在那里有一个限制,但不仅是一行,您可以看到是运行第二部分还是访问https://www.symbolab.com/solver/ordinary-differential-equation-calculator/2x%5Cleft(y-1%5Cright)dx%2B%5Cleft(x%5E%7B2%7D-1%5Cright)dy%3D%200

我只是想知道错误在哪里,或者odeint为什么将其作为结果。difference between odeint and my solution

我还应该补充一点,ODE可能有点奇怪,因为在集成时会获得绝对值。这可能是相关的。

1 个答案:

答案 0 :(得分:1)

您的数值解的初始条件为y(-4)=y0,因为odeint将时间间隔的第一点作为初始时间。相应地,您必须将您的确切解决方案更改为

y_exact =  1+((y0-1)*(1-xs[0]**2))/(1-xs**2)

您可以使用自己选择的工具进行检查,例如WA y'(x)=2*x*(y(x)-1)/(1-x^2), y(a)=b

正如您还观察到的那样,您的ODE在x=-1x=1处是奇异的,因此任何解决方案仅具有由这些点创建的3个子间隔中的任何一个作为域的域,即包含初始时间。同样,数值方法也无法很好地接近奇点,因此对于一些较小但不太小的[-4, -1-delta],您必须将积分域限制为delta。或者,如果您真的想探索初始时间为0的中间间隔,则需要执行两次集成,一次从0-1+delta,一次从0到{ {1}}。


如果您考虑相关的微分方程而没有实际的奇点

1-delta

提供准确的解决方案

y'(x) = -2*x*(y-1)/(1+x^2),  y(x0) = y0

通过修改后的代码实现

y(x) = 1 + (y0-1)*(1+x0^2)/(1+x^2)

如果您找到(彩色的)数值解恰好位于(带底纹的灰色)精确解的中心,则会得到以下绘图。 enter image description here