通过两次“ 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)
或类似的形式。
我该怎么办?谢谢。
答案 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)}