1.公式推导
2.程序的实现
2.1数据集格式
程序的数据集格式如下,只要数据集格式相同,只要修改程序的文件路径即可运行。
2.2程序
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
df = pd.read_excel("你的文件路径",engine='openpyxl') #修改数据文件路径即可
x = list(df["x"])
y = list(df["y"])
z = list(df["z"])
# 构造A矩阵
A = np.zeros((3, 3))
for i in range(0, len(x)):
A[0, 0] = A[0, 0] + x[i] ** 2
A[0, 1] = A[0, 1] + x[i] * y[i]
A[0, 2] = A[0, 2] + x[i]
A[1, 0] = A[0, 1]
A[1, 1] = A[1, 1] + y[i] ** 2
A[1, 2] = A[1, 2] + y[i]
A[2, 0] = A[0, 2]
A[2, 1] = A[1, 2]
A[2, 2] = len(x)
# 构造b矩阵
b = np.zeros((3, 1))
for i in range(0, len(x)):
b[0, 0] = b[0, 0] + x[i] * z[i]
b[1, 0] = b[1, 0] + y[i] * z[i]
b[2, 0] = b[2, 0] + z[i]
# 求解x
A_inv = np.linalg.inv(A) # 求矩阵A的逆
X = np.dot(A_inv, b)
print('平面拟合结果为:z = %.3f * x + %.3f * y + %.3f' % (X[0, 0], X[1, 0], X[2, 0]))
#
# 展示图像
fig1 = plt.figure()
# ax1 = fig1.add_subplot(111, projection='3d')
ax1 = plt.axes(projection='3d')
ax1.set_xlabel("x")
ax1.set_ylabel("y")
ax1.set_zlabel("z")
ax1.scatter(x,y,z,c='r',marker='o')
x_p = np.array([i/1000 for i in range(-50,50)])
y_p = np.array([i/1000 for i in range(-50,50)])
x_p, y_p = np.meshgrid(x_p, y_p)
z_p = X[0, 0] * x_p + X[1, 0] * y_p + X[2, 0]
ax1.plot_wireframe(x_p, y_p, z_p, rstride=10, cstride=10)
plt.show()
2.3程序结果(作者的数据绘制出的图)
如果大家觉得有点难,可以使用matlab中的拟合工具箱进行拟合,更加方便。