Matlab自带的曲线拟合程序

这个函数的功能是能自动搜索参数的取值,从而使得方程的误差最小。

效果如下

代码如下

%% Optimal Fit of a Non-linear Function
% This is a demonstration of the optimal fitting of a non-linear function to a
% set of data.  It uses FMINSEARCH, an implementation of the Nelder-Mead simplex
% (direct search) algorithm, to minimize a nonlinear function of several
% variables.
%
% Copyright 1984-2002 The MathWorks, Inc.
% $Revision: 5.15 $ $Date: 2002/04/02 17:52:33 $

%%
% First, create some sample data and plot it.

% t = (0:.1:2)‘;
% y = [5.8955 3.5639 2.5173 1.9790 1.8990 1.3938 1.1359 1.0096 1.0343 ...
%      0.8435 0.6856 0.6100 0.5392 0.3946 0.3903 0.5474 0.3459 0.1370 ...
%      0.2211 0.1704 0.2636]‘;

function [coeff,estimated_lambda] = fitdemo(XData, YData)

if nargin<1,
    XData = (0:.1:2)‘;
    YData = [5.8955 3.5639 2.5173 1.9790 1.8990 1.3938 1.1359 1.0096 1.0343 ...
        0.8435 0.6856 0.6100 0.5392 0.3946 0.3903 0.5474 0.3459 0.1370 ...
        0.2211 0.1704 0.2636]‘;
    clc;
end

if ( size(XData) ~= size(YData) )
    error(‘The two input matrices have to be of the same sizes‘);
end

plot(XData,YData,‘ro‘); hold on; h = plot(XData,YData,‘b‘); hold off;
title(‘Input data‘);

if ( size(XData, 1) == 1 )
    t = XData‘;
    y = YData‘;
elseif(size(XData, 2) == 1)
    t = XData;
    y = YData;
end

%%
% The goal is to fit the following function with two linear parameters and two
% nonlinear parameters to the data:
%
%     y =  C(1)*exp(-lambda(1)*t) + C(2)*exp(-lambda(2)*t)
%
% To fit this function, we‘ve create a function FITFUN.  Given the nonlinear
% parameter (lambda) and the data (t and y), FITFUN calculates the error in the
% fit for this equation and updates the line (h).

% type fitfun

%%
% Make a guess for initial estimate of lambda (start) and invoke FMINSEARCH.  It
% minimizes the error returned from FITFUN by adjusting lambda.  It returns the
% final value of lambda.

start = [1;0];
options = optimset(‘TolX‘,0.1);
estimated_lambda = fminsearch(‘fitfun‘,start,options,t,y,h);
%estimated_lambda = [estimated_lambda guidata(gcf)];
coeff = guidata(h); % C1,C2
‘estimated_lambda = estimated_lambda‘;
‘coeff = coeff‘;

要拟合的函数为

function err = fitfun(lambda,t,y,handle)
%FITFUN Used by FITDEMO.
%   FITFUN(lambda,t,y,handle) returns the error between the data and the values
%   computed by the current function of lambda.
%
%   FITFUN assumes a function of the form
%
%     y =  c(1)*exp(-lambda(1)*t) + ... + c(n)*exp(-lambda(n)*t)
%
%   with n linear parameters and n nonlinear parameters.

%   Copyright 1984-2002 The MathWorks, Inc.
%   $Revision: 5.8 $  $Date: 2002/04/08 20:04:42 $

A = zeros(length(t),length(lambda));
for j = 1:length(lambda)
   A(:,j) = exp(-lambda(j)*t);
end
c = A\y;
z = A*c;
err = norm(z-y);

set(gcf,‘DoubleBuffer‘,‘on‘);
set(handle,‘ydata‘,z)
guidata(handle, c);
drawnow
pause(.04)

因为这种拟合方法用的比较少,所以特此总结出来,希望后来对自己的道路段的拟合会有用处!

2016-1-23 1059

时间: 2024-11-08 19:16:23

Matlab自带的曲线拟合程序的相关文章

MATLAB实例:非线性曲线拟合

MATLAB实例:非线性曲线拟合 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 用最小二乘法拟合非线性曲线,给出两种方法:(1)指定非线性函数,(2)用傅里叶函数拟合曲线 1. MATLAB程序 clear clc xdata=[0.1732;0.1775;0.1819;0.1862;0.1905;0.1949;0.1992;0.2035;0.2079;0.2122;0.2165;0.2208;0.2252;0.2295;0.2338;0.238

利用C#自带组件强壮程序日志

前言 在项目正式上线后,如果出现错误.异常.崩溃等情况, 我们往往第一想到的事就是查看日志. 所以日志对于一个系统的维护是非常重要的. 声明 本文中的示例代码旨在这个框架是怎么工作的,具体实现可以自由发挥. 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的log项目, 另一方面 一些log组件需要实例化后才可以使

DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版原创发布-带官方示例程序版

关于 DotNetBar for Windows Forms 12.7.0.10_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版---------------------------------------------------------基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成.安装之后,直接就可以用了.省心省事.不必再单独的打一次补丁包了.本安装包和补丁包一样都删除了官方自

DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版原创发布-带官方示例程序版

关于 DotNetBar for Windows Forms 12.5.0.2_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版--------------------------------------------------------- 基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成. 安装之后,直接就可以用了. 省心省事.不必再单独的打一次补丁包了. 本安装包和补丁包一样都删除了

DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版原创发布-带官方示例程序版

关于 DotNetBar for Windows Forms 12.2.0.7_冰河之刃重打包版 --------------------11.8.0.8_冰河之刃重打包版---------------------------------------------------------基于 官方原版的安装包 + http://www.cnblogs.com/tracky 提供的补丁DLL制作而成.安装之后,直接就可以用了.省心省事.不必再单独的打一次补丁包了.本安装包和补丁包一样都删除了官方自带

matlab借助vs调试C程序【转】

FROM:matlab借助vs调试C程序 http://blog.csdn.net/ayw_hehe/article/details/6790147 有些时候调用matlab的工程时,为了更方便的理解代码,就stepbystep得跟进程序里面去,但是碰到里面调用的c的库就跟不进去了,有很多文章都告诉我们怎么去写matlab能调用的mexfunction,但是鲜有文章告诉我们怎么像调试自己的c程序一样调试它们. 这里描述一下怎么简单得调试它们: 先在matlab中设置C编译器,用mex -setu

[转]利用C#自带组件强壮程序日志

利用C#自带组件强壮程序日志 在项目正式上线后,如果出现错误,异常,崩溃等情况 我们往往第一想到的事就是查看日志 所以日志对于一个系统的维护是非常重要的 声明 正文中的代码只是一个栗子,一个非常简单的栗子,只是说明这个框架是怎么工作的 具体实现可以自由发挥~~~~ 贯穿所有的日志系统 日志系统,往往是贯穿一个程序的所有代码的; 试想一下,如果你的日志完全是由第三方组件提供的; 那么就意味着,你的所有项目都必须引用这个dll; 也许你会说自己可以2次封装,那么依然需要所有项目都引用你的这个封装后的

如何用OpenCV自带的adaboost程序训练并检测目标

http://www.cnblogs.com/easymind223/archive/2012/07/03/2574826.html OpenCV自带的adaboost程序能够根据用户输入的正样本集与负样本集训练分类器,常用于人脸检测,行人检测等.它的默认特征采用了Haar,不支持其它特征. Adaboost的原理简述:(原文) 每个Haar特征对应看一个弱分类器,但并不是任伺一个Haar特征都能较好的描述人脸灰度分布的某一特点,如何从大量的Haar特征中挑选出最优的Haar特征并制作成分类器用

002带图标的程序菜单

技术要点: 要实现带图标的菜单,需要从CMenu类派生一个子类,并在子类中改写DrawItem方法和MeasureItem方法.基本思路如下: 首先,定义一个记录菜单项信息的结构CMenuItemInfo,该结构包含了菜单项的文本.图像索引.ID等信息. 然后,从CMenu中派生一个子类CIconMenu.在该类中定义一个方法ChangeMenuItem,利用递归的方式修改所有的菜单项信息,使其具有自绘风格(MF_OWNERDRAW). 接着,在CIconMenu类中定义绘制菜单项文本.绘制菜单