一、牛顿法原理
牛顿法的原理是利用一阶导数(梯度)和二阶导数(Hess)对目标函数进行二次函数近似,把二次函数的极小值当成新的迭代点,不断重复,从而找到最优解。
取
x
k
x_k
xk泰勒展式的前3项:
q
k
(
x
)
=
f
k
+
g
k
T
(
x
−
x
k
)
+
1
2
(
x
−
x
k
)
T
G
k
(
x
−
x
k
)
q_k(x) = f_k + g_k^{T}(x-x_k)+\frac{1}{2}(x-x_k)^TG_k(x-x_k)
qk(x)=fk+gkT(x−xk)+21(x−xk)TGk(x−xk)
其中,
f
k
=
f
(
x
k
)
,
g
k
=
δ
f
(
x
k
)
,
G
k
=
δ
f
2
(
x
k
)
f_k = f(x_k),g_k = \delta f(x_k),G_k = \delta f^2(x_k)
fk=f(xk),gk=δf(xk),Gk=δf2(xk)
求二次函数
q
k
(
x
)
q_k(x)
qk(x)的稳定点,得:
g
k
T
+
G
k
(
x
−
x
k
)
=
0
g_k^{T} + G_k(x-x_k) = 0
gkT+Gk(x−xk)=0
x
k
+
1
=
x
k
−
G
k
−
1
g
k
x_{k+1} = x_k - G_k^{-1}g_k
xk+1=xk−Gk−1gk
算法步骤:
1). 取初值点
x
0
x_0
x0,容许误差
0
<
=
e
<
<
1
0<=e<<1
0<=e<<1。令
k
:
=
0.
k:=0.
k:=0.
2). 计算
g
k
=
δ
f
(
x
k
)
g_k = \delta f(x_k)
gk=δf(xk) ,若
∣
∣
g
k
∣
∣
<
=
e
||g_k|| <=e
∣∣gk∣∣<=e,输出
x
∗
=
x
k
.
x_* ~= x_k.
x∗ =xk.
3). 计算
G
k
=
δ
2
f
(
x
k
)
G_k = \delta^2 f(x_k)
Gk=δ2f(xk),并求解线性方程组
G
k
d
k
=
−
g
k
G_k d_k= -g_k
Gkdk=−gk得
d
k
d_k
dk
4). 令
x
k
+
1
:
=
x
k
+
d
k
;
k
=
k
+
1
,
x_{k+1} := x_k +d_k; k = k+1,
xk+1:=xk+dk;k=k+1,转步骤1)
二、Matlab程序及仿真
1、Matlab程序
%--------------Function:Unconstrained Nonlinear Optimizatioin----
%--------------Remark: Use Newton Method ----------------------
%--------------Data:2024.10.30----------------------------------
%--------------Author:Clemence----------------------------------
%--------------Reference:<<Optimization Calculation Method and its Matlab Program Implementation>>----------------------------------
x0 = [-1.2;1.0];
[k,x,val] = dampnm('fun','gfun','Hess',x0,1e-5)
%--------------Newton Method---------------------------------------------
function [k,x,val] = dampnm(fun,gfun,Hess,x0,epsilon)
maxk = 5000;
beta = 0.5;
while(k<maxk)
gk = feval(gfun,x0); %Calculate Gradient
Gk = feval(Hess,x0); %Calculate Hess
dk = -Gk\gk; %Calculate Search Direction
if(norm(gk)<epsilon)
break;
end
m = 0;mk = 0;
while(m<20)
if(feval(fun,x0+beta^m*dk)<=feval(fun,x0)+sigma*beta^m*gk'*dk)
mk = m;
break;
end
m = m+1;
end
x0 = x0+beta^m*dk;
k = k+1;
end
x = x0;
val = feval(fun,x);
end
%--------------Original Function-------------------------------------------
function f = fun(x)
f = 4*(x(1)^2-x(2))^2 + 3*(x(1)-1)^2;
end
%--------------Gradient Function-------------------------------------------
function gf = gfun(x)
gf = [16*(x(1)^2-x(2))*x(1)+6*(x(1)-1);-8*(x(1)^2-x(2))];
end
%--------------Hess -----------------------------------------------------
function He = Hess(x)
He = [48*x(1)^2-16*x(2)+6,-16*x(1);
-16*x(1), 8];
end
2、仿真结果
| 初始点 | 迭代次数 | 最优解 |
|---|---|---|
| (-1.2,1.0) | 8 | 1.6636e-20 |
| (0,0) | 6 | 8.7342e-20 |
| (10,10) | 15 | 3.4216e-16 |
| (10,-10) | 15 | 4.7196e-16 |
| (100,100) | 55 | 4.8197e-20 |
三、结果分析
从仿真结果中可以看出,牛顿法的迭代次数约为15次,最优解的误差小于1e-16,迭代次数和误差值明显优于梯度法,初始值的选取对算法的性能影响也较小。

1457

被折叠的 条评论
为什么被折叠?



