Scipy优化查找具有14个未知数的方程的约束



我是这个库的新手,但不是Python的新手。我有许多有14个未知数的方程式。我有一个数据集,包含640个方程,其中有14个未知数和它们的目标值。我正试图找到这个方程的最佳14参数。当我调查";我该怎么做";,我找到了这个图书馆。我运行了这个页面末尾的例子,以了解它的工作原理。然后我试着根据我的问题来实施它。我试着从650的第一个14方程开始实现。

def func(x):
return [
204 * x[13] + 180 * x[12] + 204 * x[11] + 144 * x[10] + 132 * x[9] + 132*x[8] + 108*x[7] + 144*x[6] + 30*x[5]+ 120*x[4] + 30*x[3] + 168*x[2]+   180*x[1]+   204*x[0]-66,
72 * x[13] + 78 * x[12] + 72 * x[11] + 66 * x[10] + 60 * x[9] + 72*x[8] + 72*x[7]   +  95*x[6] +     84*x[5]+     95*x[4] + 120*x[3] +  132*x[2]+   132*x[1]+   168*x[0]-45,
95 * x[13] + 78 * x[12] + 90 * x[11] +84 * x[10] + 66 * x[9] + 60*x[8]  + 108*x[7]  +  84*x[6] +     132*x[5]+    84*x[4] + 95*x[3] +   144*x[2]+   168*x[1]+   132*x[0]-46,
95 * x[13] + 108 * x[12] + 108 * x[11] +120 * x[10] + 96 * x[9] + 120*x[8] + 108*x[7]   +  132*x[6] +  161*x[5]+ 120*x[4] + 144*x[3] +  168*x[2]+   161*x[1]+   204*x[0]-96,
144 * x[13] + 90 * x[12] + 96 * x[11] +132 * x[10] + 132 * x[9] + 132*x[8] + 108*x[7]   +  96*x[6] +     108*x[5]+    132*x[4] +    161*x[3] +  180*x[2]+   216*x[1]+   240*x[0]-72,
120 * x[13] + 30 * x[12] +  30 * x[11]  +66 * x[10] + 66 * x[9] + 84*x[8] + 216*x[7]    +  132*x[6] +  180*x[5]+ 30*x[4] +  66*x[3] +   66*x[2]+    161*x[1]+   240*x[0]-66,
132 * x[13] + 119 * x[12] + 90 * x[11] +72 * x[10] + 96*x[9] + 96*x[8] + 119*x[7]   +  84*x[6] +     144*x[5]+    144*x[4] +    96*x[3] +   168*x[2]+   252*x[1]+   144*x[0]-24,
180 * x[13] + 180 * x[12] + 119 * x[11] +96 * x[10] + 108*x[9] + 119*x[8] + 144*x[7]    +  168*x[6] +  66*x[5]+ 180*x[4] +  186*x[3] +  66*x[2]+    180*x[1]+   66*x[0]-61,
42 * x[13] + 42 * x[12] + 42 * x[11] +36 * x[10] + 36*x[9]  + 36*x[8] + 54*x[7] +  60*x[6] +     48*x[5]+     30*x[4] + 54*x[3] +   54*x[2]+    60*x[1]+    72*x[0]-81,
180 * x[13] + 180 * x[12] + 66 * x[11]  +132 * x[10] + 144*x[9] + 168*x[8] + 228*x[7]   +  168*x[6] +  216*x[5]+ 144*x[4] + 161*x[3] +  66*x[2]+    216*x[1]+   264*x[0]-114,
119 * x[13] + 108 * x[12] + 30 * x[11]  +119 * x[10] + 108*x[9] + 108*x[8] + 95*x[7]    +  108*[6] +  95 *x[5]+  108*x[4] + 66*x[3] +   180*x[2]+   216*x[1]+   240*x[0]-90,
95 * x[13] + 108 * x[12] + 119 * x[11] +119 * x[10] + 95*x[9] + 108*x[8] + 95*x[7]  +  144*x[6] +  228*x[5]+ 119*x[4] + 161*x[3] +  66*x[2]+    180*x[1]+   240*x[0]-46,
100 * x[13] + 180 * x[12] + 228 * x[11] +180 * x[10] + 168*x[9] + 168*x[8] + 180*x[7]   +  120*x[6] +  240*x[5]+ 144*x[4] + 180*x[3] +  168*x[2]+   30*x[1]+    252*x[0]-115,
95 * x[13] + 108 * x[12] + 90 * x[11] +120 * x[10] + 120*x[9] + 120*x[8] + 72*x[7]  +  144*x[6] +  168*x[5]+ 120*x[4] + 186*x[3] +  132*x[2]+   120*x[1]+   132*x[0]-95,
]
root = fsolve(func, (0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0))
print(root)

它抛出了一个错误,比如:

ml, mu, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.(216,)

据我所知,没有像108或206这样的形状。为什么我会出现这个错误,或者我如何使用这个方程数据集找到最佳参数?有人能帮忙吗?

您已经多次编写216*[1]而不是216*x[1]
这种情况发生在您的报税表中,从119开始,一直到报税表的最后一行。

CCD_ 3创建全部等于1的216个元素的列表。可能不是你想要的

编辑:这可能也不是解决这些方程的最实用的方法。根据方程的形式,我会创建一个约束的大矩阵,得到640x14矩阵。可以放置在尺寸为640x1的矢量中的目标值。然后你可以用numpy.linalg.solve(A,b)得到方程的未知参数。请参阅numpy.linal.solve

最新更新