使用欧拉法数值求解微分方程的 Python 实现
编写函数y=Eular(x,h),使用欧拉法数值求解微
分方程初值为函数Eular(x,h)中Cx为计算结束时微分方程x的值,h为计算步长再编写脚本,通过调用函数分别以不同步长(例如h=1.0,h=0.5,h=0.25)计算y(3),并分析步长和误差之间的关系。
以下是使用欧拉法数值求解微分方程的 Python 实现。假设我们要求解的微分方程是 d y d x = f ( x , y ) \frac{dy}{dx} = f(x, y) dxdy=f(x,y),并且已知初始条件 y ( x 0 ) = y 0 y(x_0) = y_0 y(x0)=y0。这里我们以一个简单的微分方程 d y d x = y \frac{dy}{dx} = y dxdy=y,初始条件 y ( 0 ) = 1 y(0) = 1 y(0)=1 为例,它的解析解是 y = e x y = e^x y=ex。
import math
def Eular(x, h):
# 初始条件
x0 = 0
y0 = 1
steps = int((x - x0) / h)
y = y0
for _ in range(steps):
# 这里的 f(x, y) = y
f = y
y = y + h * f
return y
# 精确解
def exact_solution(x):
return math.exp(x)
# 不同步长
step_sizes = [1.0, 0.5, 0.25]
x_end = 3
for h in step_sizes:
numerical_solution = Eular(x_end, h)
exact = exact_solution(x_end)
error = abs(numerical_solution - exact)
print(f"步长 h = {h} 时,y({x_end}) 的数值解为: {numerical_solution},精确解为: {exact},误差为: {error}")
步长和误差之间的关系分析
欧拉法是一种一阶数值方法,其局部截断误差是 O ( h 2 ) O(h^2) O(h2),全局截断误差是 O ( h ) O(h) O(h)。这意味着,当步长 h h h 减小时,误差会大致线性地减小。在上述代码的输出中,你可以观察到,随着步长 h h h 的减小,数值解会越来越接近精确解,误差也会越来越小。