我是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]])
非常感谢您的宝贵时间。
答案 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
的根。
希望其他人可能对此问题有帮助。干杯。 :)