matlab复杂函数多元函数拟合

article/2025/9/21 3:55:12

简介

本文介绍了基于matlab实现的复杂函数以及多元函数的拟合。在工程和研究中偶尔会遇到要用一个非常复杂的数学公式来拟合实验测量数据,对这些复杂的数学公式拟合时,采用常见的拟合方法往往会失败,或者得不到足够精确的结果。本文以笔者多年工作经验中的某些典型场景为例,介绍钻研出来的一些非常有用的拟合经验。

案例

需要对如下公式进行拟合,能看出来Y=f(Z,E,A),关于参数a1,a2,...,a13的关系

现在需要通过给定的数据点集,通过拟合得到上述参数的一套值出来

 共获得了实验数据约350组,即下列数据共350行4列,现在通过如下所示的数据集进行拟合

A	Z	E	Y
3	8	11.5163	-2.501036032
24	8	10.3738	-2.796881415
25	9	12.442	-2.830217835
27	10	12.8485	-3.442019376
28	10	11.7724	-4.074541935
29	10	16.1245	-1.609437912
30	11	17.6367	-3.036554268
31	11	15.571	-4.074541935
32	11	19.4956	-4.327538449
33	11	18.3907	-4.803621125
34	11	22.5039	-5.203007187
35	11	21.8553	-6.502290171
32	12	10.2576	-2.120263536
.
.
.

拟合采用的方法是matlab提供的 lsqnonlin 方法,该方法在帮助文档中解释是

lsqnonlin: Solve nonlinear least-squares (nonlinear data-fitting) problem(非线性最小二乘);

该函数的基本使用方法就是

% 函数  lsqnonlin 非线性最小二乘
% 格式 
x = lsqnonlin(fun,x0)
x = lsqnonlin(fun,x0,lb,ub)
x = lsqnonlin(fun,x0,lb,ub,options)
% x0为初始解向量;
% lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];
% options为指定的优化参数;
% lsqnonlin解决非线性最小二乘法问题,包含非线性数据的拟合问题
% 其中初值x0要有。lb,ub,option可为空

然而在运用到实际工程中,需要完成以上公式的拟合时,需要考虑几个问题:

(1)该方法拟合时,需要给定每个参数的初始值,而且不同的初始值,拟合出来的结果可能并不相同,甚至差异非常大;

(2)有的初始值选取会导致拟合失败,直接得不到结果;

(3)该怎样写函数fun才能得到有效的拟合;

(4)当得到拟合结果,即一组参数a1,a2,...,a13的值时,怎样判定其精确度,以及准确性;

拟合结果:

以下是得到的一组合理的结果,

a(1)=10.163845,
a(2)=0.395367,
a(3)=-0.975375,
a(4)=3.311806,
a(5)=4.096069,
a(6)=1.211358,
a(7)=-17.871560,
a(8)=1.283213,
a(9)=12.979366,
a(10)=43.064128,
a(11)=24.059464,
a(12)=0.598062,
a(13)=10.028580,

对比实验值和拟合后的公式计算值

实验值          拟合公式计算值
-2.501036032	-2.225177809
-2.796881415	-2.564047068
-2.830217835	-2.630709452
-3.442019376	-2.810040425
-4.074541935	-3.138910417
-1.609437912	-3.94426673
-3.036554268	-3.824619464
-4.074541935	-3.787810766
-4.327538449	-4.383690344
-4.803621125	-4.618642492
-5.203007187	-5.173452295
-6.502290171	-5.479602794
-2.120263536	-2.590791649
-2.407945609	-3.299192629
-3.912023005	-3.345059132
-2.659260037	-4.06265759
-2.813410717	-3.529119214
...
...

拟合的结果和原始实验数据点相比,相当接近

下图是350个点的 拟合结果和实验值对比,二者曲线贴近效果良好

 下图是局部的放大观察

 用 re=sum(abs(YA-Y))/length(Y);统计350个点的平均偏离程度,Y为实验值,YA为计算值,平均值计算结果为 re=0.623681,

定义相对偏差 abs(YA-Y)/abs(Y)

350个数据点中有300的拟合值和实验值的偏差在1倍以内,这些点的平均偏差在30%左右,

50个点的偏差大于1倍,但这大部分也只是因为实验值太小,拟合值和实验值的绝对偏差除以很小的实验值,会得到很大的相对值。

拟合结果是很好的,公式很符合实验数据

 最小二乘法与非线性拟合

定义: 最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可 以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

最小二乘法是以如下目标函数最小化的一种优化方法:

其中是指定的拟合函数,或者说回归模型;是所有拟合数据集的值;

对于一个具体的拟合,例如,是一个具有4个参数的3元拟合函数,且提供拟合数据集共m组数据,即(),…, ()

那么

,最小二乘法就是要求得一组使得e最小。

要求一组使得取最小值,是一个单目标优化问题,通常对于这种优化问题,有多种优化算法,通常采用梯度下降法求解

关于梯度下降法,参考:

梯度下降法原理解析(大白话+公式推理)_梯度下降法公式_又是谁在卷的博客-CSDN博客

对于拟合:是关于的线性函数,所以该拟合是一个线性拟合。

在计算的迭代过程中,有

为梯度下降法中的学习率

对于的迭代计算过程与类似。

其中

下面列举一个非线性拟合的示例:

假定有如下拟合函数

是关于的非线性函数,它是具有5个参数的2元拟合函数

同样采用m组拟合数据,

在计算的迭代过程中,有

对于的迭代计算过程与类似。

其中=

梯度下降法通过以上迭代公式去计算

得到后,也就完成了最初的拟合任务。

总结

本文介绍了一个具有3个变量,14个参数的复杂多元函数的拟合实现,通过matlab的lsqnonlin方法实现,并分享了一些拟合的技巧心得。

中间过程的脚本和数据,以及心得技巧在此分享给有需要的人,共勉

链接:https://pan.baidu.com/s/1JO2DFQ5b1AP0GGtFErn19w?pwd=ptty 
提取码:ptty


http://chatgpt.dhexx.cn/article/yM8Kbor2.shtml

相关文章

5.5matlab曲线拟合(多项式函数拟合)

曲线拟合的三种功能: (1)估算数据 (2)预测趋势 (3)总结规律 1、引例-人口预测问题 人口增长是当今世界上都关注的问题,对人口增长趋势进行预测是各国普遍的做法。已知某国1790年到2010年间历次人口普查数据如下表所示,请预测该国2020年的人口数。 解决思…

matlab自定义函数拟合散点

假若现在我们有如下的二维散点: x1:10; y[99.999 50.499 20.333 10.788 4.8111 2.7500 1.2322 0.4861 0.29501 0.1113498]; 在了解这些散点的大致分布之后,我们可以自己定义和其有相同单调性的函数来对散点进行拟合。 看其分布有点像对数函数&…

如何用matlab拟合二元函数,matlab二元函数拟合怎么设计函数。

matlab二元函数拟合怎么设计函数。 mip版 关注:169 答案:2 悬赏:20 解决时间 2021-01-24 19:12 已解决 2021-01-24 01:01 下面是数据,要求拟合一个二元函数,自变量为a,b。请问在非线性拟合之前怎么设计函数,使其拟合误差最小。很急,请大家帮帮忙。 a\b6.187.58.710.812…

matlab拟合函数 自定义,MATLAB 自定义函数拟合

%自定义拟合函数f(t)a*cos(k*t)*exp(w*t) clc,clear syms t x[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];%列向量 y[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.08;0.032;-0.015;-0.02]; ffittype(a*cos(k*t…

false函数matlab,ISNUMBER函数使用表达式说明表 matlab拟合函数表达式

ISNUMBER函数使用表达式说明表 matlab拟合函数表达式,【excel助手】今天为大家分享一篇干货知识,如何设置matlab拟合函数表达式,今天的分享角度是从工作中常用的角度谈的,正如标题提到的“ISNUMBER函数使用表达式说明表 matlab拟合函数表达式…

Matlab-函数拟合

文章目录 0. 评价指标1. 工具箱拟合——cftool2. 万能拟合 ——nlinfit3. 多项式拟合 ——polyfit参考 0. 评价指标 一、SSE(和方差) 该统计参数计算的是拟合数据和原始数据对应点的误差的平方和,计算公式如下 SSE越接近于0,说明模型选择和拟合更好&…

MATLAB函数拟合使用

1 函数命令拟合 最常用的函数拟合命令为fit,语法为| [拟合结果 拟合精度]=fit(X数据,Y数据,‘拟合类型’) 其中,具体的拟合类型可以参看帮助文档,也可以使用fittype来自定义新的函数…

MATLAB函数拟合指令,MATLAB拟合函数使用说明

(由于不方便上传公式,有部分直接截图) 2. Polyval函数 对应多项式拟合,多项式求值函数也相当重要,可以通过设定向量,快速定义如下多项式 据此,可以大概猜测到polyval调用的形式了 y = polyval(p,x) 如上所述 [y,delta] = polyval(p,x,S) S即为polyfit函数返回的误差估计,…

基于MATLAB的函数拟合

资源下载地址:https://download.csdn.net/download/sheziqiong/86763950 资源下载地址:https://download.csdn.net/download/sheziqiong/86763950 函数拟合 整体思路 将给定的坐标点分为 6 段部分,即左、左下、下、右、右上、上&#xff0…

【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…