梯形法和改良欧拉法实际上是相同的算法,只是名称不同。它们都是对基本欧拉法的一种改进,用于求解常微分方程的初值问题。在这两种方法中,我们使用两个估算值来计算下一个解的近似值:一个是使用当前点的斜率,另一个是使用预测点的斜率。
数值分析第九章习题2
def improved_euler_method(f, x0, y0, h, x_end):
"""
使用改进的欧拉法求解常微分方程 y'=f(x,y) 的近似解。
参数:
f : callable
含有微分方程 y'=f(x,y) 的函数。
x0 : float
初始x值。
y0 : float
初始y值。
h : float
步长。
x_end : float
求解的终点x值。
返回:
x_values : list
x的值列表。
y_values : list
y的近似值列表。
"""
# 初始化变量
x_values = [x0]
y_values = [y0]
# 当前x和y值
x = x0
y = y0
# 当x小于x_end时进行迭代
while x < x_end:
# 使用欧拉法计算预测值
y_pred = y + h * f(x, y)
# 使用预测值计算斜率
y_next = y + h * f(x + h, y_pred)
# 对预测值和计算出的值进行平均
y = 0.5 * (y_pred + y_next)
# 更新x值
x += h
# 添加到列表中
x_values.append(x)
y_values.append(y)
return x_values, y_values
# 示例使用
# 定义一个微分方程 y'=x*x +x- y
def f(x, y):
return x*x +x- y
# 求解 y'=x+y, y(0)=0 从 x=0 到 x=2,步长为0.1
x_values, y_values = improved_euler_method(f, 0, 0, 0.1, 0.5)
# 打印结果
for x, y in zip(x_values, y_values):
print(f"x: {x:.4f}, y: {y:.4f}")