改良的欧拉法=梯形法=2阶龙格库塔法之一

梯形法和改良欧拉法实际上是相同的算法,只是名称不同。它们都是对基本欧拉法的一种改进,用于求解常微分方程的初值问题。在这两种方法中,我们使用两个估算值来计算下一个解的近似值:一个是使用当前点的斜率,另一个是使用预测点的斜率。

数值分析第九章习题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}")


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值