使用Sympy nsolve求解超定方程组时遇lambdify TypeError
问题解决方案
核心错误修正
你的代码里存在一个关键错误:误用了sp.euler,它是欧拉常数(γ≈0.5772),而非自然指数函数。你需要把sp.euler替换为sp.exp,这才是SymPy中用于指数运算的函数。这个错误直接导致表达式结构异常,进而触发lambdify的参数缺失错误。
超定方程组的正确处理方式
nsolve主要用于求解适定方程组(方程数=未知数个数),而你的场景是4个方程解2个未知数(超定系统),强行用nsolve会引发适配问题,更适合用最小二乘拟合来找到最优解(最小化所有方程残差的平方和)。
修正后的完整代码
import sympy as sp f25 = 61900. f50 = 66200. f75 = 70700. f90 = 77700. mu = sp.var('mu') sigma = sp.var('sigma') # 修正指数函数,并简化表达式写法 def f(x): return (1 / sp.sqrt(2 * sp.pi * sigma**2)) * sp.exp(-(x - mu)**2 / (2 * sigma**2)) # 定义所有方程的残差 residuals = [f(f25) - 0.25, f(f50) - 0.50, f(f75) - 0.75, f(f90) - 0.90] # 使用SymPy的leastsq求解超定方程组,传入初始猜测值 solution = sp.leastsq(residuals, (mu, sigma), (66000, 10000)) print("最小二乘解:", solution)
可选:用nsolve求解适定子集(不推荐)
如果非要用nsolve,可以从4个方程中选2个组成适定方程组求解,但这样会忽略另外两个方程的信息,结果仅适配所选方程:
# 选取中间两个方程求解 f2 = f(f50) - 0.50 f3 = f(f75) - 0.75 solution_nsolve = sp.nsolve((f2, f3), (mu, sigma), (66000, 10000)) print("适定方程组解:", solution_nsolve)
关于你之前尝试的错误说明
- 给变量加嵌套列表
[(mu, sigma)]是错误的,nsolve的变量参数只需传入元组或列表(如(mu, sigma))即可。 - 初始猜测加嵌套列表
[(66000, 10000)]会让SymPy把整个元组当作单个变量的初始值,引发类型错误,正确写法是直接传入(66000, 10000)。
内容的提问来源于stack exchange,提问作者user2194172
相关产品推荐
相关产品推荐

