Lsqcurvefit on function depending on syms

7 Ansichten (letzte 30 Tage)
Gustav
Gustav am 12 Mär. 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!

Akzeptierte Antwort

Seth DeLand
Seth DeLand am 12 Mär. 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

Weitere Antworten (2)

Gustav
Gustav am 12 Mär. 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 Kommentar
Seth DeLand
Seth DeLand am 13 Mär. 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)

Melden Sie sich an, um zu kommentieren.


Gustav
Gustav am 16 Mär. 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