基于MATLAB的函数拟合

article/2025/9/21 0:49:34

资源下载地址:https://download.csdn.net/download/sheziqiong/86763950
资源下载地址:https://download.csdn.net/download/sheziqiong/86763950

函数拟合

整体思路

将给定的坐标点分为 6 段部分,即左、左下、下、右、右上、上,6 部分。

其中左下和右上部分使用二次函数进行拟合,其他部分使用一次函数进行拟合。

观察数据

第 1-76 个点作为左边部分线性拟合

第 67-96 个点作为左下部分二次拟合

第 84-215 个点作为下部分线性拟合

第 216-275 个点作为右部分线性拟合

第 269-298 个点作为右上部分二次拟合

第 296-382 个点作为上部分一次拟合

代码实现

先得到 x、y 数据的散点向量,然后调用 polyfit 库函数,返回线性回归的函数参数,然后初始化较为密集的 x 横坐标作为样点横坐标,用求得的拟合函数代入样点横坐标得到样点纵坐标。此时较为密集的样点通过 plot 函数显示出来,即可得到拟合效果图

  • 最终效果

在这里插入图片描述

可以看出,在左下和右上通过二次函数拟合,在其他位置使用一次函数线性拟合

  • 遇到的问题和解决方案

在最初选取拟合的坐标时,在 6 个曲线部分,每个部分选择的点集都不相交(相互互斥),此时的效果图并不理想:如下

在这里插入图片描述

可以看出曲线中间有较大的空余,为了解决这个问题,不断地调整点集的区间(适当扩大),使每个区间的点集相互是有部分交集的,例如点 1-76 是第一部分,点 67-96 是第二部分,此时点 67-76 不但是左边部分的点来线性拟合,又是左下部分的点来二次拟合,效果会好很多,如下:

在这里插入图片描述

  • 拟合结果:

左边(第 1-76 个点):y=0.0983x-381.095

左下(第 67-96 个点):y=0.0055

在这里插入图片描述

+4.5245x+299.2073

下边(第 84-215 个点):y=0.0208x-600.9287

右边(第 216-275 个点):y=-0.0721x+383.0611

右上(第 269-298 个点):y=-0.0056
在这里插入图片描述

+4.0934x-901.1372

上边(第 296-382 个点):y=0.011x-181.6471

函数插值

线性插值

整体思路

首先将标记为 1 的点单独储存在 v1 矩阵中,每一行为点的时间、横纵坐标,然后对于每一个标记为 0 的缺失点 Q,找到其最近的前后存在的点 AB,用 A 和 B 进行线性插值,该缺失点在线性插值直线 AB 上,且由 Q 的时间已知,AB 的到达时间也已知。不妨假设时间的比例(tQ-tA)/(tB-tA)和横坐标比例(xQ-xA)/(xB-xA)相等解出缺失点的横坐标,然后代入插值函数,求得缺失点坐标然后把缺失点存储在 v2 矩阵中,每一行为缺失点信息最后用 plot 把图像描绘出来

代码实现

利用 coord 的第二列为横坐标,第三列为纵坐标,第一列为时间将未缺失点存储在 v1 中,缺失点存储在 v2 中,利用假设物体在横坐标的投影匀速移动得到缺失时刻对应横坐标,然后利用插值函数(线性插值)获取纵坐标,利用 plot 函数描绘曲线。插值函数即获取斜率 k 和截距 b 即可

斜率 k=(y2-y1)/(x2-x1)

截距 b 为(x1y2-x2y1)/(x1-x2)

Temp_x,temp_y 用来暂时存储缺失点的横纵坐标,最终存储在 v2 矩阵中

最终效果

在这里插入图片描述

三次样条插值

整体思路

  • 对于 309 个未缺失的点,存在 308 个区间,每个区间都用三次函数插值
  • 一共需要 4*308 个参数要确定
  • 那么需要 4*408 个方程
  • 其中 309 个是插值函数满足的点的插值条件个内点满足:函数值、导数值、二阶导数值连续
  • 还需要 2 个边界条件,不妨设第一个点和最后一个点处导数是 0(自然边界起始条件)
  • 核心思想就是解这 4408 个方程得到 4408 个系数的结果。
  • 那么 M 为系数矩阵,Y 为方程的结果向量,
  • 系数矩阵填上系数(对应于方程)
  • 然后利用 M\Y 即可获得 X,即 4*408 个待定系数的值,然后描绘出这些插值函数。
  • 同样假设物体在横坐标的投影匀速移动
  • 那么缺失点横坐标可以用时间比例确定,再根据其所在区间,代入对应三次函数获得纵坐标的值

代码实现

同样将未缺失点存入 v1 矩阵,M 用来存系数矩阵,Y 用来存结果向量,X 为算出来的插值函数的结果系数的向量

  • 最终效果

插值函数的效果图:

在这里插入图片描述

缺失点的插值效果图

在这里插入图片描述

红色为缺失点插值结果,蓝色点为未缺失点,黑色为插值曲线

多项式插值

实现思路

具体实现考虑使用分段二次函数插值,把 309 个存在点,308 个区间分成 154 组,每一个组有两个区间,三个点,相邻组之间会对存在的内点共用。

例如:x1、x2、x3 为第一组的三个插值点,x3、x4、x5 为第二组的插值点,相邻组对 x3 进行了共用。一共 154*3 个参数需要确定,每个二次函数确定 3 个参数。

可以列的方程也有 154*3 个,每个区间上都可以用待定系数的方式得到插值条件方程。

同理,填好 M 矩阵,和 Y 结果向量,运算得到二次函数系数结果向量 X

代码实现

用来存已知点

Vx1 和 vy1 存已知点横纵坐标

Vx2 和 vy2 存缺失点横纵坐标

缺失点横坐标用假设物体在横坐标的投影匀速移动来计算

缺失点纵坐标用插值函数进行计算

最终效果

在这里插入图片描述

资源下载地址:https://download.csdn.net/download/sheziqiong/86763950
资源下载地址:https://download.csdn.net/download/sheziqiong/86763950


http://chatgpt.dhexx.cn/article/8FCasc75.shtml

相关文章

【Matlab基础】数据拟合

目录 一、线性拟合 1. 常用辅助函数 2. 多元线性拟合 例子: 二、多项式拟合 三、lsqcurvefit函数 例子1: 例子2: 四、nlinfit非线性拟合 例子1: 例子2: 五、其他拟合函数 lsqnonlin fittype 一、线性拟合…

matlab 简单函数拟合(全)

学习笔记 对数据进行函数拟合有四种方式具体见连接 方法一:多项式拟合polyfit 方法二:工具箱拟合cftool 方法三:指定函数拟合 连接:matlab拟合函数的三种方法_Bily_on的博客-CSDN博客_matlab数据拟合 方法四是而利用regress函…

matlab拟合函数的三种方法

文章目录 方法一:多项式拟合polyfit方法二:工具箱拟合cftool方法三:指定函数拟合 方法一:多项式拟合polyfit x[1 2 3 4 5 6 7 8 9];y[9 7 6 3 -1 2 5 7 20]; P polyfit(x, y, 3) %三阶多项式拟合xi0:.2:10; yi polyval(P, xi)…

获取当前时间戳

获取当前时间戳 //方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime(); 获取当前时间 SimpleDateFormat df new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式 String date df.…

C# 获取当前时间戳(正确版)

https://www.cnblogs.com/yinmu/p/11228196.html 第一种&#xff1a; /// <summary>/// 获取时间戳/// </summary>/// <returns></returns>public string GetTimeStamp(){TimeSpan ts DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);return Co…

SQLserver 获取当前时间戳

SQLserver 获取当前时间戳&#xff1a; SELECT DATEDIFF(S,1970-01-01 00:00:00, GETUTCDATE()) SELECT DATEDIFF(S,‘1970-01-01 00:00:00’,GETDATE()) select SYSDATETIME() select GETDATE() select GETUTCDATE() 1.GETUTCDATE是获取格林尼治时间函数 2.GETDATE是获取北…

小程序获取当前时间戳

使用Date.parse(new Date())默认生成的时间戳是以毫秒为单位的。 可以根据业务需求&#xff0c;通过除以1000&#xff0c;来转化为秒。因为生成的时间戳末尾是000&#xff0c;所以不用担心不是整除。 控制台打印 可在js中引用以下代码 var timeStamp Date.parse(new Date()…

LocalDateTime获取当前时间戳

以上都是获取当前时间的时间戳。而要想使用localdateTime获取当前时间&#xff0c;只需要LocalDateTime.now()即可。 输出结果如下&#xff1a;

python获取当前时间戳_python 获取当前时间戳

原博文 2019-01-04 10:42 − #!/usr/bin/python # -*- coding: UTF-8 -*- import time; # 引入time模块 ticks = time.time() print("当前时间戳为:", ticks) 输出: 当前时间戳为: 1459994552.51 &nbsp... 相关推荐 2019-12-06 10:29 − 1.获取当前时间的时…

JS获取当前时间戳与时间戳转日期时间格式

一、获取当前时间的时间戳(三种方式) const t1 new Date().valueOf() // 第一种&#xff0c;推荐 const t2 new Date().getTime() // 第二种&#xff0c;推荐 const t3 Date.parse(new Date()) // 第三种&#xff0c;不推荐&#xff0c;精度差一些注&#xff1a; new Date(…

前端获取当前时间戳的3+2+1种方法

首先说下&#xff0c;三种比较常见的方法 1.Date.parse(new Date()) Date.parse(new Date()) 1656038612000 2.new Date().getTime() new Date().getTime() 1656038636915 3.new Date().valueOf() new Date().valueOf() 1656038660413 两种不常见的方法 1.Date.now() //i…

js获取当前时间、获取当前时间戳、时间与时间戳互转。

1、 JavaScript 获取当前时间戳&#xff1a; 第一种&#xff1a; var timestamp Date.parse(new Date()); console.log(timestamp); // 1622427159000第二种&#xff1a; var timestamp (new Date()).valueOf(); console.log(timestamp); // 1622427218359第三种&#xff1…

Python中tqdm模块的用法

参考 python的Tqdm模块 - 云社区 - 腾讯云 一、简介 tqdm是Python中专门用于进度条美化的模块&#xff0c;通过在非while的循环体内嵌入tqdm&#xff0c;可以得到一个能更好展现程序运行过程的提示进度条&#xff0c;本文就将针对tqdm的基本用法进行介绍。 二、基本用法 tqd…

tqdm简介及使用方法

tqdm源自阿拉伯语 taqaddum (تقدّم) &#xff0c;意思是进程( “progress”)&#xff0c;也是西班牙语中 “I love you so much” (te quiero demasiado)的缩写&#xff0c;听着就浪漫&#xff5e;。 该模块的作用就是使循环(loop)过程展示一个进度条&#xff0c;能够通过…

python中tqdm用法

tqdm安装命令&#xff1a; pip install tqdm 1.用tqdm子模块 &#xff08;1&#xff09;例子1 from tqdm import tqdm import timefor i in tqdm(range(50)):time.sleep(0.1)pass 结果如下&#xff1a; &#xff08;2&#xff09;例子2&#xff1a;带参数 from tqdm impo…

python进度条 tqdm使用教程

文章目录 安装tqdm在循环中显示进度条1. 使用tqdm.tqdm()实现进度条2. tqdm()主要参数默认值与解释3. tqdm()的返回值4. tqdm.trange()5. 循环过程中输出额外内容6. 无法获取迭代器长度的坑 *其他方法实现进度条 安装tqdm tqdm是一个显示进度条的python工具包。安装命令如下 …

DMQ简介

DMQ简y介 DMQ简介 - Water2Wine - 博客园 原文 1. DMQ简介 Distributed Message Queue&#xff08;分布式消息队列&#xff09;&#xff0c;DMQ 是在kafka之上做了一层封装&#xff0c;为AC的其他组件提供分布式消息队列服务。简单来说&#xff0c;DMQ就是一个消息中间件&a…

tqdm介绍

tqdm是一个进度条可视化库&#xff0c;可以帮助我们监测程序运行的进度&#xff0c;估计运行的时长&#xff0c;甚至可以协助debug。它是一个快速&#xff0c;可扩展的Python进度条&#xff0c;可以在 Python 长循环中添加一个进度提示信息&#xff0c;用户只需要封装任意的迭代…

python进度条神器之tqdm包的使用

前言&#xff1a;在Python开发中&#xff0c;我们经常需要使用进度条来展示任务进行的进度到哪里了&#xff0c;特别是在机器学习与深度学习框架里面&#xff0c;tqdm包是一个非常简单但是功能强大的进度条处理工具&#xff0c;一起来看看它的一些基本用法吧&#xff01; 一、…

Python中tqdm模块介绍

tqdm模块简单介绍 tqdm是一个可以显示Python进度条的模块&#xff0c;可通过pip在终端安装 pip install tqdm可通过 import tqdm 导入&#xff0c;也可通过 from tqdm import 【函数名】 导入 1. tqdm.tqdm 传入数字list: from tqdm import tqdm for i in tqdm(range(1, 5)…