Scipy Optimize 使用 14 个未知数查找方程的约束

问题描述

我是这个库的新手,但不熟悉 Python。我有很多方程有 14 个未知数。我有一个包含 640 个方程和 14 个未知数及其目标值的数据集。我正在尝试为这个方程找到最佳的 14 个参数。当我调查“我该怎么做”时,我发现了这个库。我运行了页面末尾的 this example 以了解它的工作原理。然后我尝试实现它适合我的问题。 我尝试将第 14 个 650 方程作为开始实现。

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))

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