Lsqcurvefit on function depending on syms

7 vues (au cours des 30 derniers jours)
Gustav
Gustav le 12 Mar 2012
Hi.
I'm using the int command to integrate a huge expression, using syms. The expression is saved in a variable "funk". In funk is a constant that I need to determine by fitting "funk" to my experimental data. For this I have tried to use lsqcurvefit, but I can't get this to work by simple putting "funk" in the expression where the function is suppose to be written. This is how it looks:
funk=huge expression with syms x
xdata=..
ydata=..
lsqcurvefit(@(x,xdata) funk, [some value] ,xdata,ydata)
How can I do this? Please help!

Réponse acceptée

Seth DeLand
Seth DeLand le 12 Mar 2012
Hi Gustav,
You'll first need to use the matlabFunction command to convert the symbolic equation into a MATLAB function handle or file: http://www.mathworks.com/help/toolbox/symbolic/matlabfunction.html
There's an example here that should help: (see Figure 2) http://www.mathworks.com/tagteam/62669_91801v00_SymbolicGradient_Hessian_final.pdf

Plus de réponses (2)

Gustav
Gustav le 12 Mar 2012
Ok, thanks!
Still, don't get it work. Heres an example (if I can get this to work it will solve my real problem):
xdata = [2;4;6]; %data
ydata = 3*sin([5;4;6])+6; %data
syms d t
uttryck=d*cos(t);
funk=matlabFunction(uttryck);
t=xdata;
d = lsqcurvefit(@(d,t) funk,7,t,ydata)
But I get the error message "Function value and YDATA sizes are incommensurate."
Simply, I'm trying to optimize d to fit the experimental data. Whats wrong?
  1 commentaire
Seth DeLand
Seth DeLand le 13 Mar 2012
Because funk is already a function handle (that's what matlabFunction created), you don't need to use the @(d,t) syntax when passing it to lsqcurvefit. You can just pass funk:
d = lsqcurvefit(funk,7,t,ydata)

Connectez-vous pour commenter.


Gustav
Gustav le 16 Mar 2012
Nice! Works perfectly! Thank you so much!

Community Treasure Hunt

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

Start Hunting!

Translated by