欧拉法(Euler Method)绘图异常:数值解曲线远低于精确解求助
欧拉法数值解与精确解偏差问题修复
问题根源
你的代码存在两个核心错误:
- 初始值索引错误:
x0=0是自变量的初始值,不是数组x的索引。直接执行y[x0] = y0会把x=-10(数组x的第一个元素)处的y值设为2,和初始条件x=0,y=2完全不符,导致整个数值解的起点偏移。 - 单向积分遗漏:原循环只从数组起始位置向右积分,
x<0的部分y值始终为0,没有利用初始条件向左计算这部分的数值解。
修复后的代码
import numpy as np import matplotlib.pyplot as plt # Define parameters f = lambda x, y: 2*x h = 0.1 x = np.arange(-10, 10, h) x0 = 0 y0 = 2 # 找到初始值x0在数组x中的索引(处理浮点数精度问题) idx0 = np.argmin(np.abs(x - x0)) # Explicit Euler Method y = np.zeros(len(x)) y[idx0] = y0 # 向右积分(x从0到10) for i in range(idx0, len(x) - 1): y[i + 1] = y[i] + h * f(x[i], y[i]) # 向左积分(x从0到-10) for i in range(idx0, 0, -1): y[i - 1] = y[i] - h * f(x[i - 1], y[i - 1]) plt.figure(figsize=(12, 8)) plt.plot(x, y, 'b--', label='Euler') plt.plot(x, 2 + x**2, 'g', label='Exact') plt.title('Numerical integration methods') plt.xlabel('x') plt.ylabel('y') plt.grid() plt.legend() plt.show()
关键修改说明
- 修正初始索引:用
np.argmin(np.abs(x - x0))精准定位x=0在数组中的位置,确保初始值赋值给正确的点。 - 双向积分:分别从初始点向右(x增大方向)和向左(x减小方向)执行欧拉法,覆盖整个x区间的数值解计算。
运行修复后的代码,欧拉法曲线会和精确解几乎重合(步长h=0.1下误差很小)。
内容的提问来源于stack exchange,提问作者user19571137
相关产品推荐
相关产品推荐

