You are on page 1of 7

Đại số tuyến tính với numpy

1. Import module numpy


import numpy as np

2. Array và Matrix
Có 2 cách để khai báo ma trận và vector: sử dụng array và sử dụng matrix

A= B=

a. Sử dụng array

>>> a = np.array([[1,2],[3,4]])

Kết quả:

array([[1, 2],

[3, 4]])

>>> b = np.array([[11,12],[13,14]])

Kết quả

array([[11, 12],

[13, 14]])

Tích 2 ma trận A.B


>>> np.dot(a,b)

Kết quả:
array([[37, 40],

[85, 92]])

Giải thích:
So sánh kết quả thu được với phép toán nhân (*)
>>> a*b

array([[11, 24],

[39, 56]])

Giải thích: phép toán * trên 2 array sẽ nhân các phần tử tương ứng với nhau

1 ∗ 11 2 ∗ 12 11 24
𝑎∗𝑏 =% *=% *
3 ∗ 13 4 ∗ 14 39 46

So sánh tiếp với 1 phép toán khác: inner

>>> np.inner(a,b)

array([[35, 41],

[81, 95]])

Giải thích kết quả

Hàm inner lấy các vector theo hàng và tính tích vô hướng của chúng.

b. Sử dụng Matrix
Tạo ma trận
Tạo ma trận bằng truyền vào một danh sách các hàng (list of list)
>>> A = np.matrix([[1, 2], [3, 4], [5, 6]])

>>> A

matrix([[ 1, 2],

[ 3, 4],

[ 5, 6]])

Ta cũng có thể tạo ma trận dùng chuỗi thay vì dùng danh sách (list)
>>> B = np.matrix("1, 2; 3, 4; 5 6")

>>> B

matrix([[ 1, 2],

[ 3, 4],

[ 5, 6]])

Dấu “;” dùng để ngăn cách các hàng với nhau.


Vector: tạo giống như Ma trận
>>> x = np.matrix("10, 20")

>>> x

matrix([[ 10, 20]])

>>> x.T

matrix([[10],

[20]])

Ví dụ trên tạo ra vector x (x là vector hàng) [10 20]


Để tìm chuyển vị của x ta sử dụng x.T

Hàng và cột của x và x.T


>>> x.shape

(1, 2)

>>> x.T.shape

(2, 1)

Nhân ma trận
Khi sử dụng numpy.matrix ta có thể phép toán nhân bình thường (*) để nhân ma trận – ma
trận, ma trân – vector

>>> x = np.matrix("4; 5")

>>> x

matrix([[4],

[5]])

>>> A = np.matrix([[1, 2], [3, 4], [5, 6]])

>>> A

matrix([[1, 2],

[3, 4],

[5, 6]])

>>> A*x

matrix([[14],

[32],

[50]])
Giải thích kết quả
1 2 1∗4+2∗5 14
4
𝐴 ∗ 𝑥 = /3 41 % * = /3 ∗ 4 + 4 ∗ 51 = /321
5
5 6 5∗4+6∗5 50

Vậy: phép toán nhân (*) trên 2 matrix thực hiện nhân ma trận trong lý thuyết, tương đương
phép toán dot() trên 2 array.

>>> np.dot(A,x)

matrix([[14],

[32],

[50]])

Hàm numpy.dot() trên 2 ma trận cho kết quả giống với phép toán nhân (*).

Chú ý: Khi sử dụng matrix để biểu diễn vector, ta cần phải dùng 2 chỉ số (như ma trận )để lấy
phần tử của nó.

>>> x

matrix([[4],

[5]])

>>> x[0,0]

>>> x[1,0]

Nhận xét: matrix phù hợp hơn array khi làm việc với ma trận và vector.
Ta có thể chuyển đổi dễ dàng từ matrix về array và ngược lại.
>>> A

matrix([[1, 2],

[3, 4],

[5, 6]])

>>> A.A

array([[1, 2],

[3, 4],

[5, 6]])

>>> x

matrix([[4],

[5]])

>>> x.A

array([[4],

[5]])

Hạng của ma trận


matrix_rank(A) = số cột độc lập tuyến tính của A = số hàng độc lập tuyến tính của A
>>> A = np.ones((4,3))

>>> A

array([[ 1., 1., 1.],

[ 1., 1., 1.],

[ 1., 1., 1.],

[ 1., 1., 1.]])

>>> np.linalg.matrix_rank(A)

Trong ví dụ trên ta có 4 hàng, 3 cột nhưng 3 cột này giống hệt nhau. Vì thế, chỉ có 1 cột là
độc lập, 2 cột còn lại phụ thuộc vào cột này.
3. Giải hệ phương trình tuyến tính
Cho hệ phương trình: Ax = b
Tìm x.
Sử dụng hàm numpy.linalg.solve().
>>> from numpy.linalg import solve

>>> A = np.array([[1,2],[3,4]])

>>> A

array([[1, 2],

[3, 4]])

>>> b = np.array([10, 20])

>>> b

>>> x = solve(A,b)

>>> x

array([ 0., 5.])

Chú ý:
- Đầu vào của hàm solve là 2 array. Kết quả trả về là 1 array. Nếu b là 1 matrix thì cần
phải chú ý số hàng và số cột của nó.
- Nếu truyền đầu vào là 2 matrix, thì kết quả là 1 matrix.
- Nếu ma trận A có định thức bằng 0 (A là ma trận singular) hoặc A không vuông, hàm
sẽ báo lỗi LinAlgError. Lúc đó, có thể sử dụng hàm numpy.linalg.lstsq để tìm nghiệm
gần đúng.

Ứng dụng 1
Cho hệ phương trình
3x0 + x1 = 9
x0 + 2x1 = 8
Hãy viết các lệnh cần thiết để tìm x0 và x1

Ứng dụng 2
Công ty Ace Novelty muốn sản xuất 3 loại sản phẩm A, B và C.
- Để sản xuất được 1 sản phẩm A cần: 2 phút trên máy I, 1 phút trên máy II và 2 phút
trên máy III.
- Để sản xuất được 1 sản phẩm B cần: 1 phút trên máy I, 3 phút trên máy II và 1 phút
trên máy III
- Để sản xuất được 1 sản phẩm C cần: 1 phút trên máy I, 2 phút trên máy II và 2 phút
trên máy III.
Hiện nay, máy I có thể sử dụng được 3 giờ, máy II được 5 giờ và máy III được 4 giờ.
Hỏi: có thể sản xuất được bao nhiêu sản phẩm loại A, loại B và loại C.

Mô hình hoá bài toán về hệ phương trình tuyến tính. Sau đó dùng python để giải.
Tóm tắt:

Gợi ý: gọi x, y, z là số sản phẩm từng loại

4. Giá trị riêng, vector riêng

>>> from numpy.linalg import eig

>>> A = np.array([[1,2],[3,4]])

>>> eig(A)

(array([-0.37228132, 5.37228132]), array([[-0.82456484, -0.41597356],

[ 0.56576746, -0.90937671]]))

Hàm eig trả về 1 bộ (tuple) 2 giá trị (2 array). Để tách 2 giá trị này vào 2 biến riêng biệt ta sử
dụng:
>>> eigen_val, eigen_vec = eig(A)

>>> eigen_val

array([-0.37228132, 5.37228132])

>>> eigen_vec

array([[-0.82456484, -0.41597356],

[ 0.56576746, -0.90937671]])

Ứng dụng
Xét các điểm (x, y) trên vòng tròn tâm O(0,0) bán kính 1. Với mỗi điểm (x, y), ta thực hiện
phép biến đổi sau:
x’ = 2x + y
y’ = x + 4y

Tìm điểm x, y trên vòng tròn, sao cho (x’)2 + (y’)2 lớn nhất.
Gợi ý: chuyển bài toán về bài toán tìm vector u = (x, y) sao cho ||z||2 lớn nhất với z là Au.

Dùng python để viết chương trình tìm (x, y)

You might also like