Fitting data in x,y to a known function

8 vues (au cours des 30 derniers jours)
Raúl Alonso Merino
Raúl Alonso Merino le 12 Déc 2019
Commenté : Star Strider le 13 Déc 2019
Hi everyone. I have a function that is f = 1/(a+b*x) where a and b are the values to obtain and I have some data:
x1 = linspace(1,32,32);
y1 = [0.01 0.02 0.02 0.02 0.02 0.02 0.03 0.03 0.03 0.04 0.04 0.05 0.05 0.06 0.07 0.07 0.08 0.10 0.11 0.14 0.14 0.17 0.17 0.16 0.21 0.31 0.31 2.43 2.43 29.53 29.53 29.53];
I need to fit these two variables x1 and y1 into the function above to obtain a and b. How can I do this?
I'm sorry I'm pretty new in Matlab. Thank you.

Réponse acceptée

Star Strider
Star Strider le 12 Déc 2019
Use the fminsearch function to fit your data:
x1 = linspace(1,32,32);
y1 = [0.01 0.02 0.02 0.02 0.02 0.02 0.03 0.03 0.03 0.04 0.04 0.05 0.05 0.06 0.07 0.07 0.08 0.10 0.11 0.14 0.14 0.17 0.17 0.16 0.21 0.31 0.31 2.43 2.43 29.53 29.53 29.53];
f = @(p,x) 1./(p(1) + p(2).*x);
P = fminsearch(@(p) norm(y1 - f(p,x1)), rand(2,1));
x1v = linspace(min(x1), max(x1));
figure
plot(x1, y1, 'p')
hold on
plot(x1v, f(P,x1v), '-r')
hold off
grid
producing:
P =
0.845464263829100
-0.025490734971736
where ‘P(1)=a’, and ‘P(2)=b’.
The plot appears correct, even though it looks a bit strange.
  2 commentaires
Raúl Alonso Merino
Raúl Alonso Merino le 13 Déc 2019
Thank you so much. It worked as I wanted!
Star Strider
Star Strider le 13 Déc 2019
As always, my pleasure!

Connectez-vous pour commenter.

Plus de réponses (1)

Nicolas B.
Nicolas B. le 12 Déc 2019
If you have it, I would recommend to use the Curve Fitting Toolbox. You can give it the expected function and it fits the parameters.
Otherwise, the only solution would be to yourself try to fit the function on the samples based on an optimization method but that requires to investigate mathematic fitting.
  1 commentaire
Raúl Alonso Merino
Raúl Alonso Merino le 12 Déc 2019
I tried and I get a fitted curve, thank you.
General model:
myfit(x) = 1/(a+b*x)
Coefficients (with 95% confidence bounds):
a = 0.9058 (0.4335, 1.378)
b = -0.02738 (-0.04219, -0.01256)
My question now is: is it correct to fit it directly to that function or do I have to fit it to the integral of 1/(a+b*x) which is log(a+b*x)/b + c?

Connectez-vous pour commenter.

Catégories

En savoir plus sur Get Started with Curve Fitting Toolbox dans Help Center et File Exchange

Produits


Version

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by