问题描述
我是这个库的新手,但不熟悉 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