workaround for handling a large number of variables in the objective function of lsqnonlin

조회 수: 1 (최근 30일)
I want to optimize my objective function
w0=zeros(m,1)
[w,resnorm] = lsqnonlin(@myfun,w0)
How can I dynamically define weights w(1) w(2) w(3) in my function to adapt any possible change in number of variables (m) as follow
function F = myfun(w)
global X % regression matrix of (nxm)
global Y % output vector (nx1)
F = Y - ( w(1)*X(:,1) + w(2)*X(:,2) + w(3)*X(:,3) + .. + w(m)*X(:,m) );
end

채택된 답변

Stephen23
Stephen23 2020년 5월 12일
편집: Stephen23 2020년 5월 12일
>> X = rand(7,3);
>> w = rand(3,1);
>> w(1)*X(:,1) + w(2)*X(:,2) + w(3)*X(:,3) % what you do now
ans =
0.63892
0.43089
0.59637
0.89806
1.08999
0.98472
0.38443
>> X*w(:) % what you should do: matrix multiply
ans =
0.63892
0.43089
0.59637
0.89806
1.08999
0.98472
0.38443
  댓글 수: 3
Stephen23
Stephen23 2020년 5월 12일
편집: Stephen23 2020년 5월 12일
"I ask about defining the objective function (myfun) interms of large number of variables (w)"
And that is what I gave you. Matrix multiplcation neatly solves your problem of how to "...dynamically define weights w(1) w(2) w(3) in my function to adapt any possible change in number of variables (m)". You gave this verbose code
w(1)*X(:,1) + w(2)*X(:,2) + w(3)*X(:,3) + .. + w(m)*X(:,m)
which I simply replaced with one matrix multply
X*w(:)
giving exactly the same output as your code, and yet it also works for any m (thus answering your question). So far you have not actually stated why it would not work, nor given any counter-example. If it did not work as expected please show your exact input data and the expected output.
function F = myfun(w)
global X % regression matrix of (nxm)
global Y % output vector (nx1)
F = Y - X*w(:);
end
Note that the global variables should be replaced by function parameterization:

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Get Started with Optimization Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by