Матритсаҳо
Матритсаҳои дақиқ барои чӣ лозиманд
Матритса ҷадвали росткунҷаи ададҳост, ки бо он системаҳои муодилаҳо ва табдилҳои векторҳоро менависанд. Он метавонад гардиши тасвир, робитаи бузургиҳо ё модели ҳаракатро тавсиф кунад. Дар алгебраи таълимӣ нигоҳ доштани касрҳои дақиқ махсусан муҳим аст: гирдкунӣ метавонад муайянкунандаи сифриро пинҳон кунад ё шакли ҷавобро тағйир диҳад.
1. Сохтан, андозаҳо ва индексҳо
Ба Matrix рӯйхати сатрҳоро медиҳанд, ки ҳар кадом рӯйхати элементҳост. Андоза бо шумораи сатрҳо ва сутунҳо муайян мешавад. Индексҳо аз сифр оғоз мешаванд: A[i, j] ба сатри i, сутуни j муроҷиат мекунад. Методҳои row ва col сатр ё сутуни алоҳидаро ҳамчун матритса бармегардонанд.
from sympy import Matrix, Rational, eye, zeros
A = Matrix([[2, Rational(1, 3)], [0, 5]])
print(A.shape)
print(A[0, 1])
print(A.row(1))
print(A.col(0))
print(eye(2))
print(zeros(1, 3))
Натиҷа:
(2, 2)
1/3
Matrix([[0, 5]])
Matrix([[2], [0]])
Matrix([[1, 0], [0, 1]])
Matrix([[0, 0, 0]])
shape ҷуфти андозаҳоро дод. eye(2) матритсаи воҳидӣ сохт: дар диагонал якҳо ва дар дигар ҷойҳо сифрҳо. Он дар зарби матритсавӣ нақши якро мебозад. zeros(1, 3) матритсаи сифрӣ бо як сатр ва се сутун сохт. Буришҳои монанди A[:1, :] имкон медиҳанд, ки қисми ҷадвалро гирем.
2. Амалҳо ва мувофиқати андозаҳо
Матритсаҳои андозаҳояшон якхеларо ҷамъ кардан мумкин аст. Барои ҳосили зарби A*B шумораи сутунҳои A бояд ба шумораи сатрҳои B баробар бошад: ҳар элементи натиҷа аз суммаи ҳосили зарбҳои ҷуфтии сатр ва сутун гирифта мешавад.
Зарби элемент ба элемент амали дигар аст: танҳо элементҳои ҷойҳои якхела зарб мешаванд. Барои он multiply_elementwise мавҷуд аст. Транспозитсия A.T сатрҳо ва сутунҳоро ҷойиваз мекунад.
from sympy import Matrix
A = Matrix([[1, 3], [0, 2]])
B = Matrix([[0, 1], [1, 0]])
print(A + B)
print(A*B)
print(A.multiply_elementwise(B))
print(A.T)
print(A**2)
Натиҷа:
Matrix([[1, 4], [1, 2]])
Matrix([[3, 1], [2, 0]])
Matrix([[0, 3], [0, 0]])
Matrix([[1, 0], [3, 2]])
Matrix([[1, 9], [0, 4]])
Сатрҳои дуюм ва сеюм фарқ мекунанд: зарби матритсавӣ ва зарби элемент ба элемент натиҷаҳои гуногун доданд. Барои массивҳои одии NumPy амали * элемент ба элемент аст, барои Matrix-и SymPy бошад, матритсавӣ. Квадрати A**2 маънои A*A-ро дорад, на ба квадрат бардоштани ҳар элементро. Зарб ба адад, масалан 3*A, ҳар элементро ба ҳамон адад зарб мекунад.
3. Муайянкунанда, матритсаи баръакс ва ранг
Муайянкунанда ададест, ки ба матритсаи квадратӣ вобаста аст. Барои андозаи ду он a*d - b*c мебошад. Муайянкунандаи ғайрисифрӣ маънои баргарданда будани табдилро дорад. Матритсаи баръакс A.inv() векторро аз натиҷаи табдил бозмегардонад; ҳосили зарби он бо A матритсаи воҳидӣ медиҳад.
from sympy import Matrix, eye
A = Matrix([[3, 1], [2, 1]])
print(A.det())
print(A.inv())
print(A*A.inv() == eye(2))
print(A.rank())
Натиҷа:
1
Matrix([[1, -1], [-2, 3]])
True
2
Методи det() қимати дақиқро нигоҳ дошт. Санҷиши ҳосили зарб бо матритсаи баръакс True дод. Ранг шумораи сатрҳо ё сутунҳои мустақил аст. Дар ин ҷо он ба ду баробар аст: ҳеҷ сатр аз дигараш ҳосил намешавад.
Агар муайянкунанда сифр бошад, матритсаи квадратӣ таназзулёфта аст ва матритсаи баръакс надорад. Ин хосияти математикӣ аст, на камбудии китобхона. Агар маълумоти воридотӣ чунин ҳолатро иҷозат диҳад, пеш аз inv онро санҷед.
4. Табдили сатрҳо
Шакли зинагии овардашуда бо табдили сатрҳо ҳосил мешавад: элементи асосии ҳар сатри ғайрисифрӣ як аст ва дар сутуни худ ягона элементи ғайрисифрӣ мебошад. rref() ҷуфтро бармегардонад: матритсаи табдилшуда ва кортежи индексҳои сутунҳои асосӣ.
from sympy import Matrix
A = Matrix([[1, 2, 3], [2, 4, 6]])
R, pivots = A.rref()
print(R)
print(pivots)
print(A.rank())
Натиҷа:
Matrix([[1, 2, 3], [0, 0, 0]])
(0,)
1
Сатри дуюми матритсаи аслӣ аз якум ду баробар калон аст. Баъди хориҷкунӣ як сатри мустақил монд, бинобар ин ранг як аст. Кортежи (0,) ягона сутуни асосиро бо индекси сифр нишон медиҳад, на шумораи сутунҳоро.
5. Қиматҳои хос ва каратҳо
Вектори ғайрисифрии v вектори хос номида мешавад, агар матритса танҳо миқёси онро тағйир диҳад: A*v = lambda*v. Адади lambda қимати хоси мувофиқ аст. Ин бузургиҳо барои омӯхтани табдилҳои такрорӣ ва устувории моделҳо ёрӣ медиҳанд.
Қиматҳои хос решаҳои бисёраъзогии характеристикии det(lambda*I - A) мебошанд. Методи charpoly ин бисёраъзогиро месозад ва eigenvals() луғати «қимат → карати алгебравӣ»-ро бармегардонад.
from sympy import Matrix, symbols
lam = symbols('lam')
M = Matrix([[3, 2], [0, 3]])
print(M.charpoly(lam).as_expr())
print(M.eigenvals())
v = Matrix([1, 0])
print(M*v == 3*v)
Натиҷа:
lam**2 - 6*lam + 9
{3: 2}
True
Бисёраъзогии (lam - 3)**2 як решаи гуногун бо карати ду дорад, бинобар ин дар луғат як калид ҳаст. Агар ҳамаи решаҳои бисёраъзогии характеристикӣ ба назар гирифта шаванд, суммаи каратҳо ба андозаи матритса баробар аст. eigenvects() инчунин векторҳои хосро медиҳад; шумораи самтҳои мустақили онҳо на ҳамеша ба карати алгебравӣ баробар аст.
Ин дар дохил чӣ гуна кор мекунад
Матритса элементҳоро ҳамчун объектҳои SymPy нигоҳ медорад. Алгоритмҳои хориҷкунии сатрҳо бо касрҳои дақиқ ва ифодаҳо кор мекунанд, на ҳатман бо қиматҳои тақрибии даҳӣ. Барои баъзе методҳо ва соҳаҳои коэффитсиентҳо алгоритмҳои махсус интихоб мешаванд, ки афзоиши касрҳои мобайниро кам мекунанд.
Матритса ҳамчун объект ва матни талабшудаи ҷавоб тасвирҳои гуногунанд. print(A)-и одӣ Matrix([...]) чоп мекунад. Агар сатрҳои элементҳо лозим бошанд, онҳоро бо row гирифта, ҳангоми чоп бо ситорача кушодан қулай аст.
from sympy import Matrix, Rational
A = Matrix([[Rational(2, 3), 1], [-2, 5]])
print(A)
for i in range(A.rows):
print(*A.row(i))
Натиҷа:
Matrix([[2/3, 1], [-2, 5]])
2/3 1
-2 5
Хатоҳои маъмул ва ислоҳи онҳо
1. Даъвати inv() барои матритсаи таназзулёфта. Муайянкунандаи сифрӣ маънои набудани матритсаи баръаксро дорад; даъвати мустақим истисно меорад. Ислоҳ ин аст, ки муайянкунандаро санҷида, ин ҳолатро алоҳида коркард кунед.
from sympy import Matrix
A = Matrix([[1, 3], [2, 6]])
print(A.det())
try:
A.inv()
except Exception as err:
print(type(err).__name__)
Натиҷа:
0
NonInvertibleMatrixError
2. Сохтани элементҳои тақрибӣ ба ҷойи дақиқ. Ҳатто адади даҳие, ки нимро дар шакли дуӣ дақиқ ифода мекунад, навъи тақрибиро нигоҳ медорад ва чопи натиҷаро тағйир медиҳад. Агар касрҳо ва ададҳои бутуни дақиқ лозим бошанд, Rational-ро истифода баред.
from sympy import Matrix, Rational
print(Matrix([[0.5]]).inv())
print(Matrix([[Rational(1, 2)]]).inv())
Натиҷа:
Matrix([[2.00000000000000]])
Matrix([[2]])
3. Гум кардани каратҳо ҳангоми паймоиши eigenvals(). Паймоиши калидҳои луғат ҳар қимати гуногунро як бор медиҳад. Агар каратҳо лозим бошанд, қиматҳои луғатро низ бинед. Гумон накунед, ки шумораи калидҳо ҳамеша ба андозаи матритса баробар аст.
from sympy import Matrix
M = Matrix([[3, 2], [0, 3]])
print(list(M.eigenvals()))
print(list(M.eigenvals().items()))
Натиҷа:
[3]
[(3, 2)]
Дар рӯйхати аввал карат гум шудааст. Дар дуюм ба воситаи items() ҷуфтҳои (қимат, карат) нигоҳ дошта шудаанд.
Ёдномаи кӯтоҳ
| Вазифа | Даъват |
|---|---|
| Сохтани ҷадвал | Matrix([[...], [...]]) |
| Андозаҳо | A.shape, A.rows, A.cols |
| Элемент, сатр, сутун | A[i, j], A.row(i), A.col(j) |
| Зарби матритсавӣ / элемент ба элемент | A*B / A.multiply_elementwise(B) |
| Транспозитсия | A.T |
| Муайянкунанда ва матритсаи баръакс | A.det(), A.inv() |
| Ранг ва шакли овардашуда | A.rank(), A.rref() |
| Қиматҳои хос бо каратҳо | A.eigenvals() |
Пеш аз ҳисоб андозаҳо, дақиқии элементҳо ва имкони таназзулро санҷед. Пеш аз барориш аниқ кунед, ки оё сатрҳои матритса ва такрори қиматҳои хос лозиманд.