資源簡介
最優化算法 matlab 一維搜索 多維搜索

代碼片段和文件信息
function?[x_kf_k]=conjugate_gradient(funx0eps)
%%?Usage:[x_kf_k]=conjugate_gradient(‘x1^2+2*x2^2-4*x1-2*x1*x2‘[1;1]0.01)
x_k=x0;
l=length(x0);
f=inline(sym(fun));
%?每次新初始點處
g0=G(funx_k);?%這里s_k是1*2矩陣
s_k=-g0;
k=0;
while?1
????%?精確一維搜索表達式,fun_v
????syms?x;
????switch?l
????????case?2fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*x);
????????case?3fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*xx_k(3)+s_k(3)*x);
????????case?4fun_v=f(x_k(1)+s_k(1)*xx_k(2)+s_k(2)*xx_k(3)+s_k(3)*xx_k(4)+s_k(4)*x);
????end
????fun_vv=inline(fun_v);
????
????%?調用Newton法求最小lamda值
????c=Advance_Back(fun_v);
????result=Newton(fun_vvc);
????lamda=result(1);
????x_k=x_k+lamda*s_k;
????g1=G(funx_k);???%這里是k+1的梯度值
????
????norm_g1=norm(g1);
????if?norm_g1 ????????switch?l
????????????case?2f_k=f(x_k(1)x_k(2));
????????????case?3f_k=f(x_k(1)x_k(2)x_k(3));
????????????case?4f_k=f(x_k(1)x_k(2)x_k(3)x_k(4));
????????end
????????return
????end
????
????u_k1=norm(g1)^2/norm(g0)^2;
????s_k=-g1+u_k1*s_k;
????k=k+1;
????g0=g1;?%g1退化為g0
????
????if?k==l-1
????????%x_k=x_k;?x0=x_k;
????????g0=G(funx_k);?%這里s_k是1*2矩陣
????????s_k=-g0;
????????k=0;
????end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%?函數2,精確一維搜索Newton法
function?x1=Newton(funx0)?%x1可能是多個值
delta?=0.01;
%%?求表達式的一階導d1_f,二階導d2_f
d1_f=inline(diff(sym(fun)));
d2_f=inline(diff(sym(fun)2));
%%?計算牛頓迭代公式
while?1
????d1_x0=d1_f(x0);
????d2_x0=d2_f(x0);
????err=abs(d1_x0);
????
????if?err?????????x1=x0;
????????return
????end
????x0=x0-d1_x0/d2_x0;??%計算新x0
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%?函數3,求梯度矩陣函數
function?[Gradient_f]=G(funx);
%%?表達式中變量個數
l=length(x);
Gradient_f=zeros(l1);
%%?梯度矩陣(在x處一階導)的值
for?i=1:l
????%?循環求出梯度表達式
????x_i=[‘x‘num2str(i)];
????d=diff(sym(fun)x_i);????%對x(i)求梯度
????%?將xi替換為x(i)
????for?k=1:l
????????x_k=[‘x‘num2str(k)];
????????x_k1=[‘x(‘num2str(k)‘)‘];
????????d=strrep(char(d)x_kx_k1);
????end
????%?將該字符串寫成內聯函數,并將計算的值賦給Gradient_f矩陣對應的位置
????d_fun=inline(d);
????Gradient_f(i)=d_fun(x);
????
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%?函數4,進退法確定牛頓搜索初始點
function?c=Advance_Back(fun)
t0=0;
h=0.1;
%%?求函數表達式
f=inline(fun);
f_t0=f(t0);
t2=t0+h;
f_t2=f(t2);
if?f_t2<=f_t0???%向正方探測
????t1=t0+h;
????f_t1=f(t1);
else????????????%向負方向探測
????h=-h;
????t1=t0+h;
????f_t1=f(t1);
end
%%?進退法計算
while?1
????if?f_t1<=f_t0
????????h=2*h;
????????t2=t0;
????????t0=t1;
????????t1=t0+h;
????????f_t1=f(t1);
????else
????????if?t1 ????????????a=t1;
????????????b=t2;
????????else
????????????a=t2;
????????????b=t1;
????????end
????????c=(a+b)/2;
????????return;
????end
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2012-12-04?13:20??算法程序\
?????目錄???????????0??2012-12-04?12:48??算法程序\實用最優化方法2\
?????文件????????3144??2012-12-04?15:03??算法程序\實用最優化方法2\DFP.m
?????文件?????????810??2012-12-04?09:35??算法程序\實用最優化方法2\G.m
?????文件????????1399??2012-12-04?09:59??算法程序\實用最優化方法2\G_H.m
?????文件????????3075??2012-12-04?15:00??算法程序\實用最優化方法2\conjugate_gradient.m
?????文件????????3585??2012-12-04?15:02??算法程序\實用最優化方法2\damp_Newton.m
?????文件????????3201??2012-12-04?15:03??算法程序\實用最優化方法2\gradient_my.m
?????目錄???????????0??2012-12-04?13:18??算法程序\實用最優化算法\
?????文件????????1092??2012-12-04?13:09??算法程序\實用最優化算法\Advance_Back.m
?????文件????????1307??2012-12-04?13:11??算法程序\實用最優化算法\Bisect.m
?????文件????????1361??2012-12-04?13:12??算法程序\實用最優化算法\Golden_Slect.m
?????文件????????2003??2012-12-04?13:13??算法程序\實用最優化算法\Inaccuracy.m
?????文件????????1097??2012-12-04?13:15??算法程序\實用最優化算法\Newton.m
?????文件????????1117??2012-12-04?13:17??算法程序\實用最優化算法\Succeed_Fail.m
?????文件???????40960??2012-11-04?10:09??算法程序\實用最優化算法\測試記錄.doc
?????文件???????25581??2012-11-04?10:09??算法程序\實用最優化算法\測試記錄.docx
- 上一篇:分數階傅里葉變換MATLAB
- 下一篇:一個遺傳算法TSP程序(GUI界面)
評論
共有 條評論