資源簡介
MATLAB程序,梯度投影法解決有約束的優化問題,一維搜索
代碼片段和文件信息
function?[xminf]=minRosen(fAbx0vareps)
%目標函數:?????????????????????f;???
%約束矩陣:?????????????????????A;???
%約束右端向量:?????????????????b;
%初始可行點:??????????????????x0;??
%自變量向量:?????????????????var;???
%精度:???????????????????????eps;
%目標函數取最小值時的自變量值:???x;???
%目標函數的最小值:???????????minf;
%定義輸出參數的格式為long
format?long;
%當輸入參數為3個時,精度要求
if?nargin?==?3;
????eps=1.0e-6;
end
syms?lm;?%這個變量的作用求λ
x0=transpose(x0);%對x0進行裝置,列向量//x0‘
n=length(var);???%n=3
[row]=size(A);??%[53]
%m是取這個系數矩陣的行數
m=row;???????????%m=5
gf=jacobian(fvar);%[?2*x1?+?x2?+?4?x1?+?4*x2?+?2*x3?+?6?2*x2?+?4*x3?+?12]
bConti=1?;
%梯度投影的步驟
while?bConti?%有符號變量來覺得循環的進程
????%定義等式和不等式約束,起作用約束指標集
????k=0;
????s=0;
%?????A1=A;
%?????A2=A;
%?????b1=b;
%?????b2=b;
????for?i=1:m
????????dfun=A(i:)*x0-b(i);
????????%等式約束
????????if?abs(dfun)<0.000000001
????????????k=k+1;
????????????A1(k:)=A(k:);
????????????b1(k1)=b(i);
?????????%不等式約束
????????else
????????????s=s+1;
????????????A2(s:)=A(i:);
????????????b2(s1)=b(i);
????????end
????end
%?????if?k>0
%?????????A1=A1(1:k:);
%?????????b1=b1(1:k:);
%?????end
%?????if?s>0
%?????????A2=A2(1:s:);
%?????????b2=b2(1:s:);
%?????end
????
????while?1??%這一層循環怎么退出
????????P=eye(nn);
????????if?k>0?%判斷M矩陣是否為空
????????????%這里M矩陣構造有點區別
????????????tM=transpose(A1);
????????????P=P-tM*inv(A1*tM)*A1;
????????end
????????%Funval是怎么定義的,意義何在
????????gv=Funval(gfvarx0);
????????gv=transpose(gv);
????????%計算負梯度
????????d=-P*gv;
????????if?d==0
?????????
評論
共有 條評論