解决特征值问题的Sympy符号矩阵会返回一个空列表

时间:2018-11-23 15:50:26

标签: python-3.x sympy determinants

我是Python的新手。我会很感激您能提供的任何帮助。我正在尝试解决特征值问题。我有一个矩阵,用一个未知变量'omega'来称呼'data3'和元素。矩阵的行列式将根据'omega'给我特征多项式,从中可以确定所需的根或特征值。

以下是我的代码:

import sympy as sp
import numpy as np
import scipy as sc

omega=sp.Symbol('omega');
data1=sp.Matrix(sc.genfromtxt('./Z_real.csv',dtype=float,delimiter=',')); 
data2=sp.Matrix(sc.genfromtxt('./Z_imag.csv',dtype=float,delimiter=','));
data2a=data2*1j*omega;
data3=sp.Matrix(data1+data2a);

eqn=sp.Eq(sp.det(data3),0);
print(sp.solve(eqn));

如上所述,我导入了data1和data2,然后将它们组合在一起以形成一个复数矩阵(带有需要解决的“ omega”)。例如,当输出到iPython控制台时,我的data3矩阵如下所示:

Matrix([
[             0.536,  -1.119e-8*I*omega, -1.3558e-8*I*omega, -3.8778e-9*I*omega],
[ -1.119e-8*I*omega,              0.536, -3.8778e-9*I*omega, -1.3558e-8*I*omega],
[-1.3558e-8*I*omega, -3.8778e-9*I*omega,              0.536,  -1.119e-8*I*omega],
[-3.8778e-9*I*omega, -1.3558e-8*I*omega,  -1.119e-8*I*omega,              0.536]])

但是,代码的sp.solve(eqn)行为我返回了一个空列表。我希望看到的是矩阵多项式的根(来自行列式)。有人可以告诉我我做错了什么吗?同样,如果有人可以向我展示解决“欧米茄”的其他方法,那也很好。如果需要有关data1和data2的信息,以下是我用于测试的矩阵:

data1

Matrix([
[0.536,   0.0,   0.0,   0.0],
[  0.0, 0.536,   0.0,   0.0],
[  0.0,   0.0, 0.536,   0.0],
[  0.0,   0.0,   0.0, 0.536]])

和数据2

Matrix([
[       0.0,  -1.119e-8, -1.3558e-8, -3.8778e-9],
[ -1.119e-8,        0.0, -3.8778e-9, -1.3558e-8],
[-1.3558e-8, -3.8778e-9,        0.0,  -1.119e-8],
[-3.8778e-9, -1.3558e-8,  -1.119e-8,        0.0]])

非常感谢您的宝贵时间。

1 个答案:

答案 0 :(得分:0)

感谢您阅读这篇文章的任何人。我现在已经解决了这个问题。与直接求解矩阵的特征多项式相比,我发现,以多项式方程形式获取行列式(现在使用Berkowitz算法-没有特殊原因)要容易得多,使用sympy Poly提取多项式的系数,然后插入numpy roots函数内部的根。奇迹般有效!请找到以下代码(我导入的数据无关,该方法适用于任何sympy矩阵):

import numpy as np
import scipy as sc
import sympy as sp
import csv

omega=sp.Symbol('omega');
data_Za=sp.Matrix(sc.genfromtxt('./Z_matrix.csv',dtype=float,delimiter=','));
L_mata=sp.Matrix(sc.genfromtxt('./L_mat.csv',dtype=float,delimiter=','));
C_mata=sp.Matrix(sc.genfromtxt('./C_mat.csv',dtype=float,delimiter=','));
N_total=int(sc.genfromtxt('./N_total.csv',dtype=float,delimiter=','));

data_Z=data_Za*omega;
L_mat=L_mata*omega;
C_mat=C_mata*(1/omega);

data_matrix=data_Z+L_mat+C_mat;
det_eqn=data_matrix.berkowitz_det();

这是我导入矩阵,将它们相加以获得我想要的最终矩阵并计算行列式的方法-直到这里都没有新内容。

det_poly_coeff=sp.Poly(det_eqn*(omega**N_total),omega);
#print(det_poly_coeff.coeffs());

我使用的矩阵有点复杂,因为您可以看到我对C_mat所做的工作,因此我将得出行列式(特征多项式)的项,即使在分母中也具有变量omega 。 Sympy的Poly函数不喜欢这样。因此,我最终将行列式与omega**N_total相乘,其中N_total是多项式方程的阶数(也是分母中ω的最高阶)。

root_find_sq=np.roots(det_poly_coeff.coeffs());
#print(root_find_sq);

将系数放到numpy根中可以得到方程式的根,这是我想求解的值。

root_find=np.sqrt(abs(root_find_sq));

最后是平方根,因为求解的根是omega**2的根,而不是omega的根。

希望其他人可能对此问题有帮助。干杯。 :)