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

使用Python求解二阶常微分方程时出现NameError错误的解决方法

修复方案及代码解释

你的降阶思路完全可行:令u = y',将二阶常微分方程转化为一阶方程组即可求解。原代码的问题在于:

  • 重复定义同名函数diff,后定义的函数覆盖了前一个
  • 第二个diff函数引用了未定义的变量u
  • 未正确构建一阶方程组,也未对y进行积分计算

修复后的完整代码

import numpy as np 
import matplotlib.pyplot as plt
from scipy.integrate import odeint

A = 1

# 定义一阶方程组的微分方程:z = [y, u],其中u = y'
def diff_eq(z, x):
    y, u = z
    # z[0]' = y' = u
    dy_dx = u
    # z[1]' = u' = y'' = sqrt(1+u²)/(2*(A-x))
    du_dx = np.sqrt(1 + u**2) / (2 * (A - x))
    return [dy_dx, du_dx]

# 初始条件:假设x=0时,y=0,u=y'=0(可根据需求调整)
initial_conditions = [0, 0]
x = np.linspace(0, A-1e-6, 100)  # 避免x=A时分母为0,留极小余量

# 求解方程组
solution = odeint(diff_eq, initial_conditions, x)
y = solution[:, 0]  # 提取y的数值解
u = solution[:, 1]  # 提取u=y'的数值解

plt.xlabel('x')
plt.ylabel('y')
plt.grid()
plt.plot(x, y)  
plt.show()

关键修改说明

  1. 构建一阶方程组:将状态变量设为包含y和u=y'的向量z,在diff_eq函数中分别返回y'和u'的表达式,对应原二阶方程的降阶结果。
  2. 避免分母为0:原方程中当x=A时,分母2*(A-x)为0,因此生成x序列时将终点设为A-1e-6,避免数值计算错误。
  3. 明确初始条件:原代码未明确y的初始值,这里假设x=0时y=0、y'=0,可根据实际问题的边界条件调整。
  4. 正确提取解:odeint返回的解是二维数组,第一列是y的数值,第二列是u=y'的数值,需分别提取。

内容的提问来源于stack exchange,提问作者游凱安

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 03:25:08