1 函数拟合

函数拟合在工程(如采样校正)和数据分析(如隶属函数确定)中都是非常有用的工具。我这里将函数拟合分为三类:分别是多项式拟合,已知函数类型的拟合和未知函数类型的拟合。matlab中关于函数的拟合提供了很多的拟合函数,这里不再一一介绍。仅对常用的多项式拟合和已知函数类型的拟合中一部分matlab函数的使用进行介绍。

1.1多项式拟合

对于



形式的拟合函数,其中



为待定系数。我们可以使用matlab中的polyfit函数进行拟合。函数的调用形式为:

coef = polyfit(xx,yy,n);

其中xx,yy分别为已知的自变量和因变量数据,n为拟合的阶次。下面是一个使用的例子。

clear
clc %清除 %设置参数
xx = [1,2,3,4,5];
yy = [6.1,7.2,8.1,9.2,10.1];
n = 1; %选择一阶拟合 %下面代码不用修改
coef = polyfit(xx,yy,n);
%上面已经求出结果,下面是进行绘图显示
Fun = poly2sym(coef) %显示拟合函数
xmax = max(xx);
xmin = min(xx);
xnum = 2*length(x1)+50;
x = linspace(xmin,xmax,xnum);
y = polyval(coef,x);
plot(xx,yy,'o',x,y);
title(char(Fun))

运行完成后,会在matlab命令行窗口显示Fun=x+257/50.同时会绘图如下:



上面这段代码可以直接拿来使用,只需要改动xx,yy,n即可。后面的代码不需要修改。为了进一步方便使用,我简单的制作了一个GUI界面,同样只需要设定相关值,点击开始拟合就可以拟合了。

简单的GUI界面

如下所示:

1.2已知函数类型的拟合

我们在数据分析的时候经常遇到这种情况:知道了函数的隶属函数和隶属函数上的一些点,求隶属函数的待定系数。由于隶属函数基本都不是多项式的形式,于是我们就不能使用ployfit函数了。这里我以拟合偏大型柯西分布隶属函数和对数隶属函数为例,介绍fitnlinfit在已知函数类型时的拟合应用。

关于函数的具体用法我这里就不介绍了,大家可以在matlab中doc一下帮助文件,也可以上网查询相关介绍。如果着急使用又不想了解原理的话可以直接修改下面程序中需要拟合的数据和函数类型即可。

假设需要拟合的偏大型柯西分布隶属函数和对数函数组合的分段函数如下所示:



其中待定系数



同时给出已知数据点



分别采用fitnlinfit对第二段偏大型柯西分布隶属函数拟合代码如下:

clear
clc %清除工作空间
syms x; %公共参数设置
xx=[3,5]'; %这里设置已知自变量向量(列向量)
yy = [0.8,1]'; %对应因变量(列向量)
startPos = [1,1]; %设置系数的起始搜索点
%使用fit函数拟合的
%设置参数
f = '(1+alpha*(x-belta)^(-2))^(-1)'; %设置需要拟合的函数形式
funType=fittype(f,'independent','x',...
'coefficients',{'alpha','belta'}); %在independent后面设置自变量,在coefficients后面设置待定系数(多个值用{}括起来)
%使用nlinfit函数进行拟合的
%设置参数
f1 = @(coef,x)(1+coef(1)*(x-coef(2)).^(-2)).^(-1); %设置需要拟合的函数(内联函数形式) %后面的代码不用改
%fit拟合相关代码
opt=fitoptions(funType);
set(opt,'StartPoint',startPos);
cfun=fit(xx,yy,funType,opt) %命令行显示结果
plot(cfun,'r',xx,yy,'*') %nlinfit拟合相关代码
coef=nlinfit(xx,yy,f1,startPos);
disp('nlinfit拟合后的系数矩阵为:');
disp(coef); hold on
xmax = max(xx);
xmin = min(xx);
xnum = 2*length(xx)+50;
x = linspace(xmin,xmax,xnum);
y = f1(coef,x);
plot(x,y,'g'); legend('原始数据','fit拟合','nlinfit拟合')

两种方法的拟合结果会在命令行中显示,同时给出拟合绘图结果如下图所示:

函数使用介绍:

  1. 只需要在参数设置的地方设置相关参数即可。
  2. nlinfit函数拟合时采用内联函数的形式,需要主要系数和自变量都是一个向量,自己要将向量的每个元素和实际系数对应好。
  3. fit拟合函数采用符号表达式的形式,所以函数看起来就顺眼多了。但是那些符号是自变量哪些是系数要写清楚。
  4. 事实上,这两个函数不仅支持单自变量拟合,还可以进行多自变量拟合,但是后面不需要改的代码也要自己该。因为plot绘制不了多变量图形。

函数特点介绍:

  1. 一般这种函数的拟合都采用的搜索算法,因此得到的解基本没用“最优解”(如果有最优解的话使用solve应该能解出来)。
  2. 搜索算法都比较依赖第一个初始搜索点,startPos的设置也非常关键。不同的起始搜索点得到的结果可能不一样。
  3. 当然搜索算法的不同得到的结果也可能不一样(比如上面两种)。这也是matlab中有那么多拟合函数的原因(还有lsqcurvefit,regress等)。将每个函数看出一个专家的话,这个诊断不出来,可以换一个专家看看。

    照猫画虎我们可以对前面的对数函数进行拟合。修改设置参数部分代码如下:
%公共参数设置
xx=[1,3]'; %这里设置已知自变量向量(列向量)
yy = [0.01,0.8]'; %对应因变量(列向量)
startPos = [1,1]; %设置系数的起始搜索点
%使用fit函数拟合的
%设置参数
f = 'a*log(x)+b'; %设置需要拟合的函数形式
funType=fittype(f,'independent','x',...
'coefficients',{'a','b'}); %在independent后面设置自变量,在coefficients后面设置待定系数(多个值用{}括起来)
%使用nlinfit函数进行拟合的
%设置参数
f1 = @(coef,x)coef(1)*log(x)+coef(2); %设置需要拟合的函数(内联函数形式)

同样命令空间会给出拟合后的结果以及显示拟合后的曲线。

可以看出这回两种方法拟合的结果完全一样,后面绘制的曲线已经完全挡住了先绘制的。采用不同的方法,不同的起始搜索位置得到了相同的结果往往说明这个结果非常接近全局最优点。

ps:关于函数形式未知的函数拟合,我好久都没用到过了也懒得总结。或许以后再用到时会将这一部分内容补上吧!或许吧~~其实如果我们不知道函数的形式,使用插值往往更好一些。因为函数的拟合往往都需要运气,并不一定能成功。而插值基本都会成功了。

matlab函数拟合的更多相关文章

  1. MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)

    MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在MATLAB中“fitgmdis ...

  2. matlab多项式拟合以及指定函数拟合

    clc;clear all;close all;%% 多项式拟合指令:% X = [1 2 3 4 5 6 7 8 9 ];% Y = [9 7 6 3 -1 2 5 7 20]; % P= poly ...

  3. MATLAB中拟合算法刚入门

    %%%1.拟合问题:(做预测,主要使用的范围是样本比较小,拟合效果会好,样本比较多,拟合的效果就不是很好) 1.应用预测的场景:已经知道10年的样本,预测第11年以内的数据 2.用拟合的到关系式:样本 ...

  4. WPF调用Matlab函数方法

    有的时候用C#写图像处理方法,比较费事,不如Matlab简单,但是Matlab又做不出WPF那样的好看界面,怎么办呢. 今天正好我要实现这个功能,就顺便写个小例子,给需要的人做个借鉴. 想要用WPF调 ...

  5. matlab函数_连通区域

    1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)De ...

  6. matlab函数bwareaopen的详解

    matlab函数_连通区域 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下 ...

  7. java调用matlab函数

    如何将实验结果在matlab中可视化呢,下面使用java语言编程,调用matlab中的函数: 本人安装的是Matlab7.11.0 (R2010a)和 Eclipse 4.2 : 1)首先设置环境变量 ...

  8. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  9. MATLAB 函数

    MATLAB函数大全 1.常见 http://wenku.baidu.com/link?url=tPpwD7Ox_1sG-SQv_XdYszBAPY9LX_Zb_dde_5JeOiu7RwN_i14X ...

随机推荐

  1. 0 开发的准备工作一一虚拟机virturalbox

    https://www.virtualbox.org/wiki/Linux_Downloads官网下载linux版本 https://www.ubuntu.com/desktop/developers ...

  2. windows安装AnyProxy 配合夜神模拟器抓包

    AnyProxy是阿里巴巴基于 Node.js 开发的一款开源代理服务器.做为中间代理服务器,它可以收集所有经过它的http请求流量(包括https明文内容):它提供了友好的web界面,便于直观的查看 ...

  3. 2017秋季面向对象程序设计(Java)教材、教学纲要、考核要求

    教材简况 凯 S.霍斯特曼 (Cay S. Horstmann)(作者), 周立新(译者), Java核心技术(卷1):基础知识(原书第10版) , 2016年9月1出版 本书包括两卷,选做教材的是卷 ...

  4. python全栈 函数名 闭包及迭代器

    1,函数名的运用 2.闭包 3.迭代器 一.函数名的运用 1.函数名的命名规范和变量是一样的 函数名其实就是变量名 (1)函数名的内存地址 例: def func(): print("ale ...

  5. centos7.4上安装python3环境的坑

    前言:为了将爬虫项目布置到服务器上,才有了今天这一下午的坑,必须记录 不要动现有的python2环境!不要动现有的python2环境!不要动现有的python2环境! 解压 tar -xvf Pyth ...

  6. I/O复用之select

    作用: 实现I/O的多路复用 该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生时或经历一段指定的时间后才唤醒它.进程将于select处阻塞,直到被检测的描述符有一个或多个 ...

  7. WINDOWS防火墙开启后Ping不通

    WINDOWS系统由于安全考虑,当开启防火墙时,默认不允许外主机对其进行ping功能,即别的电脑ping不通本机.别的主机ping不通本机是因为本机的防火墙关闭了ICMP回显功能,只要把这回显功能打开 ...

  8. 顺时针打印矩阵(python)

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  9. poj1942(求组合数)

    题目链接:http://poj.org/problem?id=1942 题意:实际上这道题就是求C(n+m,n). 思路:n.m的范围在unsigned中,所以不能递推计算组合数,可以采用公式C(a, ...

  10. TOJ3955: NKU ACM足球赛(并查集+map+细节题)

    时间限制(普通/Java):5000MS/15000MS     内存限制:65536KByte 描述 NKU ACM最近要举行足球赛,作为此次赛事的负责人,Lee要对报名人员进行分队.分队要遵循如下 ...