How to fit a particular analytical function while optimising its parameters to a histogram for different data sets in a loop in Matlab?

3 Ansichten (letzte 30 Tage)
Hi,
I am trying to fit a particular analytical function to histogram of a dataset. The parameters of the function is being optimised using lsqcurvefit command of Matlab. When I am trying for a single data set, its giving right curve. But when I am trying to put it in a loop to fit several datasets such that each time it will take one dataset and fit the function with optimized parameters to its histogram and then go to the next dataset and do the same job, it is giving wrong curve.
I am suspecting that somehow it is taking garbage values while plotting the function.
please help me out with this. I am attaching input 3 datasets .
thank you.
d=dir('latlong*.csv');
n=length(d);
data=cell(n,1);
for i = 0:2
for j=0:0
data{j*70 + i+1}=csvread(d(j*70 + i+1).name,1,0,[1,3,8830,3]);
a = data{j*70 + i+1};
b(:,1) = a(:,2);
k3=0;
for l=1:8831
if b(l,1)>=0.001
k3=k3+1;
end
end
z=zeros(k3,1);
k3=0;
for l=1:8831
if b(l,1)>=0.001
k3=k3+1;
z(k3,1)=b(l,1);
end
end
figure(i+1);
hold on
h=histogram(z,1000,'Normalization','pdf');
no=h.NumBins;
counts=zeros(no,1);
counts(:,1)=h.Values;
edge=zeros(no+1,1);
edge(:,1)=h.BinEdges;
edge=edge(2:end,1);
Fun3=@(q,edge) ((1./(edge.*q(2).*sqrt(2*pi))).*exp(-((log(edge)-q(1)).^2)./(2*q(2)^2)));
q0=[2,2];
q(i+1,:) = lsqcurvefit(Fun3,q0,edge,counts);
plot(edge,Fun3(q,edge));
hold off
xlabel('Observation')
ylabel('Probability Density')
legend('histogram','log')
end
end

Antworten (1)

Brian
Brian am 18 Nov. 2022
Hello Joya,
I refactored your code to get a better idea of what it was doing, and there seem to be two issues. The main issue is that on line 39 you call "Fun3" with "q" instead of "q(i+1,:)". The second issue is that "csvread" is prepending a zero to your data. The "csvread" function is not recommended and it is recommended to use "readmatrix" or "readtable" instead.
d=dir('latlong*.csv');
n=length(d);
data=cell(n,1);
q=zeros(n,2);
for i = 1:n
data{i}=readtable(d(i).name);
z=data{i}.precipitation(data{i}.precipitation >= 0.001);
figure(i);
hold on
h=histogram(z,1000,'Normalization','pdf');
no=h.NumBins;
counts=h.Values';
edge=h.BinEdges(2:end)';
Fun3=@(q,edge) ((1./(edge.*q(2).*sqrt(2*pi))).*exp(-((log(edge)-q(1)).^2)./(2*q(2)^2)));
q0=[2,2];
q(i,:)=lsqcurvefit(Fun3,q0,edge,counts);
plot(edge,Fun3(q(i,:),edge));
hold off
xlabel('Observation')
ylabel('Probability Density')
legend('histogram','log')
end
Hope this helps, let me know if I misunderstood anything.
  1 Kommentar
JOYA GHOSH DASTIDER
JOYA GHOSH DASTIDER am 23 Nov. 2022
Thank you for your reply and really sorry for being late in acknowledging .
I also figured out the problem of not using "q(i+1,:)".
Thanks again for suggesting a compact form and use of "readtable" instead of "csvread".

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Get Started with Curve Fitting Toolbox finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by