How to combine multiple objective functions for lsqnonlin?

43 vues (au cours des 30 derniers jours)
DavidC le 20 Mai 2016
Commenté : Alan Weiss le 15 Mar 2017
Hello all,
I'm wondering how can I combine multiple objective functions into one so as to use "lsqnonlin" to optimize the 4 unknown parameters existing throughout each of the objective functions.
I'm currently able to optimize the parameters from a single objective function, which is comprised of "model prediction - experimental data", with the below expression:
a = params(1);
b = params(2);
c = params(3);
d = params(4);
[paramsopt,resnorm,residual,exitflag,output] = lsqnonlin(@objfnc1,params_0,lb,ub,options);
But I'd like to combine other objective functions from different experiments under different time/temperature, for instance if there are two more objective functions "objfnc2" and "objfnc3", how can I combine them with "objfunc1" to optimize the 4 known parameters?
Can I directly concatenate the objective functions together like the following? What would be the best way to do it? I think I will be dealing with around 5-10 objective functions
objfnc = [objfnc1; objfnc2; objfnc3];
[paramsopt,resnorm,residual,exitflag,output] = lsqnonlin(@objfnc,params_0,lb,ub,options);
0 commentairesAfficher -2 commentaires plus anciensMasquer -2 commentaires plus anciens

Connectez-vous pour commenter.

Réponses (1)

Abel Babu le 8 Août 2016
Hi David,
One way to go about the question is to define all the objective functions in a MATLAB function that accepts the parameters, the input data and the output data and return the objective functions as a vector. For example :
function [ rssOutput ] = objFunctions( params,X,Y)
a = params(1); % parameter 1
b = params(2); % parameter 2
rss1 = a.*exp(b.*X) - Y; % objective function 1
rss2 = a.*sin(b.*X) - Y; % objective function 2
end
Now, initialize the parameters defined in the above function:
x0 = [1,1]'; % initial value of a and b
Then get the input data ('X') and output data ('Y') and then call the ' lsqnonlin ' in the following manner:
x=lsqnonlin(@objFunctions,x0,[],[],[],X,Y);
I have left lower bound , upper bound and options parameters empty for the sake of simplicity right now, but please have a look at the documentation of lsqnonlin , for details more on the same:
This should optimize the parameters over multiple objective functions.
Regards,
Abel Paul Babu
MathWorks.
2 commentairesAfficher AucuneMasquer Aucune
Carlos Ortega le 15 Mar 2017
Dear Abel,
You gave a very clear and easy-to-follow example. In my opinion the 'lsqnonlin' documentation could benefit a lot by adding this example you shared. Mostly, for user that doesn't have a very strong background in mathematics.
Something I'd like to highlight is taht you are passing variables X and Y to the lsqnonlin function. I also did it and it work, but Matlab documentation doesn't show this possibility (https://nl.mathworks.com/help/optim/ug/lsqnonlin.html#buuhch7-3). When you look at the input arguments it is not possible to add anything after the 'options' field
Thanks again!
Carlos
Alan Weiss le 15 Mar 2017
For the documented, supported ways of passing extra parameters, see Passing Extra Parameters.
Alan Weiss
MATLAB mathematical toolbox documentation

Connectez-vous pour commenter.

Catégories

En savoir plus sur Solver Outputs and Iterative Display dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by