赞
踩
三个未知量构成一个方程式,该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文件。
代码如下:
- import numpy as np
- import pandas as pd
- from sympy import *
-
- df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data.csv',encoding = 'gbk')
代码如下:
- #参数定义
- x = []
- y = []
- z = []
-
- for i in range(len(df)-3):
- a = np.array(df['系数1'].iloc[i:i+3])
- b = np.array(df['系数2'].iloc[i:i+3])
- c = np.array(df['系数3'].iloc[i:i+3])
- """
- a1*x + b1*y + c1*z = p1
- a2*x + b2*y + c2*z = p2
- a3*x + b3*y + c3*z = p3
- """
- #p = [p1, p2, p3]
- p = [1, 2, 3]
- 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) #可替换为式子右边的常数
- print(m)
- print(n)
- solution = np.linalg.solve(m, n) #solution format: np.array([x, y, z])
- print('solution=', solution)
-
- x.append(solution[0])
- y.append(solution[1])
- 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
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的可行解,因为我的需求是比较大的项目,所以我是取的每一列的平均值作为我的最后解。可是如果只是一个方程组的话,输出的就是一组解集了。
- ls = np.array([x,
- y,
- z])
-
- df = pd.DataFrame(ls.transpose())
-
- df.to_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data_answer.csv', encoding='gbk')
下面是完整版代码:
- import numpy as np
- import pandas as pd
- import math
- from sympy import *
- #数据表格
- df = pd.read_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data.csv',encoding = 'gbk')
-
- #参数定义
- x = []
- y = []
- z = []
-
- for i in range(len(df)-3):
- a = np.array(df['系数1'].iloc[i:i+3])
- b = np.array(df['系数2'].iloc[i:i+3])
- c = np.array(df['系数3'].iloc[i:i+3])
- """
- a1*x + b1*y + c1*z = p1
- a2*x + b2*y + c2*z = p2
- a3*x + b3*y + c3*z = p3
- """
- #p = [p1, p2, p3]
- p = [1, 2, 3]
- 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) #可替换为式子右边的常数
- print(m)
- print(n)
- solution = np.linalg.solve(m, n) #solution format: np.array([x, y, z])
- print('solution=', solution)
-
- x.append(solution[0])
- y.append(solution[1])
- z.append(solution[2])
-
-
- ls = np.array([x,
- y,
- z])
-
- df = pd.DataFrame(ls.transpose())
-
- df.to_csv(r'C:/Users/hanhan/PycharmProjects/pythonProject/data_answer.csv', encoding='gbk')
也可以提前画出求出解的图片看看效果:
- import matplotlib.pyplot as plt
-
- # 画图
- fig = plt.figure()
- x1= [j for j in range(len(x))]
- ax1 = fig.add_subplot(3,2,1)
- ax1.scatter(x1, x)
- ax1.set_title('x')
-
- ax2 = fig.add_subplot(3,2,2)
- ax2.scatter(x1, y)
- ax2.set_title('y')
-
- ax3 = fig.add_subplot(3,2,3)
- ax3.scatter(x1, z)
- ax3.set_title('z')
-
- plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。