使用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.mzph.cn/news/150150.shtml

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

相关文章

暖阳脚本_ 将Agent技术的灵活性引入RPA,清华等发布自动化智能体ProAgent

RPA暖阳脚本 近日,来自清华大学的研究人员联合面壁智能、中国人民大学、MIT、CMU 等机构共同发布了新一代流程自动化范式 “智能体流程自动化” Agentic Process Automation(APA),结合大模型智能体帮助人类进行工作流构建&#x…

QT下使用QChart绘制曲线

目录 头文件内容构造函数AddSeries方法UpdateSeries方法AppendSeriesData方法SetLegendVisiableSetRubberBandCPP内容测试函数 需要用到的头文件&#xff1a; #include <QtCharts/QChart> #include <QtCharts/QChartView> #include <QtCharts/QValueAxis> #…

广西南宁新能源汽车电机定子三维扫描3D尺寸测量检测-CASAIM中科广电

一、背景介绍 电机定子压圈是一种用于电机上对电机定子的两端进行固定的辅助装置&#xff0c;在电机制造业中&#xff0c;电机定子制造的工艺水平往往能够直接决定电机制造的性能质量。而传统电机定子检测主要通过三坐标测量以及人工卡尺测量两种测量方式&#xff0c;三坐标每…

在服务器上部署MVC 6应用程序

在服务器上成功部署MVC 6应用程序&#xff08;现在更为称为ASP.NET Core MVC&#xff09;涉及一系列步骤。以下是一般的指导步骤&#xff1a; 1. 准备服务器环境&#xff1a; - 确保服务器上安装了.NET Core Runtime和.NET Core SDK。可以从[.NET下载页面](https://dotnet.mi…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…

【LeetCode刷题】--9.回文数

9.回文数 class Solution {public boolean isPalindrome(int x) {if(x < 0){return false;}int tmp x, sum 0;boolean flag false;while(x ! 0){sum sum * 10 x % 10;x / 10;}if(sum tmp){flag true;}return flag;} }

Ubuntu端口用法介绍

一、端口概述 端口是用于网络通讯中标识应用程序的通信机制。在Ubuntu系统中&#xff0c;共有65536个端口。 其中&#xff0c;0号端口保留&#xff0c;1-1023为系统端口&#xff0c;一般被系统进程或服务占用。1024-49151为注册端口&#xff0c;可以被用户进程或服务使用。49…

nvm的下载与使用

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

算法之路(二)

&#x1f58a;作者 : D. Star. &#x1f4d8;专栏 : 算法小能手 &#x1f606;今日分享 : 你知道北极熊的皮肤是什么颜色的吗&#xff1f;&#xff08;文章结尾有答案哦&#xff01;&#xff09; 文章目录 力扣的209题✔解题思路✔代码:✔总结: 力扣的3题✔解题思路&#xff1a…

力扣:172. 阶乘后的零(Python3)

题目&#xff1a; 给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长…

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

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

后端接口测试,令牌校验住,获取tocken 接口的方式

post : http://127.0.0.1:端口号/login { "username":"admin", "password":"admin123", "code":"3", "uuid":"966c34e409434f15942ec29a284da0a6" } headers tocken false

Vue3-provide 和 inject 跨组件传递数据

Vue3-provide 和 inject 跨组件传递数据 功能&#xff1a;将数据从App组件跨过一个组件传递到B组件中provide&#xff1a;提供数据inject&#xff1a;接收数据 // App.vue <template><h2>我是App组件&#xff08;{{num}}&#xff09;</h2><A></A&g…

软件测试/测试开发/人工智能丨视觉与图像识别自动化测试

视觉与图像识别在软件自动化测试领域中的应用是越来越重要的一项技术&#xff0c;它使得测试可以更全面、准确地模拟用户对图形用户界面&#xff08;GUI&#xff09;的交互。以下是视觉与图像识别在软件自动化测试中的主要应用&#xff1a; 1. 自动化 GUI 测试 视觉与图像识别…

服务器IPMI管理操作

简介&#xff1a;智能平台管理界面&#xff08;IPMI&#xff0c;Intelligent Platform Management Interface)是管理基于 Intel 结构的企业系统中所使用的外围设备采用的一种工业标准&#xff0c;用户可以利用IPMI监视服务器的物理健康特征&#xff0c;如温度、电压、风扇工作状…

使用Spark SQL读取阿里云OSS的数据

读OSS数据 创建一个table&#xff0c;并关联OSS目录路径 CREATE TABLE my_table USING parquet OPTIONS (path oss://my_bucket/my_data_dir/dt20230904, -- 关联OSS路径header true, -- 如果Parquet文件包含列名的头部信息&#xff0c;则设置为true&#xff0c;否则设置为f…

马斯克回应OpenAI混乱:如果这关乎AI安全,那将影响整个地球

马斯克回应OpenAI混乱&#xff1a;如果这关乎AI安全&#xff0c;那将影响整个地球 2023-11-20 16:14秦丝进销存 近日&#xff0c;“马斯克回应ChatGPT之父被开除”登上热搜&#xff0c;特斯拉首席执行官马斯克曾与ChatGPT之父奥特曼一起创建OpenAI&#xff1b; 他在一篇”网友…

js中什么看做false

js中什么看做false 在javascript中&#xff0c;有一些值会被视为false&#xff0c;这些值通常被称为“假值(falsy values)”。虽然它们不是布尔值真正意义上的false&#xff0c;但它们在条件语句判断中会被视为假false&#xff0c;因此了解这些假值非常重要。 下面是javascri…

以八电极模块做一个脂肪秤方案设计

脂肪遍布我们全身&#xff0c;除了基础脂肪&#xff0c;在骨头、神经等组织都有它的存在&#xff0c;起到一种隔热、保温和缓冲的作用。脂肪在人体重量的占比(体脂率)是检测肥胖最佳的方法。 所以近几年开始流行起脂肪秤这类型的电子秤&#xff0c;只要站上去就能轻松知道自己…

海康威视综合安防管理平台任意文件上传

系统介绍 HIKVISION iSecure Center综合安防管理平台是一套“集成化”、“智能化”的平台&#xff0c;通过接入视频监控、一卡通、停车场、报警检测等系统的设备&#xff0c;获取边缘节点数据&#xff0c;实现安防信息化集成与联动&#xff0c;公众号&#xff1a;web安全工具库…