matlab曲线拟合⽅法和函数拐点查拟合曲线
曲线拟合函数
a=polyfit(X,F,7);%曲线拟合
输⼊:X 为所有离散点的横坐标的取值
F 为所有离散点的纵坐标的取值
7 为多项式拟合的最⾼次数(根据⾃⼰需要选择);
matlab求导输出:a 为拟合曲线后⾃变量的系数
拟合出多项式后,需要配合使⽤ 来求出对应因变量的值
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');
效果图:
查函数拐点
⾸先,得明确拐点是啥,数学中定义的拐点是函数凹凸性改变的点;
数学求解原理:
(1)求函数 f(x) 的⼆阶导
(2)⼆阶导存在且导数为0同时三阶导不为0的点为函数拐点;⼆阶导不存在的点,其左右边⼆阶导异号的点也为拐点;
matlab ⽅法:
差分和近似导数
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');
查效果: