• 矩阵与拉普拉斯展开定理求解多元一次方程组


    1、引言

    跟几个初中学聊起,问了他们的数学学的如何?函数是什么?因为函数对于初中生来说是很重要的一个初次接触,刚接触的时候都会有点懵,于是想让这些初中生尽快熟悉而不用感到陌生与害怕。

    按照定义来说,函数指一个量随着另一个量的变化而变化,含有三个要素:定义域A、值域B和对应法则f

    当然对于这些定义,在感到困惑之前,我让他们不要去死记,于是打个通俗的比方,好比买一条鱼,可以做成红烧鱼也可以做成清蒸鱼,这个烹饪的方法就是函数,也就是不同的烹饪就是不同的函数,就会产生不同的结果。
    因为初中开始学习二元一次方程组和三元一次方程组了,于是就更加通俗的说,看他们还有点困惑,就让他们直接将方程当作是函数。

    接下来就问了他们会解方程组吗?通过消元法都能够搞定,于是我说,那四元一次方程组、十元一次方程组,甚至百元一次方程组能不能解答,这个时候他们就感觉到复杂了。

    2、单元矩阵

    所以针对这些问题,我特地做了一张图,通过矩阵的解法让他们了解到数学的有趣,拓展初中生的知识面,如下: 

    求解多元一次方程组,属于线性代数,这个在前面的一篇文章也有相关介绍,可以查阅:线性代数的相关计算(numpy)
    我们来看下三元一次方程组,通过numpy自带的线性代数algebra(np.linalg)来处理:

    1. M=np.mat('1 1 1;0 2 -4;3 2 -6')
    2. A=np.array([0,6,8])
    3. print(np.round(np.linalg.solve(M,A)))
    4. #[ 0. 1. -1.]

    所以解为x=0,y=1,z=-1,我们可以验证下:系数矩阵M和未知数的解,做点积运算,结果应该是A(方程组结果列)

    1. print(np.array(np.dot(M,[0,1, -1])).flatten())
    2. #[0 6 8]
    1. M=np.mat('1 -2 1;0 2 -8;-4 5 9')
    2. '''
    3. matrix([[ 1, -2, 1],
    4. [ 0, 2, -8],
    5. [-4, 5, 9]])
    6. '''
    7. A=np.array([0,8,-9])
    8. print(np.linalg.solve(M,A))
    9. #[29. 16. 3.]

    所以解为x=29,y=16,z=3
    同样的来验证一下

    print(np.array(np.dot(M,[29,16,3])).flatten())#[ 0  8 -9]

    3、拉普拉斯展开

    还可以使用拉普拉斯展开来求线性方程组的解,这里有几个知识点,余子式和拉普拉斯展开,这里截取来自百度百科的一张图:

    其实我们可以这样去理解,元素所在的行列当作消消乐一样的消掉,剩下的就是余子式,然后根据公式进行计算。

    1. import copy
    2. #系数矩阵
    3. #余子式:在n阶行列式中,把所在的第i行与第j列划去后,所留下来的n-1阶行列式
    4. def get_minor(j, matrix):
    5. result = []
    6. for row in range(len(matrix)):
    7. if row == 0:
    8. continue
    9. temp = []
    10. for col in range(len(matrix)):
    11. if col == j:
    12. continue
    13. temp.append(matrix[row][col])
    14. result.append(temp)
    15. return result
    16. #拉普拉斯展开定理,递归求解行列式的值
    17. def laplace_expansion(matrix):
    18. if len(matrix) == 2:
    19. return matrix[1][1] * matrix[0][0] - matrix[1][0] * matrix[0][1]
    20. elif len(matrix) > 2:
    21. result = 0
    22. for i in range(len(matrix)):
    23. minor_item = get_minor(i, matrix)
    24. #print(minor_item)
    25. result += (matrix[0][i] * ((-1) ** i) * laplace_expansion(minor_item))
    26. return result
    27. #将常数列(等号右边的数)加入进来
    28. def replace(i, a, b):
    29. dim = len(a)
    30. result = copy.deepcopy(a)
    31. for j in range(dim):
    32. result[j][i] = b[j]
    33. return result
    34. if __name__ == "__main__":
    35. A = [[1,1,1],[0,2,-4],[3,2,-6]]
    36. B = [0,6,8]
    37. A = [[1,-2,1],[0,2,-8],[-4,5,9]]
    38. B = [0,8,-9]
    39. #A = [[1,2,2,3],[0,-2,3,1],[0,2,-1,2],[1,4,2,4]]
    40. #B = [6,9,10,-2]
    41. result = []
    42. c = laplace_expansion(A)
    43. #print(c)
    44. if c == 0:print("没有解")
    45. else:
    46. for i in range(len(A)):
    47. m = replace(i,A,B)
    48. print(m)
    49. result.append(laplace_expansion(m)/c)
    50. #print(result)
    51. print(result)
  • 相关阅读:
    高性能网络编程 - 关于单台服务器并发TCP连接数理论值的讨论
    矩阵乘积知识
    安装系统时无raid驱动处理办法
    如何使用自己公司的数据,训练聊天机器人,如何选择算法
    线索二叉树的建立与遍历
    在线OJ项目(2)---封装设计数据库
    Neo4J安装
    【Mybatis源码分析】插件机制和Pagehelper插件源码分析
    O2OA(翱途)开发平台 V8.2已发布,更安全、更高效、更开放
    【React-Hooks基础】入门级详解——useState / useEffect /自定义hook
  • 原文地址:https://blog.csdn.net/weixin_41896770/article/details/133231249