如何在15次python中求解多项式方程组



在Python中有一种简单的方法来求解大型多项式方程组吗?

我必须求解16个方程,它们看起来像:

W1*(P1^0) + W2*(P2^0) + ... + W8*(P8^0)     = 2/1
W1*(P1^1) + W2*(P2^1) + ... + W8*(P8^1)     = 0
W1*(P1^2) + W2*(P2^2) + ... + W8*(P8^2)     = 2/3
...
W1*(P1^14) + W2*(P2^14) + ... + W8*(P8^14)  = 2/15
W1*(P1^15) + W2*(P2^15) + ... + W8*(P8^15)  = 0

我的想法是将其分为2个数组,J(左侧(和I(右侧(。使用for循环,如果n是偶数,n从0开始,我成功地生成了一个2/(n+1(的数组。对于左边的部分,我生成了一个带有索引Wi和Pi的数组。

我尝试过几种不同的解决方案,但都没能成功。

此外,如果有任何想法,我愿意学习解决这个问题的更好方法。

from sympy import *
from sympy.solvers.solveset import linsolve
init_printing(use_unicode=True)

#definição dos
w1, w2, w3, w4, w5, w6, w7, w8 = symbols('w1:9')
p1, p2, p3, p4, p5, p6, p7, p8 = symbols('p1:9')
#vetor de coeficientes do polinómio I de n=15
I=[]
for i in range(16):
if i%2==0:
I.append(2/(i+1))
else:
I.append('0')
#vetor de coeficientes do polinómio J de n=15
J=[]
W = IndexedBase('W')
P = IndexedBase('P')
i = symbols('i', cls=Idx)
s=0
J=[]
for n in range(16):
for i in range(1,9):
s += W[i]*P[i]**n
J.append(s)
s=0
lst_PW = []
for i in range(1,9):
lst_PW.append(W[i])
lst_PW.append(P[i])
solve(J-I,lst_PW)

15th次多项式看起来太重了,无法用sympy或任何相关软件求解。

除此之外,代码还犯了一些错误:

  • 应该将数值0附加到I,而不是字符串'0'
  • 在给定的代码中,变量W[i]与变量w1, w2, w3, ...不相关
  • 在Python中,不能将J - I与两个列表一起使用。对于元素相减,需要一个循环
  • 写入2/(i+1)会产生一个浮点值,这阻碍了sympy对精确符号解决方案的尝试。将其写成2/S(i+1)会得到一个症状分数。请参见Python数字与sympy数字

如果也使用Python的列表理解,代码可能如下所示:

from sympy import init_printing, symbols, S, Eq, solve
init_printing(use_unicode=True)
w1, w2, w3, w4, w5, w6, w7, w8 = W = symbols('w1:9')
p1, p2, p3, p4, p5, p6, p7, p8 = P = symbols('p1:9')
I = [2 / S(i + 1) if i % 2 == 0 else 0 for i in range(16)]
J = [sum([W[i] * P[i] ** n for i in range(8)]) for n in range(16)]
solve([Eq(i, j) for i, j in zip(I, J)], list(P) + list(W))

但是,不幸的是,sympy无法找到解决方案。

最新更新