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,提问作者이태훈
相关产品推荐
相关产品推荐

