matlab函数拟合

1 函数拟合

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

1.1多项式拟合

对于
gif.latex?y=a_1%5Ccdot%20x%20%2B%20a_2%5Ccdot%20x%5E2%20%2B%20...%20%2B%20a_n%5Ccdot%20x%5En
形式的拟合函数,其中
gif.latex?a_1...a_n
为待定系数。我们可以使用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界面
如下所示:
GUI拟合界面

1.2已知函数类型的拟合

我们在数据分析的时候经常遇到这种情况:知道了函数的隶属函数和隶属函数上的一些点,求隶属函数的待定系数。由于隶属函数基本都不是多项式的形式,于是我们就不能使用ployfit函数了。这里我以拟合偏大型柯西分布隶属函数和对数隶属函数为例,介绍fitnlinfit在已知函数类型时的拟合应用。
关于函数的具体用法我这里就不介绍了,大家可以在matlab中doc一下帮助文件,也可以上网查询相关介绍。如果着急使用又不想了解原理的话可以直接修改下面程序中需要拟合的数据和函数类型即可。
假设需要拟合的偏大型柯西分布隶属函数和对数函数组合的分段函数如下所示:
gif.latex?x=%20%5C%7B%20%7B%5B%5C%201%2B%5Calpha(x-%20%5Cbeta)%5E%7B-2%7D%20%5D%5C%20%5E%7B-1%7D,1%5Cleq%20x%5Cleq3%5Catop%20alnx%2Bb,2%5Cleq%20x%5Cleq5%7D
其中待定系数
gif.latex?%5Calpha,%5Cbeta,a,b
同时给出已知数据点
gif.latex?f(5)=1,f(3)=0.8,f(1)=0.01
分别采用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:关于函数形式未知的函数拟合,我好久都没用到过了也懒得总结。或许以后再用到时会将这一部分内容补上吧!或许吧~~其实如果我们不知道函数的形式,使用插值往往更好一些。因为函数的拟合往往都需要运气,并不一定能成功。而插值基本都会成功了。

转载于:https://www.cnblogs.com/yabin/p/6417566.html

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果二元函数的表达式未知,可以使用MATLAB中的神经网络工具箱(Neural Network Toolbox)来进行拟合。以下是一个简单的示例: 假设我们有一组二元数据(x,y)和对应的输出z,我们想要使用神经网络来拟合这些数据,可以按照以下步骤进行: 1. 准备数据:将输入数据和输出数据转换为神经网络所需的格式。可以使用MATLAB中的meshgrid函数生成一组坐标网格,然后计算每个坐标点的z值作为输出数据。代码如下: ```matlab x = -2:0.2:2; y = -2:0.2:2; [X,Y] = meshgrid(x,y); Z = X.*exp(-X.^2-Y.^2); ``` 2. 创建神经网络:可以使用MATLAB中的feedforwardnet函数创建一个前馈神经网络。代码如下: ```matlab net = feedforwardnet(10); ``` 其中,10表示网络的隐藏层包含10个神经元。 3. 训练神经网络:可以使用MATLAB中的train函数对神经网络进行训练。代码如下: ```matlab [x, y] = meshgrid(-2:0.2:2); z = x.*exp(-x.^2-y.^2); net = feedforwardnet(10); net = train(net, [x(:)'; y(:)'], z(:)'); ``` 4. 使用神经网络进行预测:可以使用MATLAB中的sim函数对新的输入数据进行预测。代码如下: ```matlab [xq, yq] = meshgrid(-2:0.1:2, -2:0.1:2); zq = sim(net, [xq(:)'; yq(:)']); ``` 5. 绘制拟合结果:可以使用MATLAB中的surf函数将原始数据和预测结果绘制在同一个图形中,以便进行比较。代码如下: ```matlab zq = reshape(zq, size(xq)); surf(x,y,z); hold on; surf(xq,yq,zq); ``` 通过调整神经网络的结构和训练参数,可以使拟合结果更加精确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值