繁体   English   中英

python代码求解以下初值问题常微分方程在区间上使用欧拉法(o 10)

[英]python code to solve the following initial value problem ordinary differential equation using Euler method over the interval (o 10)

我有这个问题

编写 python 代码,使用欧拉法在区间 (o 10) 上以 10 个时间步长求解以下初值问题常微分方程。 A) y'= -y -y^2; y(0)=1 如果精确解是 y(t) = 1/(-1+2e^t) y(10) 处的绝对误差是多少。 现在我已经写了这段代码

def pow_t(x,b):  
    t=1; 
    while (b):
        t*=x 
        b=b-1
    return t


def  absolute(): 
    y=[x for x in range(1,11)]
    
    h=0.0001 
    for i in range(1,10) :
       y[i]=y[i-1]+(h*(-1*y[i-1]-pow_t(y[i-1],2)))
       print("y",i,"=",y[i]) 
    
    exact = 0.0000227
    approx = y[9]
    absolute = exact - approx 
    print("abbsolute erroe = exact - approx ")
    print("abbsolute erroe = ",absolute)
   

print(absolute())

预期的 output 是这个

这是我得到的实际结果

我需要将 y 列表的第一个索引设置为 1,然后通过 for 循环填充列表的 rest,我该如何编码?

如果您能在开始之前了解封闭式解决方案,这将很有帮助。

Equation: y' + y + y^2 = 0
Initial condition: y(0) = 1

这是一个伯努利方程。

封闭形式的解决方案是:

y(t) = e^C1 / (e^C1 - e^t)

应用初始条件求解常数 C1:

y(0) = e^C1 / (e^C1 - 1) = 1

你的初始条件不可能是正确的。 没有满足初始条件的常数。 请检查并更正。

您的 output 基本上是正确的,但移动了 1 (例如,您的y10是预期的y9调用 y9 )并且未四舍五入到小数点后 4 位。

解决这些问题的一种方法是:

y = 1
t = 0
h = 0.0001
iterates = [1]

for i in range(10):
    print(f'y{i} = {y:.4f}')
    y = y+h*(-y-y**2)
    iterates.append(y)
    t += h
print(f'y10 = {y:.4f}')

请注意,此代码仅使用标量变量y作为 Euler 方法中的变量(而不是数组中的条目。最终是一个口味问题,但这样代码看起来更干净。

output 是:

y0 = 1.0000
y1 = 0.9998
y2 = 0.9996
y3 = 0.9994
y4 = 0.9992
y5 = 0.9990
y6 = 0.9988
y7 = 0.9986
y8 = 0.9984
y9 = 0.9982
y10 = 0.9980

与预期的 output 匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM