使用Python实现3D曲线拟合

曲线拟合是数据分析和数学建模领域中广泛使用的技术。它涉及到寻找最接近一组数据点的数学函数的过程。在3D曲线拟合中,该过程被扩展到三维空间,其中的目标是找到最好地表示一组3D数据点的函数。

Python是一种用于科学计算的流行编程语言,它提供了几个可用于3D曲线拟合的库。在本文中,我们将讨论如何使用SciPy库在Python中执行3D曲线拟合。

SciPy库

SciPy库是Python中用于科学计算的强大工具。它为优化、积分、插值和曲线拟合提供了广泛的功能。在本文中,我们将重点介绍该库的曲线拟合功能。

SciPy提供了curve_fit函数,可用于在Python中执行曲线拟合。该函数将待拟合的数据点和待用于拟合的数学函数作为输入。然后,该函数返回最接近输入数据的数学函数的优化参数。

让我们来看看使用Python中的SciPy库对100个随机生成的点进行3D曲线拟合的完整分步过程。

需要安装库:

pip install numpy
pip install scipy
pip install matplotlib

Python中的3D曲线拟合

现在让我们看看如何使用SciPy库在Python中执行3D曲线拟合。我们将首先使用NumPy库生成一些随机的3D数据点。

import numpy as np# Generate random 3D data points
x = np.random.random(100)
y = np.random.random(100)
z = np.sin(x * y) + np.random.normal(0, 0.1, size=100)
data = np.array([x, y, z]).T

我们已经在3D空间中生成了100个随机数据点,其中z坐标被定义为具有一些添加的噪声的x和y坐标的函数。
接下来,我们将定义用于曲线拟合的数学函数。在这个例子中,我们将使用一个简单的3次多项式函数。

def func(xy, a, b, c, d, e, f):x, y = xyreturn a + b*x + c*y + d*x**2 + e*y**2 + f*x*y

该函数将数据点的x和y坐标以及六个参数a、b、c、d、e和f作为输入。这些参数是在曲线拟合期间将被优化的多项式函数的系数。
我们现在可以使用SciPy库中的curve_fit函数执行曲线拟合。

from scipy.optimize import curve_fit# Perform curve fitting
popt, pcov = curve_fit(func, (x, y), z)# Print optimized parameters
print(popt)

输出

[ 0.04416919 -0.12960835 -0.11930051  0.16187097  0.1731539   0.85682108]

curve_fit函数将用于曲线拟合的数学函数和要拟合的数据点作为输入。它返回两个数组,popt和pcov。popt数组包含数学函数的参数的优化值,pcov数组包含参数的协方差矩阵。
Python中的curve_fit()函数用于执行非线性回归曲线拟合。它使用最小二乘优化方法来找到最适合给定数据集的用户定义函数的优化参数。

关于popt和pcov

popt和pcov是Python中curve_fit()函数的两个输出。popt是拟合函数的优化参数的1-D阵列,而pcov是优化参数的估计协方差矩阵。
通过使用最小二乘优化算法最小化拟合函数和实际数据点之间的残差平方和来计算Popt。curve_fit()函数使用Levenberg-Marquardt算法来执行此优化。该算法迭代地调整参数值,以最小化目标函数,直到收敛。
使用优化参数值处的目标函数的梯度的协方差矩阵来估计pcov。pcov的对角元素表示优化参数的方差,非对角元素表示参数之间的协方差。pcov用于估计优化参数值的不确定性。
我们现在可以使用优化的参数在3D空间中绘制拟合曲线。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# Create 3D plot of the data points and the fitted curve
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, color='blue')
x_range = np.linspace(0, 1, 50)
y_range = np.linspace(0, 1,
X, Y = np.meshgrid(x_range, y_range)
Z = func(X, Y, *popt)
ax.plot_surface(X, Y, Z, color='red', alpha=0.5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

输出
在这里插入图片描述
上面的代码创建了数据点和拟合曲线的3D图。蓝点表示原始数据点,红色表面表示拟合曲线。

完整代码:
现在,下面是完整的代码,展示了我们如何使用SciPy库在Python中进行3D曲线拟合。

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# Generate random 3D data points
x = np.random.random(100)
y = np.random.random(100)
z = np.sin(x * y) + np.random.normal(0, 0.1, size=100)
data = np.array([x, y, z]).T# Define mathematical function for curve fitting
def func(xy, a, b, c, d, e, f):x, y = xyreturn a + b*x + c*y + d*x**2 + e*y**2 + f*x*y# Perform curve fitting
popt, pcov = curve_fit(func, (x, y), z)# Print optimized parameters
print(popt)# Create 3D plot of the data points and the fitted curve
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(x, y, z, color='blue')
x_range = np.linspace(0, 1, 50)
y_range = np.linspace(0, 1, 50)
X, Y = np.meshgrid(x_range, y_range)
Z = func((X, Y), *popt)
ax.plot_surface(X, Y, Z, color='red', alpha=0.5)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
plt.show()

输出
在这里插入图片描述

样条插值

样条插值是一种使用分段多项式函数拟合一组数据点的插值方法。插值函数是通过将数据划分为更小的子集或“段”,并将低次多项式拟合到每个段来构造的。然后,这些多项式段在称为节点的点处连接在一起,形成连续且平滑的插值。
scipy库提供了几个样条插值函数,例如interp2d和Rbf。

import numpy as np
from scipy.interpolate import Rbf
import matplotlib.pyplot as plt# Generate random 3D data points
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.cos(np.sqrt(X**2 + Y**2))
# Fit a radial basis function model
rbf = Rbf(X, Y, Z, function="quintic")
Z_pred = rbf(X, Y)# Plot the original data and the fitted function
fig = plt.figure()
ax = fig.add_subplot(projection="3d")
ax.plot_surface(X, Y, Z)
ax.plot_surface(X, Y, Z_pred)
plt.show()

输出
在这里插入图片描述
在本文中,我们讨论了如何使用SciPy库在Python中执行3D曲线拟合。我们生成了一些随机的3D数据点,定义了一个多项式函数用于曲线拟合,并使用曲线拟合函数来找到函数的优化参数。然后,我们使用这些参数在3D空间中绘制拟合曲线。

曲线拟合是数据分析和数学建模的强大技术,Python提供了几个库,可以轻松执行曲线拟合。SciPy库是Python中曲线拟合的热门选择,它提供了几个可用于1D,2D和3D空间中曲线拟合的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/197620.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux:安装MySQL服务(非docker方式)

1、下载安装包 下载MySQL安装包,需要Oracle官网的账号 下面是网友提供的账号及密码,亲测有效。 账户:3028064308qq.com 我用的这个,可以登陆 密码:OraclePassword123!Oracle Account: 602205528qq.com Oracle Pass…

nvm的下载与使用

1.如果已经安装nodejs , 先卸载nodejs; 从控制面板中 卸载程序 卸载nodejs win r打开cmd ,管理员运行 where node 查看是否删除干净nodejs 2.下载nvm 从github 下载nvm , 下载nvm 3.nvm 和node安装路径最好写在同一个路径下 ,如D盘 ,D\a\nvm , D\a\nodejs 4.…

Cesium点位弹窗

1.弹窗没法向加入点位一样加入到地图内部,entity没法实现 2.使用绝对定位,将地图组件通过定位加入到地图上,注意弹窗层级一定在地图上 3.通过判断点击位置是否是点位来获取entity信息,将信息显示在弹窗 4.将点击处点位的经纬度转为…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快?(应届) ①redis是纯内存结构,避免磁盘I/O的耗时 ②redis核心模块是一个单进程,减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制(每一个执行线路可以同时完…

拜托!佛系点,你只是给社区打工而已

社区人到年底了各种要写的东西很烦啊!突然看到这个,真的谢谢啊! 家人们谁懂啊?!!平时写个东西起码两三天,试了一下这东西!输入需求,一键生成,写好了&#xf…

计算机专业毕业后的选择有哪些?

这就得看你自己的职业规划啦,现在考公考研也很卷,就业环境也不太乐观,既然这样,做选择就遵守自己的内心,从自己的职业规划和兴趣来选吧。 下面我们就先对这三条路的职业方向来做分析: 1.考研 考研也有两…

2024年测试工程师必看系列之fiddler设置手机端抓包全套教程

fiddler设置手机端抓包 安卓手机抓包 第一步:配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内;首先从fiddler处获取到ip地址和端口号: ,点击online,最后一行就是ip地址 2、路径:Tools》Op…

java基础练习缺少项目?看这篇文章就够了(上)!

公众号:全干开发 。 专注分享简洁但高质量的动图技术文章! 项目概述 本教程适合刚学习完java基础语法的同学,涉及if语句、循环语句、类的封装、集合等基础概念,使用大量gif图帮助读者演示代码操作、效果等,是一个非常…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(六)

新增菜品 1.1 需求分析与设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 2.2 代码开发2.2.1 文件上传实现2.2.2 新增菜品实现 2.3 功能测试 1.1 需求分析与设计 1.1.1 产品原型 后台系统中可以管理菜品信息,通过 新增功能来添加一个新的菜品,在添加菜品…

【以图会意】操作系统的加载流程

声明:本图为博主方便自己记忆理解,诸多疏漏望请博友理性观看!如有错误不足恳请指正。 首先,操作系统是一段程序,他保存在ROM中,在开机时,CPU被激活,首先将IR置为BIOS(Bas…

单链表相关面试题--3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

/* 解题思路: 通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置 */ typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head)…

文心一言 VS 讯飞星火 VS chatgpt (139)-- 算法导论11.4 3题

三、用go语言,考虑一个采用均匀散列的开放寻址散列表。当装载因子为 3/4 和 7/8 时,试分别给出一次不成功查找和一次成功查找的探查期望数上界。 文心一言: 在开放寻址法中,当散列表的装载因子超过其阈值时,会触发重…