基于黄金分割的修正Powell算法
生活随笔
收集整理的這篇文章主要介紹了
基于黄金分割的修正Powell算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.目標函數
function y= TextF(x) %目標函數 %輸入參數x[x1,x2]; %輸出參數y y = x(1)*x(1)+2*x(2)*x(2)-4*x(1)-2*x(1)*x(2); end</span>2.修訂的Powell算法
function [Matrix,Value] = Powell %--------------------------------Step1------------------------------------- %設置初始迭代輪次k=1;迭代精度:Err;初始點;初始搜索方向組; Err = 0.01; X0 = [1,1]; Dir = [1,0;0,1]; num = 2; while(1) %----------------------------------Step2----------------------------------- %第一輪:%沿著第一個方向進行一維搜索的得到相應的極值[X(1,:),JZ(1)] = OneDimensionSearch(X0,Dir(1,:),Err);%沿著第2到第num方向進行一維搜索for k = 2:numdir(k,:) = Dir(k,:);[X(k,:),JZ(k)] = OneDimensionSearch(X(k-1,:),dir(k,:),Err);end%構造新的搜索方向向量 并以X0為起點,沿此方向進行新一輪搜索,得到相應的極值dir(num+1,:) = X(num,:)-X0;[X(num+1,:),JZ(num+1)] = OneDimensionSearch(X0,dir(num+1,:),Err); %----------------------------------Step3-----------------------------------%判斷迭代終止條件delta = X(num+1,:)-X0;if( sqrt(sum(delta.*delta))<=Err )Matrix = X(num+1,:);Value = TextF(Matrix); %輸出最優解和最優變換參數break;else %----------------------------------Step4-----------------------------------MuInfoVal_0 = TextF(X0);%計算各個方向上的下降量Diff(1) = MuInfoVal_0-JZ(1);%此時我們在尋找極小值for k = 2:numDiff(k) = JZ(k-1)-JZ(k);end%記錄最下降量 以及 其出現的位置[maxDiff,m] = max(Diff); %----------------------------------Step5----------------------------------- %計算映射點Xmap = 2*X(num,:)-X0;%計算Powell特征值Val_0 = TextF(X0);Val_1 = TextF(X(num,:));Val_2 = TextF(Xmap);%判斷Powell條件if(Val_2>Val_0 && ...(Val_0-2*Val_1+Val_2)*(Val_0-Val_1-maxDiff)<0.5*maxDiff(Val_0-Val_2)^2 ) %----------------------------------Step6----------------------------------- %如果滿足,即為非線性相關 %設置下一輪搜索的初始點X0 = X(num+1,:);%替換m位置的搜索方向Dir(m,:) = dir(num+1,:); %----------------------------------Step7----------------------------------- else %如果不滿足,即為線性相關,%保持原來的搜索方向,設置下一輪搜索始點if(Val_1 < Val_2)X0 = X(num,:);elseX0 = X(num+1,:);endend end end end3.一維搜索策略(黃金分割、數值解法)
%% 一維搜索函數:采用黃金分割法 %% function [ExtremePos,ExtremeVal] = OneDimensionSearch(x1,Dir,err) % 從X0點開始,進行搜索 % Dir:搜索的方向。 % err:黃金分割的停止搜索的精度。 % 返回極大值ExtremeVal,以及極大值對應的點ExtremePos %------------------------Step1:進退法確定區間------------------------------ %計算x1,前進,計算x2 y1 = TextF(x1); x2 = x1+Dir; y2 = TextF(x2); %最小值左右支判斷 if y1 < y2 % 右支Dir = -Dir;temp = x1;x1 = x2;x2 = temp;x3 = x2+Dir;y3 = TextF(x3); else %左支 擴大搜索步法Dir = 2*Dir;x3 = x2+Dir;y3 = TextF(x3); end while(1) if (y2<=y3) %發現極小值所在的區間a = min(x1,x3);b = max(x1,x3);break;elsex1 = x2;x2 = x3;y2 = y3;x3 = x2+Dir;y3 = TextF(x3);end end %--------------------------Step2:黃金分割---------------------------------- g1 = 0.382; g2 = 0.618; xx1 = a+g1*(b-a); yy1 = TextF(xx1); xx2 = a+g2*(b-a); yy2 = TextF(xx2); delta = sqrt(sum(abs(b-a).*abs(b-a))); while( delta>=err)if(yy1 < yy2)b = xx2;xx2 = xx1;yy2 = yy1;xx1 = a+g1*(b-a);yy1 = TextF(xx1);elsea = xx1;xx1 = xx2;yy1 = yy2;xx2 = a+g2*(b-a);yy2 = TextF(xx2);end delta = sqrt(sum(abs(b-a).*abs(b-a))); end ExtremePos = 0.5*(a+b); ExtremeVal = TextF(ExtremePos); end4.運行代碼及結果
[m,n]=Powell m =3.9969 1.9985n =-8.0000</span>總結
以上是生活随笔為你收集整理的基于黄金分割的修正Powell算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书协议分析
- 下一篇: 是程序员就应该知道的东西