日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dogleg“狗腿”最优化算法

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dogleg“狗腿”最优化算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
近期剛學習了dogleg狗腿最優化算法,老師給出了一個大體的框架并給出了一個練習,讓我們用程序去實現它,鑒于本人剛剛開始接觸最優化,對MATLAB語言的使用也很生疏,在網上查閱了大量的資料,一個通宵把算法寫出來,并在matlab中得到了驗證。 老師給出的練習為,。Dogleg狗腿算法是信賴域算法中的一個subproblem,其主要用來求d向量,也就是搜索方向。在寫代碼的時候,發現老師給出的框架當中,沒有涉及到的取值,在查閱了很多資料之后,知道的取值與和和信賴域的取值有關,具體的關系會在程序中體現。此外,在代碼程序中,最困擾的我是程序對函數的普適性,只要給出一個函數,代碼會自動的進行,而不是需要人為地把函數各個變量的系數先算出來。代碼如下: 主程序(demo_dogleg): %programed by Lu Qi,UCAS %my email:qqlu1992@gmail.com global syms x y pars.f_x_y=100*(y - x^2).^2 + (1 - x)^2; pars.dfdx=diff(pars.f_x_y,x,1); pars.dfdy=diff(pars.f_x_y,y,1); pars.df2dxdy=diff(pars.dfdx,y,1); pars.df2dx2=diff(pars.dfdx,x,1); pars.df2dy2=diff(pars.dfdy,y,1); pars.trustRegionBound=10; %信賴域 pars.tao=2; %tao的初始化 pars.x0=[-9 -9]'; %初始點的坐標 [x_final,num_iter]=dogleg(pars); fprintf('x_final= \n'); [m, n] = size(x_final); for i = 1 : mfor j = 1 : nfprintf('%8.4f', x_final(i, j));endfprintf('\n'); end fprintf('num_iter=%d',num_iter);其中,在程序中,前半部分,也就是在dogleg函數之前的代碼,是用來求函數的一次偏導和二次偏導,所以如果想求不同的函數,可以僅僅改變pars.f_x_y的值。 下面是實現dogleg算法的程序(dogleg): function [x_final,i]=dogleg(pars) global syms x y %programed by Lu_Qitemp=pars.x0; temp_x=temp(1); temp_y=temp(2);calculate;fan_g_x=sum(abs(pars.g_x)); tao=pars.tao; i=1; while(1)if(fan_g_x<=0.00001)breakendfprintf('iter=%d\n',i);d_u=pars.g_x'*pars.g_x/(pars.g_x'*pars.b_x*pars.g_x);d_u=-d_u*pars.g_x;d_b=inv(pars.b_x);d_b=-d_b*pars.g_x;if d_u'*d_u > pars.trustRegionBound*pars.trustRegionBound; tao = pars.trustRegionBound / sqrt((d_u'*d_u)); else if d_b'*d_b > pars.trustRegionBound*pars.trustRegionBound tao = sqrt((pars.trustRegionBound*pars.trustRegionBound - d_u'*d_u) / ((d_b-d_u)'*(d_b-d_u))) + 1; endendif tao <=1 && tao >= 0d_tao = tao * d_u; else if tao <=2 && tao >= 1d_tao = d_u + (tao - 1) * (d_b - d_u); end endp=((f_x_result(pars,temp_x,temp_y,d_tao))/(q_x_result(pars,d_tao)));if p > 0.75 && abs(d_tao'*d_tao)==pars.trustRegionBound pars.trustRegionBound = min(2 * pars.trustRegionBound, 3); else if p < 0.25 pars.trustRegionBound = sqrt(abs(d_tao'*d_tao)) * 0.25; end end if p > 0 temp = temp + d_tao; endtemp_x=temp(1);temp_y=temp(2);calculate;fan_g_x=sum(abs(pars.g_x));i=i+1; end x_final=temp; dogleg的程序中包含了如下三個小函數: calculate函數,用來求在某一坐標下的g(x)和b(x)的值: %calculate g_x b_x old={x,y}; new={temp_x ,temp_y}; pars.g_x=[subs(pars.dfdx,old, new);subs(pars.dfdy,old, new)]; pars.b_x=[subs(pars.df2dx2,old, new) subs(pars.df2dxdy,old, new);subs(pars.df2dxdy,old, new) subs(pars.df2dy2,old, new)f_x_result函數用來求兩點的差值: function result=f_x_result(pars,temp_x,temp_y,d) % global syms x y old={x,y}; new={temp_x ,temp_y}; result=subs(pars.f_x_y,old, new); new={temp_x+d(1),temp_y+d(2)}; result=result-subs(pars.f_x_y,old, new);q_x_result函數用來求近似情況下兩點的差值: function result=q_x_result(pars,d_tao) % result=-(d_tao'*pars.g_x+0.5*d_tao'*pars.b_x*d_tao);這樣整個程序就完成了,測試后的結果為:
由于本人在菜鳥一個,剛剛進入研究生的門檻,難免在程序的思路上出現錯誤,還請大家多多指教,也可以郵件進行交流,共同進步。我的郵箱是qqlu1992@gmail.com,謝謝大家斧正。


總結

以上是生活随笔為你收集整理的Dogleg“狗腿”最优化算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。