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

Python Picard迭代求解微分方程遇NameError:'x'未定义求助

解决Picard迭代代码中的NameError问题

问题原因

报错NameError: name 'x' is not defined是因为在绘图代码中调用y.evalf(subs={x: x_i})时,x仅在picard_solver函数内部定义为SymPy符号,外部代码未声明该变量。此外原代码还存在Picard迭代初始值设置不符合理论定义的问题。

修复后的完整代码

import sympy

def picard_solver(y_0, x_0, rhs_expression, iteration_count: int = 5):
    x = sympy.symbols("x")
    # Picard迭代初始近似为常数y₀
    phi = sympy.sympify(y_0)
    for _ in range(iteration_count):
        # 迭代计算下一个近似解
        phi = y_0 + sympy.integrate(rhs_expression(x, phi), (x, x_0, x))
    return phi
import numpy 
import plotly.graph_objects as go
import sympy

# 定义SymPy符号x,用于后续代入数值求值
x = sympy.symbols("x")

# 生成1到5阶的Picard近似解
y_set = [picard_solver(1, 0, lambda x, y: x * y, i)  for i in range(1, 6)]
x_grid = numpy.linspace(-2, 2, 1000)
y_picard = list()

# 将符号表达式转换为数值数组
for y in y_set:
    y_picard.append(numpy.array([float(y.evalf(subs={x: x_i})) for x_i in x_grid]))

# 计算精确解
y_exact = numpy.exp((x_grid ** 2) / 2)

# 绘制对比图
fig = go.Figure()
for i, y_order in enumerate(y_picard):
    fig.add_trace(go.Scatter(x=x_grid, y=y_order, name=f"Picard Order {i + 1}"))
fig.add_trace(go.Scatter(x=x_grid, y=y_exact, name="Exact Solution"))

fig.show()
fig.write_html("picard_vs_exact.html")

关键修改说明

  • 全局声明SymPy符号x:在绘图代码开头添加x = sympy.symbols("x"),确保代入求值时能识别该符号
  • 修正初始近似值:将picard_solver中phi = x_0改为phi = sympy.sympify(y_0),符合Picard迭代初始近似为常数y₀的理论定义
  • 调整迭代次数:将循环range(iteration_count + 1)改为range(iteration_count),确保迭代次数与传入的参数一致(比如传入1时得到1阶近似解)

内容的提问来源于stack exchange,提问作者이태훈

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:15:16