Advanced Algebra高等代数 - 多元建模有多个方程(多元线性)组成 - 使用 NumPy 实现 矩阵的初等行变换:

  1. 线性:指多元变量的每一元变量都是1次方(可以将高于1次方的元,以新一元变量代换,求解再做开方运算)

  2. 将应用问题转化为 多个多元线性方程,并成一组;

  3. 由多元线性方程组 抽出 增广矩阵,并以“消元法”的策略,步步判断求解;

  • 增广矩阵 的 多个 “方程” 应用“行消元法” 化简 成 阶梯矩阵;判断有无解;是否出现 0 = !0 的行(方程);
  • 阶梯矩阵 的 多个 “方程” 应用“列消元法” 化简 成 简化阶梯矩阵;判断:
    • 有1个解时(非全0行数 = 元总数), 解是将 系数矩阵 化简为 N x N 的单位方阵(对角线上全为1,其余全为0),常数列一一对应主元的解;
    • 有多解时(非全0行数 < 元总数),写出每个 主元 由 所有 自由变量 表达的一般表达式(通解);
  1. 初等行变换(假设增广矩阵为N = np.array( [ [...], [...], ...]):
  • 把一行的倍数加到另一行上; N[r0, :] += k * N[r1, :], k为倍数
  • 交换任何两行的位置;N[[r0, r1], :] = N[[r1, r0], :]
  • 用一非零0⃣️数乘任一行;N[r0, :] *= k, k为非0⃣️乘数

实例(Pg.17: 应用与实验课题:配制食品模型):

[ins] In [1]: s = np.array(
         ...:     [
         ...:         [8, 6, 3, 2, 4, 100],
         ...:         [5, 25, 10, 15, 5, 240],
         ...:         [15, 5, 20, 10, 10, 300],
         ...:         [4.4, 2, 2.4, 2.8, 3.2, 11111111111],
         ...:     ]
         ...: )

[ins] In [2]: s
Out[2]: 
array([[8.000000, 6.000000, 3.000000, 2.000000, 4.000000, 100.000000],
       [5.000000, 25.000000, 10.000000, 15.000000, 5.000000, 240.000000],
       [15.000000, 5.000000, 20.000000, 10.000000, 10.000000, 300.000000],
       [4.400000, 2.000000, 2.400000, 2.800000, 3.200000, 11111111111.000000]])

[ins] In [3]: s[:2,]
Out[3]: 
array([[8.000000, 6.000000, 3.000000, 2.000000, 4.000000, 100.000000],
       [5.000000, 25.000000, 10.000000, 15.000000, 5.000000, 240.000000]])

**# 拷贝一份矩阵,便于对比;**
[ins] In [4]: v = s.copy() 

**# 用一非0⃣️数乘任一行** 
[ins] In [5]: v[0,] /= 2
[ins] In [6]: v[1,] /= 5
[ins] In [7]: v[2,] /= 5
[ins] In [8]: v
Out[8]: 
array([[4.000000, 3.000000, 1.500000, 1.000000, 2.000000, 50.000000],
       [1.000000, 5.000000, 2.000000, 3.000000, 1.000000, 48.000000],
       [3.000000, 1.000000, 4.000000, 2.000000, 2.000000, 60.000000],
       [4.400000, 2.000000, 2.400000, 2.800000, 3.200000, 11111111111.000000]])

**# NumPy Array交换两行**
[ins] In [9]: v[[0, 1], :] = v[[1,0], :]
[ins] In [10]: v
Out[10]: 
array([[1.000000, 5.000000, 2.000000, 3.000000, 1.000000, 48.000000],
       [4.000000, 3.000000, 1.500000, 1.000000, 2.000000, 50.000000],
       [3.000000, 1.000000, 4.000000, 2.000000, 2.000000, 60.000000],
       [4.400000, 2.000000, 2.400000, 2.800000, 3.200000, 11111111111.000000]])

**# 将一行的倍数加到另一行上**
[ins] In [11]: v[1, :] -= 4 * v[0, :]
[ins] In [12]: v[2, :] -= 3 * v[0, :]
[ins] In [13]: v
Out[13]: 
array([[1.000000, 5.000000, 2.000000, 3.000000, 1.000000, 48.000000],
       [0.000000, -17.000000, -6.500000, -11.000000, -2.000000, -142.000000],
       [0.000000, -14.000000, -2.000000, -7.000000, -1.000000, -84.000000],
       [4.400000, 2.000000, 2.400000, 2.800000, 3.200000, 11111111111.000000]])

**# 将一行的倍数加到另一行上**
[ins] In [11]: v[1, :] -= 4 * v[0, :]
[ins] In [12]: v[2, :] -= 3 * v[0, :]
[ins] In [13]: v
Out[13]: 
array([[1.000000, 5.000000, 2.000000, 3.000000, 1.000000, 48.000000],
       [0.000000, -17.000000, -6.500000, -11.000000, -2.000000, -142.000000],
       [0.000000, -14.000000, -2.000000, -7.000000, -1.000000, -84.000000],
       [4.400000, 2.000000, 2.400000, 2.800000, 3.200000, 11111111111.000000]])

[ins] In [14]: v[1, :] *= -14
[ins] In [15]: v[2, :] *= -17
[ins] In [16]: v[2, :] -= v[1, :]
[ins] In [17]: v[1, :] /= 238
[ins] In [18]: v[2, :] /= -57
[ins] In [19]: v
Out[19]: 
array([[1.000000,  5.000000, 2.000000, 3.000000, 1.000000, 48.000000],
       [-0.000000, 1.000000,   0.382353, 0.647059, 0.117647,  8.352941],
       [-0.000000, -0.000000, 1.000000,  0.614035, 0.192982, 9.824561],
       [4.400000,   2.000000,   2.400000,   2.800000, 3.200000, 11111111111.000000]])

SO:

  1. 能配出2000Kg的这种食品。解有无限多不唯一;A1,A2,A3 可作为主元,由A4,A5表示;
  2. 由1. 可将A4,A5作为自由变量表示主元A1,A2,A3 ,也就进一步可表示总成本 TotalCost=F(A1,A2,A3,A4,A5);
  3. 同理可将任何两种原料作为自由变量,表示其他的三个主元,以及总体成本。
    自然就会想到用成本最低的两种原料,表示其他主元以及总成本;会不会是最优解?
    按成本行的列降序排列,那么通过简化阶梯矩阵后,得到的就是用成本最低的两种原料表示;
    需求已有,怎么实现?就需要交换两列;NumPy 作为数值计算基础库非常不错;
    但人机交互,高层统计分析上就需要 Pandas 出场:
    可以设置列名称,行索引,列索引,行列对齐,... ,
  4. Pandas 重算一遍:
[ins] In [20]: d=pd.DataFrame(v)
[ins] In [21]: d.columns = ["A1", "A2", "A3", "A4", "A5", "Target"]
[ins] In [22]: d.sort_values(by=[3], axis="columns", ascending=False)
Out[22]: 
         Target   A1        A5        A4        A3   A2
0  4.800000e+01  1.0  1.000000  3.000000  2.000000  5.0
1  8.352941e+00 -0.0  0.117647  0.647059  0.382353  1.0
2  9.824561e+00 -0.0  0.192982  0.614035  1.000000 -0.0
3  1.111111e+10  4.4  3.200000  2.800000  2.400000  2.0
posted @   abaelhe  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示