matlab曲线拟合方法和函数拐点查找

拟合曲线

polyfit 曲线拟合函数

a=polyfit(X,F,7);    %曲线拟合  

输入:X 为所有离散点的横坐标的取值
F 为所有离散点的纵坐标的取值
7 为多项式拟合的最高次数(根据自己需要选择);
输出:a 为拟合曲线后自变量的系数

拟合出多项式后,需要配合使用 polyval 来求出对应因变量的值

Y=polyval(a,X);     %根据拟合的函数得出x对应的因变量的值

输入:a 为拟合出的多项式的系数
X为所有离散点的横坐标的取值;
输出:Y 为根据多项式求解出对应自变量的因变量的值

clear,clc;
I=imread('./ImageLib/DT1.png');

I=im2double(I);  %归一化
[h,w,L]=size(I);  %计算图像的大小
I1=0.299*I(:,:,1)+0.587*I(:,:,2)+0.114*I(:,:,3); %计算灰度图,用加权平均法

%计算每行的灰度平均值,针对整个图像而言
X=1:1:h;
F_all=sum((I1'))/w;
plot(X,F_all,'o'); %画出平均值曲线图

hold on;
[a,~,mu]=polyfit(X,F_all,13);    %曲线拟合 自变量的系数
Y=polyval(a,X,[],mu);     %根据拟合的函数得出x对应的因变量的值
plot(X,Y,'g');

效果图:matlab曲线拟合方法和函数拐点查找_第1张图片

查找函数拐点

首先,得明确拐点是啥,数学中定义的拐点是函数凹凸性改变的点;
数学求解原理
(1)求函数 f(x) 的二阶导
(2)二阶导存在且导数为0同时三阶导不为0的点为函数拐点;二阶导不存在的点,其左右边二阶导异号的点也为拐点;

matlab 方法:
diff 差分和近似导数

de2=diff(Y,2);       %拟合曲线的二阶导

输入:Y 待求导函数(matlab中就是一数组,因变量数组)
2 求导阶数(根据需要填写)
输出: de2 对应个点的导数值
ps:diff只是近似求导,实际是求的各点的差分值
如:
一阶导:
de1(1)=Y(2)-Y(1)
de1(2)=Y(3)-Y(2)

de1(i)=Y(i+1)-Y(i)

de1(n-1)=Y(n)-Y(n-1)
二阶导:
de2(1)=de1(2)-de1(1)
de2(2)=de1(3)-de1(2)

de2(i)=de1(i+1)-de1(i)

de2(n-1)=de1(n)-de1(n-1)

%%Y是上例中拟合的曲线,看客自己操作时切记要两段代码合在一起跑
de2=diff(Y,2);       %拟合曲线的二阶导
de3=diff(Y,3);       %拟合曲线的三阶导
rowX=linspace(0,0,h);
for row1=h-3:-1:2
    if (de2(row1)==0 && de3(row1)~=0)||  (de2(row1)*de2(row1+1)<0)
       rowX(row1)=1;
    end
end
plot(X(find(rowX)),Y(find(rowX)),'ob');

查找效果:
matlab曲线拟合方法和函数拐点查找_第2张图片

你可能感兴趣的:(matlab)