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

使用嵌套for循环结合Euler法估算积分的问题求助

修正欧拉法求解微分方程dy/dx=x³的代码问题

针对你需要用嵌套循环实现多步长欧拉法求解微分方程的需求,先梳理原代码的核心问题,再给出修正后的实现方案:

原代码的关键错误

  • 幂运算符号误用:Python中^是按位异或运算符,计算x的三次方需用x**3。
  • 数组初始化缺失长度:np.zeros()必须指定数组长度,否则无法进行索引赋值。
  • 循环逻辑混乱:内层循环的索引处理错误,且未根据步长h计算正确的积分步数。
  • 步长生成冗余:可直接通过列表推导式生成目标h值,无需复杂循环计算。
  • 未保留计算结果:原代码未存储每个h对应的欧拉解,也未验证计算正确性。

修正后的代码

import matplotlib.pyplot as plt
import numpy as np

# 微分方程右端函数
def f(x):
    return x ** 3

# 解析解,用于对比验证
def analytical_solution(x):
    return x ** 4 / 4

# 生成目标步长列表
h_list = [0.5 / (2 ** i) for i in range(8)]
# 积分区间:x从0到2
x_start = 0
x_end = 2

# 外层循环:遍历每个步长h
for h in h_list:
    # 计算积分步数,生成x数组
    step_count = int((x_end - x_start) / h)
    x = np.linspace(x_start, x_end, step_count + 1)
    # 初始化y数组,设置初始条件y(0)=0
    y = np.zeros(step_count + 1)
    
    # 内层循环:欧拉法迭代计算
    for i in range(1, step_count + 1):
        y[i] = y[i-1] + h * f(x[i-1])
    
    # 绘制当前步长的欧拉解
    plt.plot(x, y, label=f"欧拉法 (h={h})")

# 绘制解析解作为参考
x_analytical = np.linspace(x_start, x_end, 1000)
y_analytical = analytical_solution(x_analytical)
plt.plot(x_analytical, y_analytical, 'k--', label="解析解 y=x⁴/4")

# 图表配置
plt.xlabel("x")
plt.ylabel("y")
plt.title("欧拉法求解dy/dx=x³的收敛性")
plt.legend()
plt.grid(True)
plt.show()

代码说明

  1. 外层循环:直接遍历预先生成的步长列表,每个步长对应一次完整的欧拉积分计算。
  2. 内层循环:针对每个步长h,先计算积分步数,初始化x和y数组后,从第1步开始用欧拉公式y[i] = y[i-1] + h*f(x[i-1])迭代求解。
  3. 结果验证:将欧拉解与解析解对比,能直观看到步长越小,欧拉解越接近真实解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:35:22