使用python中的最小二乘法优化几个方程的公共参数

时间:2018-06-06 16:37:29

标签: python least-squares

我想在几个方程中优化常用参数,但我不知道如何同时适应它们。

问题基本上是这样的,需要解决四个方程和三个要优化的参数:

A + B + C + 1750 = T

12 = A / T * 100

15 = B / T * 100

37 = C / T * 100

我希望找到a,b和c的最佳值。有没有人有建议,也许使用最小二乘法?只有一个方程式可以解决,我才熟悉。

2 个答案:

答案 0 :(得分:1)

这是一个包含4个未知数的4个方程组。它可以用代数方法解决。

求解a,b和c并插入第一个等式。我假设(* 100)在a,b和c的方程的分母中。

12 x 100 x T + 15 x 100 x T + 37 x 100 x T + 1750 = T
T = 3.66

然后,将此T值插入a,b和c

的等式中

答案 1 :(得分:0)

看起来你的方程实际上有4个参数,a,b,c和T,所以你有一组4个线性方程,有4个参数:

a + b + c - T = -1750
100 * a - 12 * Y = 0
100 * b - 15 * Y = 0
100 * c - 37 * Y = 0

您可以使用矩阵中的系数来解决这个问题:

import numpy as np

a = np.array([[1., 1., 1., -1.],
              [100., 0, 0, -12.],
              [0, 100., 0, -15.],
              [0, 0, 100., -37.]])
b = np.array([-1750., 0, 0, 0])

如果有分析解决方案,您可以使用

res = np.linalg.solve(a, b)
# res: [  583.33333333   729.16666667  1798.61111111  4861.11111111]

否则(或者对于更一般的情况),您可以使用最小二乘算法近似解决方案

res, err, _, __ = np.linalg.lstsq(a, b)
# res: [  583.33333333   729.16666667  1798.61111111  4861.11111111]