当前位置:   article > 正文

Python求解多个多元一次方程组(完整可运行版本代码)_python求解多元方程组

python求解多元方程组

问题描述: 

三个未知量构成一个方程式,该CSV文件中一共有N行数据有关[x, y, z]的系数,求解三个未知量[x, y, z]的值。


前言

三个未知量[x, y, z]之间的关系是:a*x + b*y + c*z = p。

像这样的式子,csv文件中一共有N行,我的需求是根据这些不同的系数和不同的结果p值,求出三个未知量的值。

一、工具包

首先要使用到的工具主要是numpy和pandas,pandas也是基于numpy的一种工具,里面的DataFrame很适合用于打开和修改CSV文件。

二、使用步骤

1.读入文件

代码如下:

  1. import numpy as np
  2. import pandas as pd
  3. from sympy import *
  4. df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data.csv',encoding = 'gbk')

2.编写方程

代码如下:

  1. #参数定义
  2. x = []
  3. y = []
  4. z = []
  5. for i in range(len(df)-3):
  6. a = np.array(df['系数1'].iloc[i:i+3])
  7. b = np.array(df['系数2'].iloc[i:i+3])
  8. c = np.array(df['系数3'].iloc[i:i+3])
  9. """
  10. a1*x + b1*y + c1*z = p1
  11. a2*x + b2*y + c2*z = p2
  12. a3*x + b3*y + c3*z = p3
  13. """
  14. #p = [p1, p2, p3]
  15. p = [1, 2, 3]
  16. m = np.array([[a[0], b[0], c[0]], [a[1], b[1], c[1]], [a[2], b[2], c[2]]])
  17. n = np.array(p) #可替换为式子右边的常数
  18. print(m)
  19. print(n)
  20. solution = np.linalg.solve(m, n) #solution format: np.array([x, y, z])
  21. print('solution=', solution)
  22. x.append(solution[0])
  23. y.append(solution[1])
  24. z.append(solution[2])

①首先,定义参数(也就是需要求的三个未知量)

②每次三行三行的取系数数据及常数项数据,每个三行数据构成方程组。

a1*x + b1*y + c1*z = p1

a2*x + b2*y + c2*z = p2

a3*x + b3*y + c3*z = p3

③用np.linalg.solve()函数来求解方程组,该函数是以矩阵形式给出线性方程的解,将每一个方程式的系数一组一组的写入m中,常数项写入n中。

m = np.array([[a[0], b[0], c[0]], [a[1], b[1], c[1]], [a[2], b[2], c[2]]])

n = np.array(p) #可替换为式子右边的常数

④每个方程组会得到一个解集,解集分别对应三个未知量[x, y, z]的解。 

⑤并依次存入到之前定义的参数空列表中,方便后面存入文件。

⑥按列存入文件,并导出为csv。

这里的每一列就是x的可行解,因为我的需求是比较大的项目,所以我是取的每一列的平均值作为我的最后解。可是如果只是一个方程组的话,输出的就是一组解集了。

  1. ls = np.array([x,
  2. y,
  3. z])
  4. df = pd.DataFrame(ls.transpose())
  5. df.to_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data_answer.csv', encoding='gbk')

 

总结

下面是完整版代码:

  1. import numpy as np
  2. import pandas as pd
  3. import math
  4. from sympy import *
  5. #数据表格
  6. df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data.csv',encoding = 'gbk')
  7. #参数定义
  8. x = []
  9. y = []
  10. z = []
  11. for i in range(len(df)-3):
  12. a = np.array(df['系数1'].iloc[i:i+3])
  13. b = np.array(df['系数2'].iloc[i:i+3])
  14. c = np.array(df['系数3'].iloc[i:i+3])
  15. """
  16. a1*x + b1*y + c1*z = p1
  17. a2*x + b2*y + c2*z = p2
  18. a3*x + b3*y + c3*z = p3
  19. """
  20. #p = [p1, p2, p3]
  21. p = [1, 2, 3]
  22. m = np.array([[a[0], b[0], c[0]], [a[1], b[1], c[1]], [a[2], b[2], c[2]]])
  23. n = np.array(p) #可替换为式子右边的常数
  24. print(m)
  25. print(n)
  26. solution = np.linalg.solve(m, n) #solution format: np.array([x, y, z])
  27. print('solution=', solution)
  28. x.append(solution[0])
  29. y.append(solution[1])
  30. z.append(solution[2])
  31. ls = np.array([x,
  32. y,
  33. z])
  34. df = pd.DataFrame(ls.transpose())
  35. df.to_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data_answer.csv', encoding='gbk')

也可以提前画出求出解的图片看看效果:

  1. import matplotlib.pyplot as plt
  2. # 画图
  3. fig = plt.figure()
  4. x1= [j for j in range(len(x))]
  5. ax1 = fig.add_subplot(3,2,1)
  6. ax1.scatter(x1, x)
  7. ax1.set_title('x')
  8. ax2 = fig.add_subplot(3,2,2)
  9. ax2.scatter(x1, y)
  10. ax2.set_title('y')
  11. ax3 = fig.add_subplot(3,2,3)
  12. ax3.scatter(x1, z)
  13. ax3.set_title('z')
  14. plt.show()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/683737
推荐阅读
相关标签
  

闽ICP备14008679号