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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:25:00