変動関数フィッティング (球面、指数、ガウス) の分析例 matlab

問題を解決するコード: (研究メモ)

clear; 
clc;
n=20;
h=0.2;
f=@(x)(1+3*exp(-2*x));
x=linspace(0,n*h,n);
%第一问
y0=f(x)%原数据
y=f(x)+0.1*rand(size(x))%加入高斯噪音的数据
Exvariogram=zeros(n-1,1);
%第二问
%for循环产生实验变差函数的数据
for i=1:(n-1)
    id1=1:(n-i);
    id2=(i+1):n;
    Nh=length(id1);
    Exvariogram(i)=sum((y(id2)-y(id1)).^2/(2*Nh));
end
%第三问
%数据拟合
H=h*((1:n-1));
x0=[1,1,1];
lb=zeros(size(x0));
xd=H;
yd=Exvariogram;
Sph=lsqcurvefit(@Sphmodel,x0,xd,yd,lb,[]);
Exp=lsqcurvefit(@Expmodel,x0,xd,yd,lb,[]);
Gauss=lsqcurvefit(@Gaussmodel,x0,xd,yd,lb,[]);
plot(xd,yd,'ko',xd,Sphmodel(Sph,xd),'r',xd,Expmodel(Exp,xd),'g',xd,Gaussmodel(Gauss,xd),'b');
legend('原数据','拟合球状模型','拟合指数模型','拟合高斯模型');
%%
function g=Sphmodel(para,h)
n=length(h);
g=zeros(n,1);
id1=find(h==0);
id3=find(h>para(3));
id2=setdiff(1:n,[id1,id3]);
g(id1)=0;
g(id2)=para(1)+para(2)*(3*h(id2)/(2*para(3))-h(id2).^3/(2*para(3)^3));
g3(id3)=para(1)+para(2);
end
%%
function g=Expmodel(para,h)
n=length(h);
g=zeros(n,1);
id1=find(h==0);
id2=find(h>0);
g(id1)=0;
g(id2)=para(1)+para(2)*(1-exp(-h(id2)/para(3)));
end
%%
function g=Gaussmodel(para,h)
n=length(h);
g=zeros(n,1);
id1=find(h==0);
id2=find(h>0);
g(id1)=0;
g(id2)=para(1)+para(2)*(1-exp(-h(id2).^2/para(3).^2));
end

 

おすすめ

転載: blog.csdn.net/m0_57491181/article/details/125405338