首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求解具有复系数的大型方程组,N个equations_N未知数(如numbered_symbols [x1,x2,x3,..] )

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

Stack Overflow用户
提问于 2018-08-11 12:01:00
回答 2查看 455关注 0票数 0

通过双"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中使用矩阵。以下是解释该问题的最低代码:

代码语言:javascript
运行
复制
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“写成:

代码语言:javascript
运行
复制
ans = linsolve (D1[0],D1[1],D2[0],D2[1],x1,x2,x3,x4)

我需要把它写成:

代码语言:javascript
运行
复制
ans = linsolve (D1,D2,x1:x4)

或者像这样的表单。

我该怎么办?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-14 03:05:44

只有在显式定义Python变量时才会定义它们。您已经定义了指向元组(x1, x2, x3)的变量x,但是您从未定义过Python变量x1、x2和x3。确保您理解Python变量和SymPy符号之间的区别。This guide应该能帮上忙。

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

代码语言:javascript
运行
复制
x1, x2, x3, x4 = x = symbols('x1:4')

如前所述,这也会将x设置为整个元组。

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

代码语言:javascript
运行
复制
linsolve([*D1, *D2], *x)

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

票数 1
EN

Stack Overflow用户

发布于 2018-08-14 07:11:03

代码语言:javascript
运行
复制
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)

答案:

代码语言:javascript
运行
复制
{(-346.682690175513 - 221.750958290075*I, 197.37151730263 - 237.866928341266*I, -233.916687288553 - 10.5779385566957*I, 334.096855104832 + 335.268786804827*I)}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51796348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档