python 实现三维平面拟合 附纸质版最小二乘法的推导与程序的实现

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程序结果(作者的数据绘制出的图)

        

 程序参考:python如何拟合三维平面(拟合Intel Realsense D435深度数据点)_Dontla的博客-CSDN博客_python 拟合平面文章目录拟合Intel Realsense D435深度数据点参考文章:【MQ笔记】超简单的最小二乘法拟合平面(Python)import numpy as npimport matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3D # 创建函数,用于生成不同属于一个平面的100个离散点def not_all_in_plane(a, b, c): x = np.random.uniform(-10, 10, sizhttps://blog.csdn.net/Dontla/article/details/108445277

 如果大家觉得有点难,可以使用matlab中的拟合工具箱进行拟合,更加方便。

  • 11
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值