Pertanyaan Matikan matriks simbolik


Saya perlu mendiagonalisasi matriks simbolis dengan python. Dalam Mathematica dapat dilakukan dengan mudah, tetapi ketika menggunakan modul numpy.linalg Saya mendapat masalah.

Untuk konkrit, pertimbangkan matriks

[[2, x], [x, 3]]

dimana x adalah variabel simbolik. Saya kira saya mendapat masalah karena paket numpy disediakan untuk perhitungan numerik, bukan simbolis, tetapi saya tidak dapat menemukan cara melakukannya dengan sympy.


4
2017-09-09 15:56


asal


Jawaban:


Anda dapat menghitungnya dari nilai eigen, tetapi sebenarnya ada metode yang akan melakukannya untuk Anda, diagonalize

In [13]: M.diagonalize()
Out[13]:
⎛                                        ⎡     __________                       ⎤⎞
⎜                                        ⎢    ╱    2                            ⎥⎟
⎜⎡      -2⋅x                2⋅x       ⎤  ⎢  ╲╱  4⋅x  + 1    5                   ⎥⎟
⎜⎢─────────────────  ─────────────────⎥, ⎢- ───────────── + ─          0        ⎥⎟
⎜⎢   __________         __________    ⎥  ⎢        2         2                   ⎥⎟
⎜⎢  ╱    2             ╱    2         ⎥  ⎢                                      ⎥⎟
⎜⎢╲╱  4⋅x  + 1  - 1  ╲╱  4⋅x  + 1  + 1⎥  ⎢                        __________    ⎥⎟
⎜⎢                                    ⎥  ⎢                       ╱    2         ⎥⎟
⎜⎣        1                  1        ⎦  ⎢                     ╲╱  4⋅x  + 1    5⎥⎟
⎜                                        ⎢         0           ───────────── + ─⎥⎟
⎝                                        ⎣                           2         2⎦⎠

M.diagonalize() mengembalikan sepasang matriks (P, D) seperti yang M = P*D*P**-1. Jika tidak dapat menghitung nilai eigen yang cukup, baik karena matriks tidak dapat didiagonalisasi atau karena solve() tidak dapat menemukan semua akar dari polinomial karakteristik, itu akan meningkat MatrixError.

Lihat juga bagian ini dari tutorial SymPy.


7
2017-09-09 22:09



Dengan asumsi matriks dapat didiagonalisasi, Anda bisa mendapatkan vektor eigen dan nilai eigen dengan

from sympy import *
x = Symbol('x')
M = Matrix([[2,x],[x,3]])
print M.eigenvects()
print M.eigenvals()

Memberi:

[(-sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(sqrt(4*x**2 + 1)/2 - 1/2)]
[                            1]]), (sqrt(4*x**2 + 1)/2 + 5/2, 1, [[-x/(-sqrt(4*x**2 + 1)/2 - 1/2)]
[                             1]])]
{sqrt(4*x**2 + 1)/2 + 5/2: 1, -sqrt(4*x**2 + 1)/2 + 5/2: 1}

Anda harus memeriksa dokumentasi, ada banyak dekomposisi lain yang terdaftar di sana.

Perhatikan bahwa tidak semua matriks dapat didiagonalisasi, tetapi Anda dapat menempatkan setiap matriks ke dalamnya Jordan Normal Form menggunakan perintah sympy .jordan_form.


2
2017-09-09 19:35