Task2:线性代数(基于Python)

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)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容