目录
问题描述:已知y'=f(x,y),求y(x)。
本题:已知y'=y,y(0)=1,求y(x)。
一、原理:
注意说明的话篇幅太大,给大家推荐个视频自行学习:
二、代码:
import numpy as np
from matplotlib import pyplot as plt
import math
"""dy/dx = exp(x)"""
def exp_euler(h):
"""欧拉定理:前半段重合,放大看存在误差,需要更小的步长"""
x = np.array([0])
y_1 = np.array([1])
y = np.array([1])
for i in range(int(25/h)):
x = np.append(x, x[i]+h)
dy = y_1[i]
y_1 = np.append(y_1, y_1[i] + h * dy)
#y = np.append(y, math.exp(x[i]))
plt.title("Exp by Euler")
plt.xlabel("x")
plt.ylabel("y")
#plt.plot(x, y)
plt.plot(x, y_1)
plt.show()
def exp_mv(h):
"""中值定理:几乎完全重合,但是放大看还是存在误差,需要更小的步长"""
x = np.array([0])
y_1 = np.array([1])
y = np.array([1])
for i in range(int(10//h)):
x = np.append(x, x[-1]+h)
dy = y_1[-1]
y_center = y[-1] + h / 2 * dy
dy = y_center
y_1 = np.append(y_1, y_1[-1] + h * dy)
y = np.append(y, math.exp(x[i+1]))
print(y[-1])
print(y_1[-1])
plt.title("Mean Value")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y)
plt.plot(x, y_1)
plt.show()
"""
dy/dx = e^x
"""
def exp_rk(h):
"""四阶龙塔法,精确度明显提升"""
x = [0]
y_1 = [1]
y = [1]
for i in range(int(10//h)):
k_1 = y[-1]
k_2 = y[-1] + 0.5 * h * k_1
k_3 = y[-1] + 0.5 * h * k_2
k_4 = y[-1] + h * k_3
dy = 1/6 * (k_1 + 2 * k_2 + 2 * k_3 + k_4)
x.append(x[-1] + h)
y.append(y[-1] + h * dy)
y_1.append(math.exp(x[i+1]))
print(y[-1])
print(y_1[-1])
plt.title("R K")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y)
plt.plot(x, y_1)
plt.show()
if __name__ == "__main__":
#print(max([1,2,3,4]))
#print(np.append([1,23,3],10))
#exp_euler(0.1)
exp_rk(0.01)
exp_mv(0.01)
print(math.exp(250))
三、效果展示:
上面三个效果可以看出后两种基本拟合了exp,再具体看一下数值exp(20):
eu:439286205.05009544
mv:480329695.5076891
rk:480337720.2628221
math.exp(20)=480337721.05650175
四、总结:
所有的函数拟合最重要的是看dy的拟合程度,欧拉法用单点拟合效果肯定越来越差,而中值定理用两端平均值拟合效果好了很多,而龙塔法则用4个点拟合,效果必然跟好,具有很好的收敛性。
五、参考:
https://blog.youkuaiyun.com/qq_31073871/article/details/88870003