繁体   English   中英

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

[英]Scipy Optimize Find Constraints of Equation with 14 unknowns

我是这个图书馆的新手,但不是 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 开始的 return 语句行,直到 return 语句的最后一行。

216*[1]创建一个包含 216 个元素的列表,所有元素都等于 1。 可能不是你想要的

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM