擬牛頓算法 BFGS matlab程序
瀏覽:1876
%%%%%%
Matlab程序--BFGS擬牛頓算法 % clc % clear % syms x1 x2 % f=@(x1,x2)x1.^2+x2.^2-x1*x2-10*x1-4*x2+60 % X=BFGS(f,[0,0],1e-8,100) function x=BFGS(f,x0,eps,k) %f為函數表達式,x0初始值向量,eps誤差,k迭代次數 x0=x0'; TiDu=matlabFunction(gradient(sym(f)));%梯度函數 m=length(x0); A=eye(m); %構造初始函數,單位矩陣 %函數值,梯度值的表達式 f_cal='f(x0(1),x0(2))'; %初始點的值函數 tidu_cal='TiDu(x0(1),x0(2))'; %該點梯度值 f1_cal='f(x_1(1),x_1(2))'; %下一點函數值 %從第一點計算到第二個點 f_x0=eval(f_cal); tidu_x0=eval(tidu_cal); if norm(tidu_x0)
eps delta_x=dalfa*d; delta_g=tidu_x1-tidu_x0; delta_A=-A*delta_x*delta_x'*A/(delta_x'*A*delta_x)+delta_g*delta_g'/(delta_g'*delta_x); A=A+delta_A; tidu_x0=tidu_x1; d=-A*tidu_x0; %下降方向 syms alfa x_1=x0+alfa*d; %更新迭代點位置 f_x1=eval(f1_cal); %計算迭代點的函數表達式 df_x1=diff(f_x1); %計算迭代點的梯度表達式 dalfa=double(solve(df_x1)); %求解,得到步長alfa x0=x0+dalfa*d; tidu_x1=eval(tidu_cal); n=n+1; end x=x0; end

技術鄰APP
工程師必備
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP
1




















