MATLAB Answers


fitting a parabola giving unreasonable answer

I'm trying to fit a parabola to 4 data points using the following equation:
y = a.*exp(((-4.*pi.*b.*6.022e23)./(8.314.*1623)).*(((c./2.*(c-x).^2) - (1/3.*(c-x).^3))));
I'm getting an unreasonable result, which looks like this:
I think the equation is correct because I copy and pasted it from a function that employs it to create this graph, which models the same points:


I used the curve fitting tool, but here's a little script that does the same thing:
D = [0.027322404;1.798850575;1.33;0.11];
e = [0.003670419;0.000531607;0.0500;0.18];
r = [0.89;1.12;1.26;1.42].*1e-10;
b = [2;-1.15e21;1.2e-10];
modelfun = @(b, r) b(1).*exp(b(2)./(((b(3)./2.*(b(3)-r).^2) - (1/3.*(b(3)-r).^3))));
opts = statset('nlinfit');
opts.RobustWgtFun = 'bisquare';
lsp = nlinfit(r, D, modelfun,b, opts);
and my R-square is -0.09018.
The 4 data points:
r = [0.89;1.12;1.26;1.42].*1e-10;
D = [0.027322404;1.798850575;1.33;0.11];
r is x and D is y.
But your model is not a parabola. It is a nasty to compute exponential thing. (Nasty in double precision arithmetic.)
Seems confusing. I'd suggest your problem is the huge dynamic range of the parameters. That gets the solver in trouble.
b = [2;-1.15e21;1.2e-10];

Sign in to comment.




1 Answer

Answer by Clay Swackhamer on 12 Apr 2019
 Accepted Answer

Two things: I changed your independent values (r) to something that is not so small. Second, I made your equation more simple. I tried it with your original values but it didn't work for me. Hopefully this gets you off to a good start.
r = [0.89;1.12;1.26;1.42];
D = [0.027322404;1.798850575;1.33;0.11];
%Set up the fit
ft = fittype('a*r^2+b*r+c', 'independent', 'r');
opts = fitoptions('Method', 'NonlinearLeastSquares');
opts.Display = 'Off';
opts.StartPoint = [0.2, 0.2, 0.3];
%Conduct the fit
[fitresult, gof] = fit(r, D, ft, opts);
%Evaluate the function for plotting
a = fitresult.a;
b = fitresult.b;
c = fitresult.c;
r_model = linspace(min(r), max(r), 100); %create 100 points to evaluate the model on
D_model = a*r_model.^2+b*r_model+c;
%Make plots
plot(r, D, 'bo', 'markerSize', 6) %plot the data
hold on
plot(r_model, D_model, 'LineWidth', 2, 'Color', 'r') %plot the model
leg = legend('Data', 'Model');
leg.FontSize = 14;
model and data.png


Hey thanks for this. I suppose it's not critical that I fit my particular equation to the data, but rather that I get a fit from which I can extract the necessary parameters (like the coordinates of the parabola vertex). Thanks!
No problem. If this was helpful would you mind accepting the answer? Thanks

Sign in to comment.