通过双"for“循环,并对numbered_symbols x1,x2,x3,..)数组执行代数运算。)和一些给定的nd_arrays (这里: A(2,4)和B(4)),生成了许多表达式(这里: D1,D11,D2,D21)。其目的是,这些包含未知variablesx1,x2,x3,..的渐近表达式。必须用“线性求解”的方法来解决。在更一般的情况下,我必须使用大量的符号并以这种方式命名它们。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已经作为符号引入,但出现以下错误:
NameError:未定义名称“x1”
如何修复这个错误?
另一个问题:当(A)被选为复数2d数组时,作为列表元素D1,D2 (D1,D11,D2,D21 )的渐近表达式显示为形式'I‘而不是1j的复杂组合。
如何修复这个错误?
另一个问题:由于有大量的方程和未知数,我不可能把"linsolve“写成:
ans = linsolve (D1[0],D1[1],D2[0],D2[1],x1,x2,x3,x4)我需要把它写成:
ans = linsolve (D1,D2,x1:x4)或者像这样的表单。
我该怎么办?谢谢。
发布于 2018-08-14 03:05:44
只有在显式定义Python变量时才会定义它们。您已经定义了指向元组(x1, x2, x3)的变量x,但是您从未定义过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的矢量化特性,并且列表的动态大小特性将使它们更易于操作。
发布于 2018-08-14 07:11:03
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)}https://stackoverflow.com/questions/51796348
复制相似问题