The function is an improved version of the function LMFnlsq widely tested on the nonlinear regression, curve fitting and identification problems. Better description is in the complementing file LMFnlsq2test.pdf.
Warning: The option 'Display' is changed for better control of intermediate results output. See help LMFnlsq2.
You may solve your problem as 3 independent examples, because there is no coupling among the equations. In that case, you build a body of your function FUN for residuals in the form
res = fi(x,c) - yi;
where yi is the value of required fi.
Of course, you may to solve your problem also in one go, if you prepare the body of function FUN in the following way:
res = [f1(x,c(1:2)) - y1
f2(x,c(3:4)) - y2
f3(x,c(5:6)) - y3];
This approach seems to be better, because you do not need to prepare 3 functions FUN.
If you have any issue with you problem, don't hesitate to contact me again or send me just data of your problem.
Dear Pro. Balda,
Does this file work with curve-fitting problems with several objective functions?
We obtain a set of experimental data: x(may be a vector),f1, f2, f3(f1, f2, f3 are scalars). We want to fit the following three euqations:
How should I implement the algorithm with LMFnlsq2?
The answer is trivial:
Let you have one set of 12 values of lefthand side, say in the column vector hmnp. Make a function for evaluation of differences (residuals) between righthand sides and lefthand sides, say resid.m in the form
function r = resid(x)
r = [x(1)+x(2)*p+ ... +(x(11)+x(12)*p)*n] - hmnp;
Here x(1) up to x(6) correspond C1 to C6 and x(7) up to x(12) correspon D1 up to D6. The simplest call of the function to solve the problem could be
[x,ssq,cnt] = LMFnlsq2('resid',x0);
A better way would be
[x,ssq,cnt] = LMFnlsq2('resid',x0,'Display',-50);
Of course that you have to supply a good estimate of the solution - coefficients C1, ..., D6. It is very important that you are able to do it, say from a nature of your experiment. The elements of x0 must not be zeros!
Since THe solution of your task has as many unknowns as equations, there is no
any degree of freedom. In consequence of it the solution should yield ssq->0.
Hi, Balda. Good day.
My curve fitting prblem is to calibrate the model like this:
The parameters to be estimate are C1,C2,C3,C4,C5,C6,D1,D2,D3,D4,D5,D6. And we have obtained 12 sets of data of h(m,n,p). So how to write the L-M expression using the LMFnlsq2.m ?
Yes, LMFnlsq2 is able to solve both real and complex problems, however, the complex task should be split into real and imagimary parts in the function for evaluating residuals. Thus, the dimension of the residual vector is double the number of equations, provided there are no additional conditions. The column vector of residuals should be real.
Build M-function, say resid.m, for evaluation of problem residuals:
function res = resid(p)
global t Y Wp % Wp = penalty weight
% If you wish to work with the native names of variables (not with the elements of the sought parameters p(i), use the following command:
[A,B,C1,C2,m,w,Tc] = deal2('_elm_',p); % deal2 is the function from the File Exchange
Tct = Tc - t;
lTt = log(Tct);
res = [A + B*Tct.^m + C1*cos(w*lTt) + C2*sin(w*lTt) - Y
The user should choose propper weight(s) of penalties expressing constraints put on parameters.
Thanks for your reply. My curve fitting prblem is to calibrate the model like this:
The parameters to be estimate is A,B,C1,C2,m,w,Tc,
and the Constraints is:
B<0, |C1|<1, |C2|<1, Tc>max(t(i)), 0.1<m<0.9, 6<w<13， So how to write the L-M expression using the LMFnlsq2.m ?
Yes, you may make curve-fitting with constraints, if you introduce convenient penalty functions, which generate additional elements in the vector of residuals. It has been used in the solution of the Problem 3, Constrained Rosenbrock valey, described in the file LMFnlsq2test.m.
[A,v] = getAv(FUN,JAC,x,r,bdx);
SS = r'*r;
15 Apr 2013
Display of intermediate results has been improved to fulfill better users' requirements.
Thanks Jose's detailed study of the code, small bugs were repaired and the code made more clear.
16 Apr 2013
Repaired several bugs found by Jose. Improved description of the function and of the demo program LMFnlsq2test.
22 Apr 2013
The new version of the function is a slight modification of the recent update. One statement, dated 2012-12-01, has been commented out because of its erroneous function under certain circumstances. The function is now fast and much more stable.
23 Apr 2013
Improved the printout of results. The previous versions did not display the final solution if the iteration count were not integer multiple of required step of printing.