资讯详情

高等代数实战笔记:用Python拆解丘维声151讲核心概念

📅 2026/10/16 3:18:16 | 华诺云谱 👁 阅读
高等代数实战笔记:用Python拆解丘维声151讲核心概念
简介本资源是面向数学专业本科生及高等代数自学者的系统性学习笔记深度对标丘维声教授北京大学《高等代数》课程B站151讲视频聚焦线性方程组、行列式、线性空间三大核心模块解决概念抽象、逻辑链条长、证明与计算脱节等典型学习难点。笔记以清晰框架重构知识体系第一章详述矩阵消元法与解的存在性/唯一性判别准则第二章从n元排列出发严谨推导行列式定义、性质、展开定理及克莱姆法则第三章完整覆盖线性空间、子空间、线性相关性、秩、基与维数等基石概念并延伸至矩阵秩与方程组解集结构分析。资源为1个PDF文件体积1.21MB排版紧凑、公式规范、例证穿插便于打印精读或碎片化复习。已有1171人学习下载是夯实代数基础、衔接线性映射与抽象代数的重要过渡材料。1. 这不是速成口诀是丘维声《高等代数》151讲视频的“解压包”把抽象定义嚼碎、把证明逻辑拆成可执行步骤、把每道习题背后隐藏的思维断点标出来你有没有试过看着“线性无关”的定义——“不存在不全为零的数使得线性组合为零”——点头说“懂了”结果一做习题3.2第2题发现行列式算出来是0却死活想不通“为什么这组向量就线性相关了”或者对着“极大线性无关组”的定义反复读三遍合上书面对一个含5个三维向量的集合手足无措不知从哪下手挑这不是你数学差是教材和视频在讲“是什么”而你真正卡住的地方是“怎么想、怎么动、怎么验证”。这份《大佬整理的丘维声高等代数笔记1》就是专治这种“表面听懂、实操瘫痪”的解压包。它不是丘维声教授原课的PPT搬运工而是某位坚持刷完全部151讲B站视频、同步手写推演、反复比对教材与例题、把每个证明的跳跃步骤都补全的实战派学习者用工程师拆模块的思路把整门课拆成了可逐行复现的“思维脚本”。它覆盖第一章线性方程组的消元法本质为什么初等行变换不改变解集、第二章行列式所有性质的底层代码级解释比如“两行互换行列式变号”这个结论笔记里直接用2×2矩阵的几何面积缩放方向翻转来可视化、第三章线性空间中“基”与“维数”的判定流程图给定一个子集三步判断它是不是基。它不承诺让你跳过思考但能确保你每一次卡壳都能在笔记对应位置找到那个被省略的中间步骤、那个被默认的隐含前提、那个老师没说出口的“我们自然会想到……”——而这恰恰是自学路上最昂贵的“后悔药”。2. 把“矩阵消元”从黑匣子变成可调试的流程从增广矩阵到阶梯形每一步变换都有明确目的与可验证输出2.1 矩阵初等行变换的三种操作不是规则是解方程的“手术刀”在笔记第一章1.1节它没有一上来就列三条变换规则而是先还原场景解方程组 $ \begin{cases} 2x y 5 \ x - y 1 \end{cases} $。你本能地会用加减消元——把第二个方程乘以2再与第一个相减消掉 $x$。笔记立刻指出“看这就是‘把一行的倍数加到另一行’把两个方程调换顺序就是‘两行互换’把一个方程两边同乘非零数就是‘一行乘以非零系数’。” 这三把“手术刀”每一刀下去目标都极其具体第一刀倍加是为了制造零第二刀互换是为了把主元非零首项挪到最上面第三刀倍乘是为了把主元标准化为1。它强调变换不是为了好看而是为了服务“阶梯形”这个终极形态——左下角全为0且每行首个非零元主元严格右移。提示初学者常误以为“化成阶梯形”就是最终目的。笔记一针见血阶梯形只是中间态它的价值在于暴露解的结构。主元所在列对应“主变量”其余列为“自由变量”。这个判断必须在完成变换后立刻对增广矩阵进行“目视扫描”而不是凭感觉。2.2 手动实现高斯消元一个Python函数把你的笔算过程翻译成可复现的代码笔记在1.1节末尾附了一个极简但功能完整的Python函数它不依赖numpy.linalg完全模拟人工消元逻辑def gauss_elimination(A_aug): 对增广矩阵A_aug进行高斯消元返回阶梯形矩阵行最简形前一步 A_aug: 二维列表如 [[2, 1, 5], [1, -1, 1]] 返回: 消元后的二维列表 m, n len(A_aug), len(A_aug[0]) # m行n列最后一列为常数项 mat [row[:] for row in A_aug] # 深拷贝避免修改原数据 pivot_row 0 # 当前行主元行 for col in range(n-1): # 遍历除最后一列外的所有列变量列 # 步骤1找主元——在当前列及以下行中找第一个非零元素 pivot_found False for r in range(pivot_row, m): if mat[r][col] ! 0: # 将该行与pivot_row行互换 mat[pivot_row], mat[r] mat[r], mat[pivot_row] pivot_found True break if not pivot_found: continue # 该列全为0跳过检查下一列 # 步骤2将主元行的主元标准化为1可选但便于后续计算 pivot_val mat[pivot_row][col] for j in range(col, n): mat[pivot_row][j] / pivot_val # 步骤3用主元行消去下方所有行在该列的元素倍加 for r in range(pivot_row 1, m): factor mat[r][col] # 要消去的系数 for j in range(col, n): mat[r][j] - factor * mat[pivot_row][j] pivot_row 1 # 主元行下移 return mat # 示例解上面的二元方程组 A_aug [[2, 1, 5], [1, -1, 1]] result gauss_elimination(A_aug) print(阶梯形矩阵:) for row in result: print([round(x, 4) for x in row])逻辑说明与参数说明A_aug是输入的增广矩阵格式为[[a11, a12, ..., b1], [a21, a22, ..., b2], ...]。函数核心是三层嵌套循环外层for col控制处理哪一列中层for r在当前列找主元内层for j执行具体的数值运算。pivot_row是关键状态变量记录当前正在处理的“主元行”索引。每次成功找到并处理完一个主元它就1指向下一个待处理行。factor mat[r][col]是消元的关键系数它代表“第r行在第col列的值需要被第pivot_row行的主元‘吃掉’多少倍”。为什么不用numpy笔记明确指出np.linalg.solve是个黑匣子它不告诉你“为什么这一步要互换”而手动实现能让你看清当某列找不到主元时程序会continue这正是“自由变量”出现的代码信号。2.3 解的情况判别从“有解/无解”到“唯一解/无穷解”一张表锁定所有可能性笔记将1.2节的判别逻辑浓缩为一张可直接查表的决策树。它不满足于教材的“若出现0d则无解”而是把判别过程拆解为对阶梯形矩阵的两步原子操作检查项操作含义后续动作Step 1: 查“矛盾行”扫描每一行看是否存在形如[0, 0, ..., 0, d]的行其中d ≠ 0这表示0 d逻辑矛盾立即判定无解。无需再看其他行。Step 2: 查“主元数”若无矛盾行则统计非零行的数量r即主元个数并与未知数个数n比较r是有效约束的数量若r n→ 唯一解若r n→ 有n - r个自由变量 → 无穷多解这个表格的价值在于它把一个需要“综合判断”的模糊问题变成了两个清晰、可编程、无歧义的布尔判断。笔记还给出了一个反直觉的提醒“r n时自由变量的个数是n - r但它们不一定是最后n - r个变量必须根据主元所在列来确定。” 例如阶梯形矩阵为[[1, 0, 2, 3], [0, 0, 1, 4], [0, 0, 0, 0]]r2,n3自由变量个数是1但主元在第1列和第3列所以自由变量是x2而非x3。3. 行列式不是神秘符号是“有向体积”的计算器从2阶几何意义到n阶递归展开的完整链路3.1 二阶行列式从平行四边形面积到克莱姆法则的直观起源笔记在2.1节开篇就用坐标系画出了向量 $\vec{a} (a_{11}, a_{21})$ 和 $\vec{b} (a_{12}, a_{22})$。它指出由这两个向量张成的平行四边形的有向面积其绝对值就是 $|a_{11}a_{22} - a_{21}a_{12}|$而符号取决于 $\vec{a}$ 到 $\vec{b}$ 是逆时针正还是顺时针负旋转。这个几何图像是理解一切行列式性质的基石。注意很多教程把“行列式为0”解释为“向量共线”这没错但笔记补充了更本质的视角“有向体积坍缩为0”。这为后续理解高维行列式如3阶是平行六面体体积埋下伏笔并自然引出克莱姆法则——当系数矩阵行列式非零意味着其列向量张成的空间是“满秩”的因此方程组的解向量必然能被唯一地“分解”到这些基向量上。3.2 行列式性质的“代码注释版”每条性质都对应一个可验证的Python操作笔记对2.3节的七条性质没有罗列定义而是用Python代码作为“活注释”。例如性质4“两行互换行列式变号”它给出的验证代码如下import numpy as np # 构造一个3x3矩阵 A np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) det_A np.linalg.det(A) print(f原矩阵A的行列式: {det_A:.2f}) # 互换第0行和第1行得到B B A.copy() B[0], B[1] B[1].copy(), B[0].copy() det_B np.linalg.det(B) print(f互换行后B的行列式: {det_B:.2f}) print(fdet_B / det_A ≈ {det_B/det_A:.2f}) # 应该约等于 -1参数说明与深层逻辑A.copy()确保不修改原矩阵这是工程实践的基本素养。B[0], B[1] B[1].copy(), B[0].copy()中的.copy()至关重要避免浅拷贝导致的引用错误这是新手踩坑高频点。最后一行det_B/det_A的计算是笔记强调的“验证思维”不只看绝对值更要看相对关系是否符合理论预期此处应为-1。这种“比例验证法”比单纯看两个数字是否相反更能抵抗浮点误差的干扰。同样对于性质7“一行的倍数加到另一行行列式不变”笔记的代码会构造一个C矩阵将A的第0行乘以k2.5加到第1行并打印det_C与det_A的差值结果会是一个接近1e-15的极小数从而直观印证“不变”在数值计算中的真实含义。3.3 按行展开代数余子式不是公式是“降维打击”的递归策略笔记在2.4节把“按第i行展开”这个操作重新命名为“选择一个支点把n维问题折叠成(n-1)维子问题”。它用一个3×3矩阵为例$$ \begin{vmatrix} a b c \ d e f \ g h i \ \end{vmatrix} a \cdot \begin{vmatrix} e f \ h i \ \end{vmatrix}b \cdot \begin{vmatrix} d f \ g i \ \end{vmatrix}c \cdot \begin{vmatrix} d e \ g h \ \end{vmatrix} $$笔记指出这里的,-,符号序列就是(-1)^{ij}的体现它保证了“有向体积”的符号一致性。而每一个2阶子式就是原矩阵去掉第i行第j列后剩下的部分——这正是“降维”的物理操作。它提供了一个递归计算行列式的Python函数清晰展示了这一思想def det_recursive(matrix): 递归计算行列式完美体现“按行展开”思想 n len(matrix) if n 1: return matrix[0][0] if n 2: return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0] det 0 # 固定第一行i0进行展开 for j in range(n): # 计算余子式去掉第0行和第j列 minor [] for r in range(1, n): # 从第1行开始 row [] for c in range(n): if c ! j: # 跳过第j列 row.append(matrix[r][c]) minor.append(row) # 代数余子式 (-1)^(0j) * det(minor) cofactor ((-1) ** j) * det_recursive(minor) det matrix[0][j] * cofactor return det # 测试 M [[1, 2, 3], [4, 5, 6], [7, 8, 9]] print(f递归计算结果: {det_recursive(M)}) print(fnumpy计算结果: {np.linalg.det(M):.2f})关键点说明函数名det_recursive直接点明其核心是递归而非迭代。minor的构建是重点双重循环外层for r in range(1, n)跳过第0行内层for c in range(n)并if c ! j跳过第j列精准实现“划去”操作。((-1) ** j)是(-1)^{ij}在i0时的简化代码简洁且不易出错。性能警告笔记坦率指出此函数时间复杂度为 $O(n!)$仅用于教学理解。实际应用必须用LU分解等 $O(n^3)$ 算法。这体现了笔记的务实精神——教原理也教边界。4. 线性空间的“存在性证明”落地为可执行的判定算法从抽象定义到基、维数、子空间的三步检验法4.1 “线性空间”定义的八条公理如何转化为一个Python类的__init__和__add__方法笔记在3.1节没有陷入公理的哲学讨论而是提出一个尖锐问题“给你一个集合V和一个数域K你怎么证明它是一个线性空间” 答案是你必须为V上的加法和数乘运算写出具体的、可执行的算法并验证这八条公理是否成立。为此它以“所有2×2实矩阵的集合”为例定义了一个Python类class MatrixSpace2x2: 一个具体的线性空间实例所有2x2实矩阵 def __init__(self, a, b, c, d): # 矩阵 [[a, b], [c, d]] self.data [[a, b], [c, d]] def __add__(self, other): 加法运算对应元素相加 return MatrixSpace2x2( self.data[0][0] other.data[0][0], self.data[0][1] other.data[0][1], self.data[1][0] other.data[1][0], self.data[1][1] other.data[1][1] ) def __rmul__(self, scalar): 数乘运算标量乘以每个元素 return MatrixSpace2x2( scalar * self.data[0][0], scalar * self.data[0][1], scalar * self.data[1][0], scalar * self.data[1][1] ) def is_zero(self): 零元全零矩阵 return (self.data[0][0] 0 and self.data[0][1] 0 and self.data[1][0] 0 and self.data[1][1] 0) def negative(self): 负元每个元素取反 return MatrixSpace2x2( -self.data[0][0], -self.data[0][1], -self.data[1][0], -self.data[1][1] ) # 验证公理1交换律A B B A A MatrixSpace2x2(1, 2, 3, 4) B MatrixSpace2x2(5, 6, 7, 8) sum_AB A B sum_BA B A # 只需比较data即可因为__eq__未重写但逻辑上应相等 print(AB BA?, sum_AB.data sum_BA.data) # True参数与设计逻辑__init__接收四个参数强制要求用户以“坐标”的形式输入这对应了线性空间中“向量”的概念——它需要一组基来表示。__add__和__rmul__是核心它们的实现就是公理1-8的“操作手册”。例如公理3零元存在的验证就是调用is_zero()方法公理4负元存在的验证就是调用negative()方法并检查A A.negative()是否为零元。这种写法把抽象的“存在性证明”转化为了具体的“代码能否编译、运行、返回True”的工程问题。4.2 判定“子空间”的黄金三步法封闭性检查的自动化脚本笔记在3.2节将“W是V的子空间”的充要条件加法与数乘封闭提炼为一个可编程的三步检验法并配以伪代码非空检查0_V ∈ W 零向量必须在W中加法封闭检查任取u, v ∈ W计算u v验证u v ∈ W数乘封闭检查任取u ∈ W和k ∈ K计算k*u验证k*u ∈ W它提供了一个通用的检验函数框架def check_subspace(W_elements, V_add, V_scalar_mult, V_zero, K[0, 1, -1, 2, 0.5]): 检验W_elements是否构成V的一个子空间 W_elements: W中的一组典型元素列表 V_add, V_scalar_mult: V上的加法和数乘函数 V_zero: V的零元 K: 用于测试的数域K中的几个代表性标量 # Step 1: 非空检查 if V_zero not in W_elements: print(❌ 失败零元不在W中) return False # Step 2: 加法封闭检查取W中所有两两组合 from itertools import combinations for u, v in combinations(W_elements, 2): w_sum V_add(u, v) if w_sum not in W_elements: print(f❌ 失败uv 不在W中u{u}, v{v}, uv{w_sum}) return False # Step 3: 数乘封闭检查取W中每个元素与K中每个标量 for u in W_elements: for k in K: w_scaled V_scalar_mult(k, u) if w_scaled not in W_elements: print(f❌ 失败k*u 不在W中k{k}, u{u}, k*u{w_scaled}) return False print(✅ 通过所有子空间检验) return True # 示例检验R^2中所有形如(a, 0)的向量是否为子空间 W [(1, 0), (2, 0), (-1, 0), (0, 0)] # 一些典型元素 V_zero (0, 0) # 定义R^2上的加法和数乘 def R2_add(u, v): return (u[0]v[0], u[1]v[1]) def R2_scalarmult(k, u): return (k*u[0], k*u[1]) check_subspace(W, R2_add, R2_scalarmult, V_zero)避坑 / 常见问题 / 排查现象check_subspace函数返回False但你确信W是子空间。原因W_elements列表太小未能覆盖所有可能的线性组合。例如W是所有(a, 0)但你只给了[(1,0), (0,0)]那么2*(1,0)(2,0)就不在列表中导致误判。解决W_elements必须是W的一个生成集如基或使用更智能的采样策略如随机生成大量点而非几个孤立点。现象在V_scalar_mult中使用了浮点数k0.1结果k*u因精度问题无法精确匹配W_elements中的元素。原因浮点数的二进制表示不精确0.1*10可能不等于1.0。解决对浮点数结果使用math.isclose()进行近似比较或限定K为有理数如分数fractions.Fraction。现象combinations(W_elements, 2)生成的组合数爆炸函数运行极慢。原因W_elements包含了太多冗余元素而子空间的封闭性只需验证其基的线性组合即可。解决先对W_elements进行线性无关性筛选提取一个极大线性无关组即基再用这个基进行检验效率呈指数级提升。现象函数通过了检验但W其实不是子空间因为W_elements的定义本身就有问题例如它只包含了整数坐标但W实际包含所有实数坐标。原因W_elements是W的有限采样永远无法穷举无限集。函数只能证伪不能绝对证实。解决函数的正确用途是“快速排除明显错误的候选集”。要严格证明仍需回到数学定义用符号推导。此脚本是“侦察兵”不是“法官”。5. 从“解空间”到“基础解系”齐次方程组解集结构的可视化与自动化求解5.1 解空间W的维数公式dim(W) n - r如何从消元结果中“数”出来笔记在3.8节把抽象的维数公式变成了一张消元后的“解构地图”。它以一个具体的4元齐次方程组为例其系数矩阵经高斯消元后得到阶梯形$$ \begin{bmatrix} 1 2 0 3 \ 0 0 1 4 \ 0 0 0 0 \ 0 0 0 0 \ \end{bmatrix} $$笔记标注n 4未知数个数即矩阵列数。r 2非零行数即主元个数。主元位于第1列和第3列 → 主变量是x1, x3。自由变量是x2, x4共n - r 2个。基础解系的向量个数 自由变量个数 2。它强调dim(W) n - r不是一个需要记忆的公式而是对消元结果的直接计数。你不需要知道什么是“解空间”只要会数“主元列”和“总列数”就能得到维数。5.2 自动生成基础解系一个函数把自由变量的“单位向量赋值”自动化笔记在3.8节末尾给出了一个能自动生成基础解系的Python函数。其核心思想是让每个自由变量依次取1其余自由变量取0然后回代求出主变量的值。def null_space_basis(A): 计算齐次方程组 Ax0 的基础解系解空间的一组基 A: m x n 系数矩阵 返回: 一个列表每个元素是一个n维解向量列表 import numpy as np from numpy.linalg import matrix_rank A np.array(A, dtypefloat) m, n A.shape r matrix_rank(A) # 实际主元数 if r 0: return [np.eye(n)[i].tolist() for i in range(n)] # 全零矩阵解空间是整个R^n # 对A进行行最简形变换RREF A_rref np.array(A, dtypefloat) # 这里调用numpy的rref或自行实现略 # 为简洁假设已有rref结果 # A_rref compute_rref(A) # 找出主元列和自由列索引 pivot_cols [] free_cols list(range(n)) for i in range(m): for j in range(n): if abs(A_rref[i][j]) 1e-10: # 找到主元 pivot_cols.append(j) free_cols.remove(j) break # 基础解系个数 num_basis n - r basis [] # 对每个自由变量构造一个解向量 for idx, free_col in enumerate(free_cols): # 初始化解向量为全零 sol [0.0] * n # 将该自由变量设为1 sol[free_col] 1.0 # 回代求解主变量 # 从最后一行主元开始向上 for i in range(len(pivot_cols)-1, -1, -1): pivot_row i pivot_col pivot_cols[i] # sol[pivot_col] - (该行其他项的和) s 0.0 for j in range(pivot_col 1, n): s A_rref[pivot_row][j] * sol[j] sol[pivot_col] -s basis.append([round(x, 6) for x in sol]) # 四舍五入提高可读性 return basis # 示例求解 Ax0A为上面的阶梯形矩阵 A_example [[1, 2, 0, 3], [0, 0, 1, 4], [0, 0, 0, 0], [0, 0, 0, 0]] basis null_space_basis(A_example) print(基础解系:) for vec in basis: print(vec)逻辑说明与参数说明A是输入的系数矩阵函数内部会将其化为行最简形RREF这是获得标准基础解系的前提。pivot_cols和free_cols的识别是整个算法的“眼睛”。它通过扫描RREF矩阵精确找出哪些列有主元主变量哪些没有自由变量。for idx, free_col in enumerate(free_cols)循环是生成基础解系的核心。每一次循环都固定一个自由变量为1其余为0然后利用RREF的“上三角”结构从下往上逐行回代解出所有主变量。round(x, 6)是一个实用主义技巧它把1.000000000000001这样的浮点误差显示为1.0大幅提升输出的可读性和可验证性。5.3 非齐次方程组的通解特解 齐次解空间一个函数封装全部逻辑笔记在3.9节将非齐次方程组Ax b的通解结构x x_p x_h封装为一个端到端的求解函数。它巧妙地复用了前面的null_space_basis和gauss_eliminationdef solve_nonhomogeneous(A, b): 求解非齐次线性方程组 Ax b 的通解 A: m x n 系数矩阵 b: m维常数向量 返回: (特解x_p, 基础解系列表) 或 None若无解 import numpy as np # 构造增广矩阵 A_aug [row [bi] for row, bi in zip(A, b)] # 高斯消元 A_aug_rref gauss_elimination(A_aug) # 复用2.2节的函数 # 检查是否有解Step 1: 查矛盾行 has_solution True for row in A_aug_rref: if all(abs(x) 1e-10 for x in row[:-1]) and abs(row[-1]) 1e-10: has_solution False break if not has_solution: return None # 提取RREF系数矩阵和常数项 A_rref [row[:-1] for row in A_aug_rref] b_rref [row[-1] for row in A_aug_rref] # 求特解x_p令所有自由变量为0回代求主变量 n len(A[0]) x_p [0.0] * n # 找出主元列 pivot_cols [] for i, row in enumerate(A_rref): for j, val in enumerate(row): if abs(val) 1e-10: pivot_cols.append(j) break # 回代求特解 for i in range(len(pivot_cols)-1, -1, -1): if i len(b_rref): # 确保行存在 pivot_col pivot_cols[i] x_p[pivot_col] b_rref[i] for j in range(pivot_col 1, n): x_p[pivot_col] - A_rref[i][j] * x_p[j] # 求齐次解空间的基础解系 basis_h null_space_basis(A) return ([round(x, 6) for x in x_p], basis_h) # 示例 A_nh [[1, 2, 0, 3], [0, 0, 1, 4], [0, 0, 0, 0]] b_nh [5, 6, 0] result solve_nonhomogeneous(A_nh, b_nh) if result: x_p, basis_h result print(f特解: {x_p}) print(齐次解空间基础解系:) for vec in basis_h: print(f {vec}) else: print(方程组无解)关键设计点函数首先调用gauss_elimination对增广矩阵消元然后立即执行无解判别这是严谨性的第一步。特解x_p的计算是“令所有自由变量为0”这一策略的代码实现。它复用了与null_space_basis相同的回代逻辑只是初始值不同。最终返回的是一个元组(x_p, basis_h)这直接对应了教材中x x_p k1*v1 k2*v2 ...的通解形式让理论与代码一一映射。6. 把“数域”从一个抽象概念变成可本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑