Combining fsolve and lsqcurvefit
Show older comments
Good evening,
I have a collection of experimental data (xi, yi) called (texp, rexp). I know that 'texp' must be derived from 'rexp' following:
t(i)=k(1)*integral(@(x) exp(-k(2)./(x.*log(x))), 1, r(i))
, being k(1) and k(2) parameters. So 'r(i)' is the upper integration limit. I need to find the values of k(1) and k(2) that best fits my model. My strategy is solving the equations 't(i)-texp=0' in 'r' with fsolve and fitting k(1) and k(2) with lsqcurvefit. I am trying this:
rteor=@(k,r) fsolve(@(r) arrayfun(@(T) k(1).*integral(@(x) exp(-k(2)./(x.*log(x))), 1, r)-T, texp), 1.0001);
x0=[2,6.12750];
k = lsqcurvefit(rteor, x0, texp, rexp)
which results on the following errors:
Error using lsqcurvefit (line 251)
Function value and YDATA sizes are not equal.
Thank you for your help!
6 Comments
Sergio Quesada
on 6 Jun 2018
Edited: Sergio Quesada
on 6 Jun 2018
Walter Roberson
on 6 Jun 2018
lsqcurvefit is fussy about rows vs columns. Make sure you data is all columns, including the texp that you have in defining rteor
Sergio Quesada
on 6 Jun 2018
Walter Roberson
on 6 Jun 2018
You can get rid of the warning by passing an options structure to fsolve to tell it to use Levenberg-Marquardt
However, that suggests that multiple equations are attempted to be solved simultaneously, which is likely an error at some point.
Hmmm... notice that lsqcurvefit is going to be passing vectors to the function, so you need to expect that r will be a vector. When I answered you in https://www.mathworks.com/matlabcentral/answers/403892-fitting-data-to-integral-function#comment_574988 I was careful to use different variable names, R vs r, to make it clear whether one was receiving a vector or scalar at that point.
Sergio Quesada
on 7 Jun 2018
Edited: Sergio Quesada
on 7 Jun 2018
Answers (0)
Categories
Find more on Solver Outputs and Iterative Display in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!