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

Solving the large system of equations , N equations_N unknowns (as numbered_symbols [x1,x2,x3,..] ) with complex coefficients

通过双 "for" 循环,并对 numbered_symbols [x1,x2,x3,..] 的数组和一些给定的 numpy nd_arrays (此处: A(2,4) 和 B(4)),生成了一些表达式(此处:D1[0]、D1[1]、D2[0]、D2[1])。目的是,这些包含未知变量 [x1,x2,x3,..] 的 sympy 表达式必须通过 method 解决:"linsolve" of sympy。 在更一般的情况下,我必须使用大量的符号并用这种方式命名它们。 nd_arrays 的元素(此处:A(2,4) 和 B(4))可能很复杂。 出于某种原因,我不应该在 numpy 和 sympy 中使用矩阵。 这是解释问题的最少代码:

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) 被选为复杂二维数组时,作为 lists:D1,D2 ( D1[0],D1[1],D2[0],D2[1] ) 元素的 sympy 表达式显示为复杂'I' 形式的组合而不是 1j。

如何修复错误?

另一个问题: 由于方程式和未知数较多,我无法将 "linsolve" 写成 :

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

我需要把它写成:

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

或者类似的表格。

我该怎么办?谢谢。

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 的矢量化功能,而列表的动态大小功能将使它们更容易操作。

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