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

Python最小二乘拟合求解超定线性方程组实现方法

超定线性方程组最小二乘求解实现

针对n>3、无精确解析解的线性方程组,求解残差平方和最小的(x,y,z)最优值不需要依赖显式自变量坐标轴,以下是几种常用Python工具的可落地实现方式:

方案1:Numpy直接求解(优先选择)

这是线性最小二乘问题的标准解析解法,不需要迭代、无初值依赖、计算速度最快,结果为全局最优解。
首先把方程组整理为矩阵形式 M = K @ β:

  • K是n行3列的系数矩阵,每一行对应单条方程的系数[Ai, Bi, Ci]
  • β是长度为3的待求向量,即[x, y, z]
  • M是长度为n的测量值数组

实现代码:

import numpy as np

# 替换为你的真实A1~An、B1~Bn、C1~Cn、M1~Mn数据
A = np.array([A1, A2, ..., An])
B = np.array([B1, B2, ..., Bn])
C = np.array([C1, C2, ..., Cn])
M = np.array([M1, M2, ..., Mn])

# 组装系数矩阵
K = np.column_stack((A, B, C))
# 求解最小二乘
beta_opt, sum_residuals, rank, singular_values = np.linalg.lstsq(K, M, rcond=None)
x, y, z = beta_opt

方案2:Scipy优化接口实现(灵活扩展)

如果需要后续添加参数约束、做加权最小二乘、自定义残差规则,可以用scipy.optimize.least_squares,属于迭代求解,线性问题下对初值不敏感。
实现代码:

import numpy as np
from scipy.optimize import least_squares

# 替换为你的真实数据
A = np.array([A1, A2, ..., An])
B = np.array([B1, B2, ..., Bn])
C = np.array([C1, C2, ..., Cn])
M = np.array([M1, M2, ..., Mn])

# 定义残差函数:返回每条方程的预测值与测量值的差
def calc_residual(beta):
    x, y, z = beta
    M_pred = A * x + B * y + C * z
    return M_pred - M

# 初值可任意设置,线性问题不会陷入局部最优
init_beta = [0, 0, 0]
fit_result = least_squares(calc_residual, init_beta)
x, y, z = fit_result.x

如果需要做加权最小二乘,只要把返回的残差乘上对应权重数组即可,比如return (M_pred - M) * weight_array。

方案3:lmfit实现(适配现有使用习惯)

你之前用的带自变量轴的拟合是lmfit封装的高层Model接口,这类无显式x轴的场景直接用lmfit底层的minimize方法即可,逻辑和scipy一致,还能沿用你熟悉的参数设置、约束、结果输出逻辑。
实现代码:

import numpy as np
from lmfit import Parameters, minimize

# 替换为你的真实数据
A = np.array([A1, A2, ..., An])
B = np.array([B1, B2, ..., Bn])
C = np.array([C1, C2, ..., Cn])
M = np.array([M1, M2, ..., Mn])

# 定义待拟合参数,可按需添加min/max范围约束、设置vary=False固定参数等
fit_params = Parameters()
fit_params.add('x', value=0)
fit_params.add('y', value=0)
fit_params.add('z', value=0)

# 定义残差函数
def lm_residual(params):
    x = params['x'].value
    y = params['y'].value
    z = params['z'].value
    M_pred = A * x + B * y + C * z
    return M_pred - M

# 执行拟合
fit_out = minimize(lm_residual, fit_params)
x = fit_out.params['x'].value
y = fit_out.params['y'].value
z = fit_out.params['z'].value

提示:该问题属于纯线性最小二乘问题,三种方案得到的结果理论上完全一致,日常使用优先选numpy方案效率最高,有自定义需求时再选scipy或lmfit即可,不需要按非线性拟合的思路做复杂配置。

内容的提问来源于stack exchange,提问作者Aleksandar Ciric

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 03:09:37