You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Python的Matplotlib绘制欧拉近似与解析解出现异常输出求助

问题分析与修复方案

核心错误:解析解公式完全错误

你代码里的解析解函数f = lambda x,y: math.exp(x+(y/5))完全不符合微分方程dy/dx = x + y/5(初始条件y(0)=-3)的正确解析解。

正确解析解推导

这是一阶线性非齐次微分方程,整理为标准形式:

dy/dx - (1/5)y = x

通过积分因子法求解,最终得到的解析解为:
$$y(x) = 22e^{x/5} -5x -25$$

验证初始条件:当x=0时,$y(0)=22*1 -0 -25=-3$,符合要求。

其他问题

  • 解析解计算错误依赖欧拉迭代的y值:原代码中计算analytical_values时,用了当前欧拉步骤的y值,这完全不合理——解析解是x的独立函数,应该直接用x计算对应值。

修改后的代码

import math
import matplotlib.pyplot as plt

def euler_method(step_size):
    first_x = 0
    last_x = 5
    h = step_size
    n = int((last_x - first_x) / h)
    x = 0
    y = -3

    # 微分方程的右端函数
    dydx = lambda x, y: x + (y / 5)
    # 正确的解析解函数,仅依赖x
    analytical_solution = lambda x: 22 * math.exp(x / 5) - 5 * x - 25

    x_values = []
    euler_values = []
    analytical_values = []

    for _ in range(n):
        x_values.append(x)
        euler_values.append(y)
        # 用当前x计算解析解的值
        analytical_values.append(analytical_solution(x))
        # 欧拉方法更新y和x
        y += dydx(x, y) * h
        x += h
    
    # 添加最后一个点(x=5)
    x_values.append(x)
    euler_values.append(y)
    analytical_values.append(analytical_solution(x))

    plt.plot(x_values, euler_values, 'ro-', x_values, analytical_values, 'b-')
    plt.legend(['欧拉近似解', '解析解'])
    plt.xlabel('x')
    plt.ylabel('y')
    plt.title(f'欧拉方法与解析解对比(步长={step_size})')
    plt.show()

euler_method(1)

修改说明

  1. 替换了错误的解析解函数,改为正确的仅依赖x的表达式
  2. 计算解析解时直接使用当前x值,不再依赖欧拉迭代的y
  3. 优化了变量命名(如dy改为dydx),提升代码可读性
  4. 给欧拉近似解的折线添加了连线(ro-),更直观展示迭代过程
  5. 添加了坐标轴标签和标题,增强图表可读性

运行修改后的代码,就能得到正确的欧拉近似解与解析解的对比图,步长越小,欧拉解越接近解析解。

内容的提问来源于stack exchange,提问作者Ad270

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 11:43:08