Azzera filtri
Azzera filtri

How to find a curve of best fit

2 visualizzazioni (ultimi 30 giorni)
Stashu Kozlowski
Stashu Kozlowski il 20 Mar 2021
Commentato: Star Strider il 20 Mar 2021
I have the following set of data.
And from the looks of it it follows something along the lines of a log normal distrabution. But im having trouble fitting a log norm fit to it. How can I fit it? I have attached the data file for referance as well.
Update: I have come to realize that the data is not normalized so you cannot fit a proper log-norm curve to it. So i would first need to find the area under the data.

Risposte (2)

Star Strider
Star Strider il 20 Mar 2021
Using a completely different approach (System Identification Toolbox):
D = readmatrix('RLC1.xls');
t = D(:,1);
s = D(:,2);
Ts = mean(diff(t));
Tsd = std(diff(t));
Fs = 0.25;
[sr,tr] = resample(s,t,Fs);
Fn = Fs/2;
figure
plot(tr, sr)
grid
L = numel(tr);
FTs = fft(s)/L;
Fv = linspace(0, 1, fix(L/2)+1)*Fn;
Iv = 1:numel(Fv);
figure
plot(Fv, imag(FTs(Iv)))
grid
ylim([-1 1]*0.0005)
u = [1; zeros(L-1,1)];
tdd = iddata(sr, u, 1/Fs);
sys = tfest(tdd,3,2)
figure
compare(tdd,sys)
producing this transfer function data:
sys =
From input "u1" to output "y1":
0.007132 s^2 + 0.0004604 s + 1.881e-06
-------------------------------------------
s^3 + 0.01617 s^2 + 9.041e-05 s + 7.589e-08
Continuous-time identified transfer function.
Parameterization:
Number of poles: 3 Number of zeros: 2
Number of free coefficients: 6
Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties.
Status:
Estimated using TFEST on time domain data "tdd".
Fit to estimation data: 95.47%
FPE: 4.55e-06, MSE: 4.304e-06
and this compare plot:
.
  4 Commenti
Stashu Kozlowski
Stashu Kozlowski il 20 Mar 2021
Modificato: Stashu Kozlowski il 20 Mar 2021
You are right that this is not really a lognormal probability distrabution. I was hoping I could normalize the data set and then applying a lognormal. This is usefull as it would allow me to obtain the mean, median, and mode rather easily.
Star Strider
Star Strider il 20 Mar 2021
If you want to fit it using the ‘lnf’ function, you would likely need to add a third ‘scaling’ parameter so that it would fit the curve:
lnf = @(p,x) p(3).*exp(-(log(x)-p(1)).^2./(2*p(2).^2)) ./ (x.*p(2)*sqrt(2*pi));
P = fminsearch(@(p)norm(s-min(s) - lnf(p,t)), rand(3,1));
A parameter set of about [5, 0.5, 75] produces a reasonable fit, so use those instead of the rand call as the initial parameter estimates.

Accedi per commentare.


Walter Roberson
Walter Roberson il 20 Mar 2021
Ratio of two polynomials of degree 2 fits quite well, with approximate coefficients
P = [0.00213762295171613 56.4867705538076 455.003715200478]
Q = [1 -51.094359290793 32989.9993982203]
yfit = polyval(P, x) ./ polyval(Q,x);
This was using cftool, 'rat22' fit.

Categorie

Scopri di più su Linear Model Identification in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by