python 中具有边界条件的超定非线性方程组的解

Solution of an overdetermined nonlinear system of equations with boundary conditions in python

我尝试求解具有边界条件的超定线性方程组。为了描述我的问题,我试着举个例子:

### Input values
LED1_10 = np.array([1.5, 1, 0.5, 0.5])
LED1_20 = np.array([2.5, 1.75, 1.2, 1.2])
LED1_30 = np.array([3, 2.3, 1.7, 1.7])

LED2_10 = np.array([0.2, 0.8, 0.4, 0.4])
LED2_20 = np.array([0.6, 1.6, 0.5, 0.5])
LED2_30 = np.array([1.0, 2.0, 0.55, 0.55])

LED3_10 = np.array([1, 0.1, 0.4, 0.4])
LED3_20 = np.array([2.5, 0.8, 0.9, 0.9])
LED3_30 = np.array([3.25, 1, 1.3, 1.3])

### Rearrange the values
LED1 = np.stack((LED1_10, LED1_20, LED1_30)).T
LED2 = np.stack((LED2_10, LED2_20, LED2_30)).T
LED3 = np.stack((LED3_10, LED3_20, LED3_30)).T

### Fit polynomals
LEDs = np.array([LED1, LED2, LED3])
fits = [
    [np.polyfit(np.array([10, 20, 30]), LEDs[i,j], 2) for j in range(LEDs.shape[1])]
    for i in range(LEDs.shape[0])
]
fits = np.array(fits)

def g(x):
    X = np.array([x**2, x, np.ones_like(x)]).T
    return np.sum(fits * X[:,None], axis=(0, 2))

### Solve
def system(x,b):
    return (g(x)-b)

b = [5, 8, 4, 12]
x = least_squares(system, np.asarray((1,1,1)), bounds=(0, 20), args = b).x

在我的第一种方法中,我使用这样的求解器 leastsq 解决了无边界系统 x = scipy.optimize.leastsq(system, np.asarray((1,1,1)), args=b)[0] 这很好地解决了 x1、x2 和 x3 的问题。但现在我意识到我的实际应用程序需要限制。

如果我 运行 我的代码如上所示,我得到错误:“system() 接受 2 个位置参数,但给出了 5 个

谁能帮我解决这个问题?或者,如果 least_squares 不是正确的选择,则可能会为此任务建议另一个求解器。

感谢大家的帮助。

您将 4 个元素的列表作为 args 传递,因此 least_squares 认为您的函数 system 有 5 个参数。相反,要么传递一个可选参数的元组,即

x = least_squares(system, np.asarray((1,1,1)), bounds=(0, 20), args = (b,)).x

或使用 lambda:

x = least_squares(lambda x: g(x) - b, np.asarray((1,1,1)), bounds=(0, 20)).x