使用Python实现3D曲线拟合

news2024/11/24 6:52:57

曲线拟合是数据分析和数学建模领域中广泛使用的技术。它涉及到寻找最接近一组数据点的数学函数的过程。在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 = xy
	return 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 = xy
	return 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.coloradmin.cn/o/1230085.html

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

相关文章

三、机器学习基础知识:Python常用机器学习库(图像处理相关库)

文章目录 1、OpenCV1.1 窗口操作函数1.2 图像处理1.3 图像捕获与人脸检测 2、PIL2.1 主要函数2.2 表情图像合成2.3 手写数字转换2.4 滤波查找图像边缘 1、OpenCV OpenCV Python是一个用于解决计算机视觉问题的Python库,是用基于C实现的OpenCV构成的Python包。OpenC…

【C语言 | 指针】多级指针、多维数组

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

亚马逊、shein新品如何快速获得页面流量?自养号技术防关联解决要点及好处

在当今电子商务时代,亚马逊已经崭露头角,成为全球最大的在线零售商之一。数以亿计的消费者在亚马逊上购物为新产品提供了机会,但要在激烈的竞争中脱颖而出并快速获得页面流量并不是一件容易的事情。本文将详细探讨亚马逊新品如何快速获取页面…

C++ 继承和派生 万字长文超详解

本文章内容来源于C课堂上的听课笔记 继承和派生基础 继承是一种概念,它允许一个新创建的类(称为子类或派生类)获取另一个已经存在的类(称为父类或基类)的属性和行为。这就好比是子类继承了父类的特征。想象一下&…

拼多多官方开放平台接口app商品详情接口获取实时商品详情数据演示

拼多多开放平台提供了一种名为“商品详情接口”的API接口,它允许卖家从自己的系统中快速获取商品信息,如商品标题、描述、价格、库存等,并将这些信息展示在自己的店铺中。通过该接口,卖家可以更好地管理自己的商品库存和销售&…

【前端学java】复习巩固-Java中的对象比较(14)

往期回顾: 【前端学java】JAVA开发的依赖安装与环境配置 (0)【前端学 java】java的基础语法(1)【前端学java】JAVA中的packge与import(2)【前端学java】面向对象编程基础-类的使用 &#xff08…

9.docker镜像Tag为none的原因

1.现象 使用docker images命令查看镜像列表,会发现存在许多标签为none的镜像: 2. 原因 docker镜像标签为none的原因如下: (1)构建或重新拉取同名同Tag的新镜像:构建或重新拉取同名同Tag的新镜像后&…

SpringSecurity6 | 问题答疑

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏&#xf…

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

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

mongodb——概念介绍(文档,集合,固定集合,元数据,常用数据类型)

mongodb 层级结构 实例:系统上运行的进程及节点集,一个实例可以有多个库,默认端口 27017。 库:多个集合组成数据库,每个数据库都是独立的,有自己的用户、权限信息,独立的存储文件集 合。 集合&…

选择java商城开发商需要注意哪些方面?

Java商城开发是一项庞大而复杂的任务,选择一家合适的开发商至关重要。那么,我们在选择Java商城开发商时,需要注意哪些方面呢? 1、专业经验 选择具有丰富经验的开发商是至关重要的。开发商应该拥有多年的Java开发经验,…

Thales安全解决方案:国家网络安全的关键

随着信息技术的飞速发展,网络安全问题日益凸显。在这个背景下,Thales安全解决方案正成为提高国家网络安全的关键。本文将探讨Thales安全解决方案如何为国家网络安全保驾护航。 一、Thales安全解决方案概述 Thales安全解决方案是一种全方位的网络安全防护…

武汉凯迪正大KDHG-220P互感器综合测试仪

主要特点 武汉凯迪正大KDHG-220P互感器综合测试仪,仅需进行简单的数字设定:设定互感器的额定参数。仪器将全过程自动记录数据,并自动将变比极性、伏安特性曲线等计算并显示出来,省去换线、手动调压、人工记录、整理、描曲线等烦琐…

Spring Boot 与 Gzip 压缩

响应压缩是 Web 应用一种常见的优化手段,通过压缩算法减小传输数据的体积,提高传输效率、节约带宽。客户端接收到数据后,使用相同的算法对数据进行解压从而获取到原始数据。 客户端和服务器需要通过 Header 来协商双方支持的压缩算法。 Acc…

我了解的3D游戏引擎和图形开发框架

如果你像我一样,没有什么比编写或设计软件更让人兴奋的了。 当我编写代码时,我所获得的巨大快乐促使我开发了跨越许多软件领域的项目。 这些领域之一是为本机应用程序、桌面展示或 Web 创建 3D 图形。 我从未创建过任何 3D 游戏,但很多时候我…

【Rust】快速教程——一直在单行显示打印、输入、文件读写

前言 恨不过是七情六欲的一种,再强大的恨也没法独占整颗心,总有其它情感隐藏在心底深处,说不定在什么时候就会掀起滔天巨浪。——《死人经》 图中是Starship扔掉下面的燃料罐,再扔掉头顶的翅膀后,再翻转过来着陆火星的…

SASS/SCSS精华干货教程

目录 介绍 基本说明 特点 sass语法格式sass的语法格式一共有两种,一种是以".scss"作为拓展名,一种是以".sass"作为拓展名,这里我们只讲拓展名: 编译环境安装 Vscode安装编译插件 简单使用 sass语法扩张…

15.ORACLE11g的归档方式和日志文件的相关操作

ORACLE11g的归档方式和日志文件的相关操作 一、什么是日志文件1、在线日志文件2、归档日志文件 二、Oracle 11g 归档方式:1、归档方式状态2、归档日志方式下数据库的工作原理3、配置归档日志方式3.1 开启归档模式3.2 日志文件相关操作: 4、oracle11g联机…

API接口测试工具为什么尤其重要

在现代软件开发中,API接口测试工具扮演着关键的角色,连接不同的软件组件,实现数据传递和功能调用。为确保API的可靠性、安全性和性能,此工具成为不可或缺的一部分。本文将介绍API接口测试工具的重要性! 1. 自动化测试的效率 API接…

Java集合大总结——Set的简单使用

Set的简单介绍 Set接口是Collection的子接口,Set接口相较于Collection接口没有提供额外的方法。Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个 Set 集合中,则添加操作失败。Set集合支持的遍历方式和Collection集合一样&am…