fitting a parabola giving unreasonable answer

조회 수: 7 (최근 30일)
Michael Phillips
Michael Phillips 2019년 4월 11일
댓글: Michael Phillips 2019년 4월 12일
Hello,
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:
fit_to_sun1.svg
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:
lattice_strain_model_divalent.svg
  댓글 수: 5
Michael Phillips
Michael Phillips 2019년 4월 11일
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.
John D'Errico
John D'Errico 2019년 4월 12일
편집: John D'Errico 2019년 4월 12일
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];

댓글을 달려면 로그인하십시오.

채택된 답변

Clay Swackhamer
Clay Swackhamer 2019년 4월 12일
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.
%Data
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
  댓글 수: 3
Clay Swackhamer
Clay Swackhamer 2019년 4월 12일
No problem. If this was helpful would you mind accepting the answer? Thanks
Michael Phillips
Michael Phillips 2019년 4월 12일
yep no problem!

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with Curve Fitting Toolbox에 대해 자세히 알아보기

제품


릴리스

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by