Python: точность вычислений при расчете ядра матрицы - PullRequest
0 голосов
/ 19 ноября 2018

Проблема в следующем: у меня есть уравнение: A * x = 0, где A - матрица 8x8, x - вектор с 8 элементами, а 0 - нулевой вектор.Элементы матрицы A содержат параметр E, значения которого, для которых уравнение разрешимо, я должен найти - и я уже сделал это, используя условие: det (A) = 0.И есть источник моей проблемы - det (A) для найденных значений E не точно 0.0, но что-то очень, очень близко к 0.0, например 9.5e-12.Я интерпретирую это как числовую проблему, но я могу ошибаться?Следующий шаг - найти х.Моя концепция состояла в том, чтобы найти ядро ​​матрицы A, но там моя проблема с ненулевым возвратом det (A), потому что у меня нет E, для которого моё уравнение может быть решено.Можно ли заставить Python работать с приблизительными значениями?

Подводя итог: мне нужно найти метод для определения ядра, когда A * x не совсем 0,0, но значение очень, очень близко к 0,0.

Редактировать: Значение матрицы: [[6.60489454233399, -0.000899873003155720, -1111.26791946547, 0, 0, 0, 0, 0], [8.46748025849121e-8 + 2.5809235665861e-7 * I, -9.08063389853990e-10, 0.00112138236223004, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,635021913463456, +1,57474880598360, -1,95244188971305, -0,512179135916290, 0, 0, 0], [0, 6.40801701294518e-7, -1.58908171921515e-6, 2.90298102267184e-6, -7.61531659204450e-7, 0, 0, 0],[0, 0, 0, 0,512179135916290, 1,95244188971305, -1,57474880598360, -0,635021913463456, 0], [0, 0, 0, -7.61531659204450e-7, 2.90298102267184e-6, -1.58908171915, 6151801011915], [0, 0, 0, 0, 0, 784198.968204183, 1.27518657961257e-6, -38.6053002011412], [0, 0, 0, 0, 0,791336522920740, -1.28679296313874e-12, -1.04862603277821e-5])

И пример кода:

from scipy import *
from numpy.linalg import *
from sympy import *
import sys
import numpy
import cmath
import math

a2= 65e5 #Ae-5
a3= 9e5 #Ae-5
a4= 130e5 #Ae-5

l = -a2-a3/2.0
t = -a3/2.0
f = a3/2.0
g = a4+a3/2.0

print 'Defined thickness'


V1= 0.74015 #eV fabs
V2= 1.1184 #eV fabs
V3= 0.74015 #eV fabs

m= 0.11*0.511e6/(2.99792458e+23)**2 #eV*s**2/A**2

hkr= 6.582119514e-16 #eV*s

x= 0.765705051154



print 'other symbols'

k1=(cmath.sqrt(2.0*(V1-x)*m))/hkr
k2=(cmath.sqrt(2.0*(V2-x)*m))/hkr
k3=(cmath.sqrt(-2.0*x*m))/hkr
k4=(cmath.sqrt(2.0*(V2-x)*m))/hkr
k5=(cmath.sqrt(2.0*(V3-x)*m))/hkr

print 'k-vectors'

a11 = cmath.exp(1.0j*k1*l)
a12 = -1.0*cmath.exp(k2*l)
a13 = -1.0*cmath.exp(-k2*l)

print '1st row'

a21 = 1.0j*k1*cmath.exp(k1*l)
a22 = -k2*cmath.exp(k2*l)
a23 = k2*cmath.exp(-k2*l)

print '2nd row'

a32 = cmath.exp(k2*t)
a33 = cmath.exp(-k2*t)
a34 = -1.0*cmath.exp(1.0j*k3*t)
a35 = -1.0*cmath.exp(-1.0j*k3*t)

print '3rd row'

a42 = k2*cmath.exp(k2*t)
a43 = -k2*cmath.exp(-k2*t)
a44 = -1.0j*k3*cmath.exp(1.0j*k3*t)
a45 = 1.0j*k3*cmath.exp(-1.0j*k3*t)

print '4th row'

a54 = cmath.exp(1.0j*k3*f)
a55 = cmath.exp(-1.0j*k3*f)
a56 = -1.0*cmath.exp(k4*f)
a57 = -1.0*cmath.exp(-k4*f)

print '5th row'

a64 = 1.0j*k3*cmath.exp(1.0j*k3*f)
a65 = -1.0j*k3*cmath.exp(-1.0j*k3*f)
a66 = -k4*cmath.exp(k4*f)
a67 = k4*cmath.exp(-k4*f)

print '6th row'

a76 = cmath.exp(k4*g)
a77 = cmath.exp(-k4*g)
a78 = -1.0*cmath.exp(-1.0j*k5*g)

print '7th row'

a86 = k4*cmath.exp(k4*g)
a87 = -k4*cmath.exp(-k4*g)
a88 = 1.0j*k5*cmath.exp(-1.0j*k5*g)
print '8th row'


M = Matrix([[a11,a12,a13,0,0,0,0,0],
        [a21,a22,a23,0,0,0,0,0],
        [0,a32,a33,a34,a35,0,0,0],      
        [0,a42,a43,a44,a45,0,0,0],
        [0,0,0,a54,a55,a56,a57,0],
        [0,0,0,a64,a65,a66,a67,0],            
        [0,0,0,0,0,a76,a77,a78],
        [0,0,0,0,0,a86,a87,a88]])


v=M.nullspace()
m=lcm([val.q for val in v])
PSI=m*v
print M
print PSI
...