解决大型方程组,具有复杂系数的N个equations_N未知数(如numbered_symbols [x1,x2,x3,..])

时间:2018-08-11 04:01:00

标签: python sympy numpy-ndarray

通过两次“ for”循环,并对numbered_symbols [x1,x2,x3,..]数组和一些给定的numpy nd_arrays(此处为A(2,4)和B(4))执行代数运算。 ,生成了多个表达式(此处为D1 [0],D1 [1],D2 [0],D2 [1])。目的是,必须使用sympy的“ linsolve”方法来解决这些包含未知变量[x1,x2,x3,..]的sympy表达式。 在更一般的情况下,我必须使用大量符号并以此方式命名。 nd_arrays的元素(此处为A(2,4)和B(4))可能很复杂。 由于某些原因,我不应该在numpy和sympy中使用matrix。 这是解释该问题的最低代码:

import sympy as sp
import numpy as np
from sympy.solvers.solveset import linsolve

x = sp.symbols('x1:5')

A = np.array([[3,2,4,6],[1,3,4,3]])
#A = np.array([[3+5j,2-1j,4+1j,6+4j],[1-6j,3+1j,4+7j,3-2j]])
B = np.array([5,8,1,4])
C1 = np.zeros ((2,4), dtype=object)
C2 = np.zeros ((2,4), dtype=object)
D1 = np.zeros (2, dtype=object)
D2 = np.zeros (2, dtype=object)

for i in range (2):
    for j in range (4):

        C1[i,j] = x[j]*A[i,j] + 2*B[j]
        C2[i,j] = x[j]/(4*A[i,j])-B[j]

D1 = np.ndarray.tolist(np.sum (C1,axis=1))
D2 = np.ndarray.tolist(np.sum (C2,axis=1))

ans = linsolve (D1[0],D1[1],D2[0],D2[1],x1,x2,x3,x4)

print(C1)
print(C2)
print(D1)
print(D2)

print(ans)    

问题出现在这里:尽管x1,x2,x3,x4已作为Symbol引入,但出现此错误:

NameError:名称'x1'未定义

如何解决错误?

另一个问题: 当将(A)选择为Complex 2d数组时,作为列表元素的sympy表达式:D1,D2(D1 [0],D1 [1],D2 [0],D2 [1])作为以下项的复杂组合出现格式为“ I”而不是1j。

如何解决错误?

另一个问题: 由于存在大量方程式和未知数,因此我不可能将“ linsolve”写为:

ans = linsolve (D1[0],D1[1],D2[0],D2[1],x1,x2,x3,x4)

我需要将其写为:

ans = linsolve (D1,D2,x1:x4)

或类似的形式。

我该怎么办?谢谢。

2 个答案:

答案 0 :(得分:1)

仅当您明确定义Python变量时,才定义它们。您已定义变量x指向元组(x1, x2, x3),但从未定义Python变量x1,x2,x3。确保您了解Python变量和SymPy符号之间的区别。 This guide应该有帮助。

要定义x1,x2,x3,x4,请使用

x1, x2, x3, x4 = x = symbols('x1:4')

这也像以前一样将x设置为整个元组。

对于另一个问题,linsolve要求第一个参数作为列表的系统,其余参数作为符号。您可以使用Pythons参数解包语法对事物进行分组,例如

linsolve([*D1, *D2], *x)

或者,您可以只构建一个列表D。通常,如果您在这里使用列表而不是NumPy数组,对您来说可能会更容易,因为您并没有真正利用NumPy的矢量化功能,列表的动态大小功能将使它们更易于操作。

答案 1 :(得分:0)

import sympy as sp
import numpy as np
from sympy import I
from sympy.solvers.solveset import linsolve

x1,x2,x3,x4 = x = sp.symbols('x1:5', real = False)

#A = np.array([[3,2,4,6],[1,3,4,3]])
A = np.array([[3+5j,2-1j,4+1j,6+4j],[1-6j,3+1j,4+7j,3-2j]] , dtype= np.complex128)
B = np.array([5,8,1,4])
C1 = np.zeros ((2,4), dtype=object)
C2 = np.zeros ((2,4), dtype=object)
D1 = np.zeros (2, dtype=object)
D2 = np.zeros (2, dtype=object)

for i in range (2):
    for j in range (4):

        C1[i,j] = x[j]*A[i,j] + 2*B[j]
        C2[i,j] = x[j]/(4*A[i,j])-B[j]

D1 = np.ndarray.tolist(np.sum (C1,axis=1))
D2 = np.ndarray.tolist(np.sum (C2,axis=1))


ans = linsolve ([*D1,*D2], *x)

#print(C1)
#print(C2)
#print(D1)
#print(D2)

print(ans)

答案:

{(-346.682690175513 - 221.750958290075*I, 197.37151730263 - 237.866928341266*I, -233.916687288553 - 10.5779385566957*I, 334.096855104832 + 335.268786804827*I)}