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
我尝试求解具有边界条件的超定线性方程组。为了描述我的问题,我试着举个例子:
### 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