我从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可能有点奇怪,因为在集成时会获得绝对值。这可能是相关的。
答案 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=-1
和x=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)