python解线性方程组
(使用Numpy库只需要传入对应的系数矩阵A以及常熟向量b)import numpy as np
A=np.array([[1,1],
[2,4]]) # 将系数所有向量拼在一起
b=np.array([10,
28]) #常数向量
x=np.linalg.solve(A,b) #解线性方程组
print("线性方程组的解为:\n",x)
求解多元方程组
使用1中的代码不可行,有多少个未知数就需要多少个方程import numpy as np
A=np.array([[1,1,1],
[2,4,2],
[2,2,2]]) # 将系数所有向量拼在一起
b=np.array([14,
40,
28]) #常数向量
x=np.linalg.solve(A,b) #解线性方程组
print("线性方程组的解为:\n",x)
#使用这个代码依然会报错,LinAlgError: Singular matrix
#说明系数矩阵是奇异的,也就是说有一个式子的信息对解方程起不到任何作用,它的信息已经囊括在第一个式子中
判断一个方程组有唯一解:
- n个未知数要有n个方程
- 可以使用线性无关去判断是否为有效的方程
#计算系数矩阵A的行列式
A=np.array([[1,1,1],
[2,4,2],
[2,2,2]])
np.linalg.det(A) #计算方阵A的行列式
print("A的行列式的值为:",np.linalg.det(A))
B=np.array([[1,1,1,1],
[1,2,0,0],
[1,0,3,0],
[1,0,0,4]])
B_det=np.linalg.det(B)
print("B的行列式的值为:",B_det)
#若系数行列式不等于0,且未知数个数等于方程的个数,则说明这个方程组是有唯一解的
克莱默法则
#使用python实现克拉默法则
D=np.array([[2,1,-5,1],[1,-3,0,-6],[0,2,-1,2],[1,4,-7,6]])
D_det = np.linalg.det(D)
D1=np.array([[8,1,-5,1],[9,-3,0,-6],[-5,2,-1,2],[0,4,-7,6]])
D1_det = np.linalg.det(D1)
D2=np.array([[2,8,-5,1],[1,9,0,-6],[0,-5,-1,2],[1,0,-7,6]])
D2_det = np.linalg.det(D2)
D3=np.array([[2,1,8,1],[1,-3,9,-6],[0,2,-5,2],[1,4,0,6]])
D3_det = np.linalg.det(D3)
D4=np.array([[2,1,-5,8],[1,-3,0,9],[0,2,-1,-5],[1,4,-7,0]])
D4_det = np.linalg.det(D4)
x1=D1_det/D_det
x2=D2_det/D_det
x3=D3_det/D_det
x4=D4_det/D_det
print("克拉默法则解线性方程组的解为:\n x1={:.2f},\n x2={:.2f},\n x3={:.2f},\n x4={:.2f}".format(x1,x2,x3,x4))
矩阵运算
(1)矩阵乘法
#矩阵的乘法
A = np.array([[1, 2],
[1, -1]])
B = np.array([[1, 2, -3],
[-1, 1, 2]])
print("A的规模{}".format(A.shape))
print("B的规模{}".format(B.shape))
# 计算AB
print("AB=\n{}".format(np.matmul(A, B)))
(2)矩阵加法
#矩阵的加法
A = np.array([[1, 2],
[1, -1]])
C = np.array([[1, 2],
[3, 4]])
print("A+C = \n", A + C) # A+C
print("3*A = \n", 3 * A) # 3*A
(3)单位矩阵
#单位矩阵
print("B =\n", B,"\n", "E = \n", np.eye(3)) # 3阶单位阵
np.matmul(B, np.eye(3))
(4)初等矩阵及其变换
#初等矩阵
A = np.array([[1, 1, 1],
[2, 4, 2]])
print("A = \n", A)
#初等变换 左乘P
P = np.array([[0, 1],
[1, 0]])
np.matmul(P, A) # 交换了矩阵的两行
#第一行乘2
P = np.array([[2, 0],
[0, 1]])
np.matmul(P, A)
#把第一行加到第二行
P = np.array([[1, 0],
[1, 1]])
np.matmul(P, A)
#左乘与右乘的对比
A = np.array([[1, 2],
[3, 4]])
P = np.array([[0, 1],
[1, 0]])
print("交换两行:\n", np.matmul(P, A))
print("交换两列:\n", np.matmul(A, P))
(5)矩阵的逆
#求矩阵的逆
import numpy as np
A = np.array([[1, 2], [3, 4]])
print(np.linalg.det(A),"行列式不为0,非奇异阵") # 检验是否奇异
print("A的逆矩阵:\n", np.linalg.inv(A)) # 矩阵求逆
A_inv = np.linalg.inv(A)
print("验证AA_inv = E \n", np.matmul(A, A_inv))
####################################################
B = np.array([[0, 1],
[0, -1]])
print(np.linalg.det(B),"行列式为0,奇异阵") # 检验是否奇异
# print("B的逆矩阵:\n", np.linalg.inv(B)) # 直接求逆会报错
print(np.linalg.pinv(B)) #广义的逆
print(np.matmul(np.matmul(B, np.linalg.pinv(B)),B)) # 验证广义逆的定义
求解特征值和特征向量
#使用python求解矩阵的特征值和特征向量
A=np.array([[-2,1,1],
[0,2,0],
[-4,1,3]])
lamb,p=np.linalg.eig(A)
print("矩阵A的特征值为:",lamb)
print("矩阵A的特征向量为:\n",p)
print("矩阵A对角化为:\n",np.matmul(np.linalg.inv(p),np.matmul(A,p))) #P逆AP
#小的数值可以直接看作0
# 数值过滤
res = np.matmul(np.linalg.inv(p),np.matmul(A,p))
res[np.abs(res) <1e-6] = 0 # 将绝对值小于10的-6次方的值设为0
print(res)
A=np.array([[-1,1,0],
[-4,3,0],
[1,0,2]])
lamb,p=np.linalg.eig(A)
print("矩阵A的特征值为:",lamb)
print("矩阵A的特征向量为:\n",p)
print("矩阵A对角化为:\n",np.matmul(np.linalg.inv(p),np.matmul(A,p))) #P逆AP
#小的数值可以直接看作0
# 数值过滤
res = np.matmul(np.linalg.inv(p),np.matmul(A,p))
res[np.abs(res) <1e-6] = 0 # 将绝对值小于10的-6次方的值设为0
print(res)
斯密特正交化
#斯密特正交化将一组基变成标准正交基
from scipy.linalg import *
A=np.array([[1,2,3],[2,1,3],[3,2,1]])
B=orth(A) #正交化,奇异值分解不是施密特正交化
print(np.matmul(B,np.transpose(B))) #输出单位矩阵
#数值过滤
res=np.matmul(B,np.transpose(B))
res[np.abs(res)<1e-6]=0
print(res)
实战——基于矩阵变换的图像变换
# 在------------位置补全代码
import numpy as np
from math import cos, sin, pi
def vec_2d(x0, y0, alpha):
"""
旋转2维向量.
x0: 横坐标.
y0: 纵坐标.
alpha: 旋转角度,弧度制.
return:(x,y) 旋转后的坐标.
"""
origin = np.array([[x0, y0, 1]])
Trans = np.array([[cos(alpha), -sin(alpha), 0],
[sin(alpha), cos(alpha), 0],
[0, 0, 1]])
res =origin.dot(Trans)
x=res[0,:2][0]
y=res[0,:2][1]
return (x, y)
vec_2d(3, 2, pi/2)
# 图像旋转的矩阵
def Trans(x0, y0, W, H, alpha):
origin = np.array([[x0, y0, 1]])
res = origin.dot(np.array([[cos(alpha), sin(alpha), 0],
[-sin(alpha), cos(alpha), 0],
[-0.5*W*cos(alpha) + 0.5*H*sin(alpha) + 0.5*W, -0.5*W*sin(alpha) - 0.5*H*cos(alpha) + 0.5*H, 1]]))
return (int(res[0,:2][0]),int(res[0,:2][1]))
from skimage import io, data
img3 = data.horse()
io.imshow(img3)
img3.shape
img4 = np.zeros((400, 400))
for x in range(img3.shape[0]):
for y in range(img3.shape[1]):
x1, y1 = Trans(x, y, 328, 400, pi/2)
img4[x1-355, y1] = img3[x, y] # 335是做了一步平移居中,保证画面完整性
io.imshow(img4)
使用skimage库中内置函数transform.rotate对图像进行旋转
from skimage import io, transform
import matplotlib.pyplot as plt
dirpath = "E:/learning group/datawhale/__init_Modeling__-main/线性代数/figures/2-6.jpg"
img = io.imread(dirpath) #读取数据
plt.imshow(img)
img.shape
# 旋转图像
#img2 = transform.rotate(img,90,resize=False) #旋转90度,不改变图像大小
img2 = transform.rotate(img,90,resize=True) #旋转90度,跟着改变图像大小
plt.imshow(img2)