本帖最后由 hellomyprogram 于 2023-7-23 20:44 编辑
以只有10个数为例。我们先假定x1到x9存储在一个列表中:姑且叫做“x_list”,并将其的和设做“xsum”。
需要注意,x10是多解的。
我们可以用以下代码算出x10的值(假定我们已经知道x_list与xsum):import math
#先创建一些暂时的变量
y2 = y**2
a = - 9*xsum*y2 - 729*xsum
b = 729*xsum**2
c = 9*(y**2 - 729)
for xi in x_list:
a += 10 * xi * y2
b -= 1458 * xi * xsum + 8 * xi ** 2 * y2
b += 6561 * xi ** 2
for i in range(9):
for j in range(i + 1, 9):
b += 2 * x_list[i] * x_list[j] * y2
x10 = [(a - 10*y*math.sqrt(b)) / c, (a + 10*y*math.sqrt(b)) / c]
需要声明,我的以上式子经过优化,可能出现少了一项的情况,如果确实是如此,请试试下方的未优化的式子:[(10*x1*y**2 + 10*x2*y**2 + 10*x3*y**2 + 10*x4*y**2 + 10*x5*y**2 + 10*x6*y**2 + 10*x7*y**2 + 10*x8*y**2 + 10*x9*y**2 - 9*xsum*y**2 - 729*xsum - 10*y*math.sqrt(-8*x1**2*y**2 + 6561*x1**2 + 2*x1*x2*y**2 + 2*x1*x3*y**2 + 2*x1*x4*y**2 + 2*x1*x5*y**2 + 2*x1*x6*y**2 + 2*x1*x7*y**2 + 2*x1*x8*y**2 + 2*x1*x9*y**2 - 1458*x1*xsum - 8*x2**2*y**2 + 6561*x2**2 + 2*x2*x3*y**2 + 2*x2*x4*y**2 + 2*x2*x5*y**2 + 2*x2*x6*y**2 + 2*x2*x7*y**2 + 2*x2*x8*y**2 + 2*x2*x9*y**2 - 1458*x2*xsum - 8*x3**2*y**2 + 6561*x3**2 + 2*x3*x4*y**2 + 2*x3*x5*y**2 + 2*x3*x6*y**2 + 2*x3*x7*y**2 + 2*x3*x8*y**2 + 2*x3*x9*y**2 - 1458*x3*xsum - 8*x4**2*y**2 + 6561*x4**2 + 2*x4*x5*y**2 + 2*x4*x6*y**2 + 2*x4*x7*y**2 + 2*x4*x8*y**2 + 2*x4*x9*y**2 - 1458*x4*xsum - 8*x5**2*y**2 + 6561*x5**2 + 2*x5*x6*y**2 + 2*x5*x7*y**2 + 2*x5*x8*y**2 + 2*x5*x9*y**2 - 1458*x5*xsum - 8*x6**2*y**2 + 6561*x6**2 + 2*x6*x7*y**2 + 2*x6*x8*y**2 + 2*x6*x9*y**2 - 1458*x6*xsum - 8*x7**2*y**2 + 6561*x7**2 + 2*x7*x8*y**2 + 2*x7*x9*y**2 - 1458*x7*xsum - 8*x8**2*y**2 + 6561*x8**2 + 2*x8*x9*y**2 - 1458*x8*xsum - 8*x9**2*y**2 + 6561*x9**2 - 1458*x9*xsum + 729*xsum**2))/(9*(y**2 - 729)), (10*x1*y**2 + 10*x2*y**2 + 10*x3*y**2 + 10*x4*y**2 + 10*x5*y**2 + 10*x6*y**2 + 10*x7*y**2 + 10*x8*y**2 + 10*x9*y**2 - 9*xsum*y**2 - 729*xsum + 10*y*math.sqrt(-8*x1**2*y**2 + 6561*x1**2 + 2*x1*x2*y**2 + 2*x1*x3*y**2 + 2*x1*x4*y**2 + 2*x1*x5*y**2 + 2*x1*x6*y**2 + 2*x1*x7*y**2 + 2*x1*x8*y**2 + 2*x1*x9*y**2 - 1458*x1*xsum - 8*x2**2*y**2 + 6561*x2**2 + 2*x2*x3*y**2 + 2*x2*x4*y**2 + 2*x2*x5*y**2 + 2*x2*x6*y**2 + 2*x2*x7*y**2 + 2*x2*x8*y**2 + 2*x2*x9*y**2 - 1458*x2*xsum - 8*x3**2*y**2 + 6561*x3**2 + 2*x3*x4*y**2 + 2*x3*x5*y**2 + 2*x3*x6*y**2 + 2*x3*x7*y**2 + 2*x3*x8*y**2 + 2*x3*x9*y**2 - 1458*x3*xsum - 8*x4**2*y**2 + 6561*x4**2 + 2*x4*x5*y**2 + 2*x4*x6*y**2 + 2*x4*x7*y**2 + 2*x4*x8*y**2 + 2*x4*x9*y**2 - 1458*x4*xsum - 8*x5**2*y**2 + 6561*x5**2 + 2*x5*x6*y**2 + 2*x5*x7*y**2 + 2*x5*x8*y**2 + 2*x5*x9*y**2 - 1458*x5*xsum - 8*x6**2*y**2 + 6561*x6**2 + 2*x6*x7*y**2 + 2*x6*x8*y**2 + 2*x6*x9*y**2 - 1458*x6*xsum - 8*x7**2*y**2 + 6561*x7**2 + 2*x7*x8*y**2 + 2*x7*x9*y**2 - 1458*x7*xsum - 8*x8**2*y**2 + 6561*x8**2 + 2*x8*x9*y**2 - 1458*x8*xsum - 8*x9**2*y**2 + 6561*x9**2 - 1458*x9*xsum + 729*xsum**2))/(9*(y**2 - 729))]
我们可以通过优化过的代码,大概推算出这样的逻辑(数据量用n表示):import math
#先创建一些暂时的变量
y2 = y**2
a = - n*xsum*y2 - n**3*xsum
b = n**3*xsum**2
c = n*(y**2 - n**3)
for xi in x_list:
a += (n+1) * xi * y2
b -= 2*n**3 * xi * xsum + 8 * xi ** 2 * y2
b += n**4 * xi ** 2
for i in range(n):
for j in range(i + 1, 9):
b += 2 * x_list[i] * x_list[j] * y2
x_result = [(a - (n+1)*y*math.sqrt(b)) / c, (a + (n+1)*y*math.sqrt(b)) / c]
需要再次说明,我的推算仅仅是基于我的优化而得到的,如果我的优化出现了问题,那么这个计算方式也是一定错误的。 |