使用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)
修改说明
- 替换了错误的解析解函数,改为正确的仅依赖x的表达式
- 计算解析解时直接使用当前x值,不再依赖欧拉迭代的y
- 优化了变量命名(如
dy改为dydx),提升代码可读性 - 给欧拉近似解的折线添加了连线(
ro-),更直观展示迭代过程 - 添加了坐标轴标签和标题,增强图表可读性
运行修改后的代码,就能得到正确的欧拉近似解与解析解的对比图,步长越小,欧拉解越接近解析解。
内容的提问来源于stack exchange,提问作者Ad270
相关产品推荐
相关产品推荐

