线性代数及其应用(David C. Lay)笔记--1.1线性方程组

线性代数笔记

第1章 线性代数中的线性方程组


1.1线性方程组

线性方程组的定义

解集,三种情况:无解、唯一解、无穷多解

线性方程组可以用矩阵表示:系数矩阵、增广矩阵

解线性方程组思路:等价变换(化简)

化简线性方程组的三种基本变换:

  • 这里用method,i,j,k表示,method<0:行变换;method>0:列变换。
  • |method|=1表示用k乘某一行(列);|method|=2表示两行(列)互换;
  • |method|=3表示将i行(列)乘以数k后加到j行(列)上。i,j均从0开始。

线性方程组的变换对应于增广矩阵的初等变换:

  • 倍加变换、对换变换、倍乘变换

2个线性方程组的增广矩阵是行等价的,则它们有相同的解集(想一下为什么)

线性方程组的2个基本问题:是否相容,有解的话解是否唯一

练习题
3.数组(3,4,-2)是否为下列方程组的解?

\left\{ \begin{aligned} 5 \times x_1-x_2+2 \times x_3=7\\ -2 \times x_1+6 \times x_2+9 \times x_3=0\\ -7 \times x_1+5 \times x_2-3 \times x_3=-7 \end{aligned} \right.

为解线性方程组,编写代码如下,可通过transform_matrix函数对增广矩阵进行初等变换。解题步骤在代码后面。

import numpy as np
def transform_matrix(matrix,method=0,i=0,j=0,k=1):
    #method=0:不作变换;method<0:行变换;method>0:列变换
    #|method|=1表示用k乘某一行(列);|method|=2表示两行(列)互换;|method|=3表示将i行(列)乘以数k后加到j行(列)上
    #i,j均从0开始
    #1.生成初等矩阵
    if method==0:
        return matrix
    elif method<0:
        if i<0 or i>=matrix.shape[0]:
            print("error i")
        if j<0 or j>=matrix.shape[0]:
            print("error j")
    elif method>0:
        if i<0 or i>=matrix.shape[1]:
            print("error i")
        if j<0 or j>=matrix.shape[1]:
            print("error j")
    d=matrix.shape[0] if method<0 else matrix.shape[1]
    A=np.eye(d)
    if abs(method)==1:
        A[i,i]=k
    elif abs(method)==2:
        A[i,j]=1
        A[j,i]=1
        A[i,i]=0
        A[j,j]=0
    elif method==-3:
        A[j,i]=k
    elif method==3:
        A[i,j]=k
    else:
        print("method error")
        return matrix
    if method<0:
        ret=np.matmul(A,matrix)
        return ret
    elif method>0:
        ret=np.matmul(matrix,A)
        return ret
    else:
        return matrix
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]);a
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
b=transform_matrix(a,-1,2,0,10.5);b
array([[  1. ,   2. ,   3. ,   4. ],
       [  5. ,   6. ,   7. ,   8. ],
       [ 94.5, 105. , 115.5, 126. ]])
c=transform_matrix(b,-2,1,2,0);c
array([[  1. ,   2. ,   3. ,   4. ],
       [ 94.5, 105. , 115.5, 126. ],
       [  5. ,   6. ,   7. ,   8. ]])
d=transform_matrix(c,-3,0,2,10);d
array([[  1. ,   2. ,   3. ,   4. ],
       [ 94.5, 105. , 115.5, 126. ],
       [ 15. ,  26. ,  37. ,  48. ]])

练习题3解题步骤:

a=np.array([[5,-1,2,7],[-2,6,9,0],[-7,5,-3,-7]]);a
array([[ 5, -1,  2,  7],
       [-2,  6,  9,  0],
       [-7,  5, -3, -7]])
b=transform_matrix(a,-3,0,1,2/5);b
array([[ 5. , -1. ,  2. ,  7. ],
       [ 0. ,  5.6,  9.8,  2.8],
       [-7. ,  5. , -3. , -7. ]])
c=transform_matrix(b,-3,0,2,7/5);c
array([[ 5. , -1. ,  2. ,  7. ],
       [ 0. ,  5.6,  9.8,  2.8],
       [ 0. ,  3.6, -0.2,  2.8]])
d=transform_matrix(c,-3,1,2,-3.6/5.6);d
array([[ 5. , -1. ,  2. ,  7. ],
       [ 0. ,  5.6,  9.8,  2.8],
       [ 0. ,  0. , -6.5,  1. ]])
e=transform_matrix(d,-3,2,1,9.8/6.5);e
array([[ 5.00000000e+00, -1.00000000e+00,  2.00000000e+00,
         7.00000000e+00],
       [ 0.00000000e+00,  5.60000000e+00, -1.89421128e-15,
         4.30769231e+00],
       [ 0.00000000e+00,  0.00000000e+00, -6.50000000e+00,
         1.00000000e+00]])

出问题了,是舍入误差导致的,想了半天没找到从程序上根本解决的办法,只有迂回解决了:

e=transform_matrix(d,-1,1,0,65);e
array([[  5. ,  -1. ,   2. ,   7. ],
       [  0. , 364. , 637. , 182. ],
       [  0. ,   0. ,  -6.5,   1. ]])
f=transform_matrix(e,-1,2,0,98);f
array([[   5.,   -1.,    2.,    7.],
       [   0.,  364.,  637.,  182.],
       [   0.,    0., -637.,   98.]])
g=transform_matrix(f,-3,2,1,1);g
array([[ 5.00000000e+00, -1.00000000e+00,  2.00000000e+00,
         7.00000000e+00],
       [ 0.00000000e+00,  3.64000000e+02, -1.13686838e-13,
         2.80000000e+02],
       [ 0.00000000e+00,  0.00000000e+00, -6.37000000e+02,
         9.80000000e+01]])

还是不行,通过调试发现从d=transform_matrix(c,-3,1,2,-3.6/5.6)的执行过程中已产生了误差,d[2,2]=-6.500000000000001。百度关键词numpy 舍入误差,找到《numpy矩阵求逆舍入误差(numpy matrix inversion rounding errors)》,通过在程序中加入np.set_printoptions(suppress=True)即可改进显示效果。

np.set_printoptions(suppress=True)
g
array([[   5.,   -1.,    2.,    7.],
       [   0.,  364.,   -0.,  280.],
       [   0.,    0., -637.,   98.]])
h=transform_matrix(g,-3,2,0,2/637);h
array([[   5.        ,   -1.        ,   -0.        ,    7.30769231],
       [   0.        ,  364.        ,   -0.        ,  280.        ],
       [   0.        ,    0.        , -637.        ,   98.        ]])
i=transform_matrix(h,-3,1,0,1/364);i
array([[   5.        ,    0.        ,   -0.        ,    8.07692308],
       [   0.        ,  364.        ,   -0.        ,  280.        ],
       [   0.        ,    0.        , -637.        ,   98.        ]])
j=transform_matrix(i,-1,0,0,1/5);j
array([[   1.        ,    0.        ,   -0.        ,    1.61538462],
       [   0.        ,  364.        ,   -0.        ,  280.        ],
       [   0.        ,    0.        , -637.        ,   98.        ]])
k=transform_matrix(j,-1,1,0,1/364);k
array([[   1.        ,    0.        ,   -0.        ,    1.61538462],
       [   0.        ,    1.        ,   -0.        ,    0.76923077],
       [   0.        ,    0.        , -637.        ,   98.        ]])
l=transform_matrix(k,-1,2,0,-1/637);l
array([[ 1.        ,  0.        , -0.        ,  1.61538462],
       [ 0.        ,  1.        , -0.        ,  0.76923077],
       [ 0.        ,  0.        ,  1.        , -0.15384615]])
print("x1=",l[0,3]);print("x2=",l[1,3]);print("x3=",l[2,3])
x1= 1.6153846153846154
x2= 0.7692307692307689
x3= -0.15384615384615366

验证答案是否正确:

x1=1.6153846153846154
x2=0.7692307692307689
x3=-0.15384615384615366
    
y1=np.float64(5*x1-x2+2*x3-7)
y2=np.float64(-2*x1+6*x2+9*x3)
y3=np.float64(-7*x1+5*x2-3*x3+7)
print("y1=",y1,"y2=",y2,"y3=",y3)
y1= 0.0 y2= -6.661338147750939e-16 y3= -2.6645352591003757e-15

数组(3,4,-2)不是方程组的解 □

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

推荐阅读更多精彩内容