最速下降
我们讨论的依然是变分法求解
A
x
=
b
Ax = b
Ax=b的问题
对问题的描述已经在上一章完全叙述过了。
传送门: [link](https://blog.csdn.net/weixin_29732003/article/details/103310961)
最速下降法算法在大多数数值分析的教程中会有详细的说明。
我对这个方法的迭代过程做一个简洁的说明:
我们做用迭代法解线性方程组的时候只关注两件事情
1.方向
2.步长
方向是该点处的负梯度方向,即下降的速度必须是最快的速度。
步长是使得该次能达到最低数值(高度)的步长,即下降的步长是最深的步长
代码如下(以前的部分没有删去):
clear
clc
%% 参数
N = 2;%图像宽度
X0 = [0;0];%迭代初值
e0 = eps;%torlation
%方程
A = [3 1;1 5];
b = [1;1];
%% 表达式以及网格化表面图
figure(1)
vec = -N/2+0.5:0.01:N/2-0.5;
[xx, yy] = meshgrid(vec,vec);
Z = 0.5*(3*xx.^2+2*xx.*yy+5*yy.^2)-xx-yy;
s = surf(xx,yy,Z,'FaceAlpha',0.5,'EdgeColor','none');
colorbar
%% 等高线图
figure(2);
subplot(1,2,1);
contour(xx,yy,Z); %绘制函数的等高线
subplot(1,2,2);
contourf(xx,yy,Z,16); %绘制等高线指定条数16并填充颜色
%% 最速下降
figure(3)
subplot(1,2,1);
surf(xx,yy,Z,'FaceAlpha',0.5,'EdgeColor','none')
hold on
%开始求解
X = X0;
r = A*X - b;
%开始迭代
while(abs(r)>e0)
% alpha 是每次迭代的步长
alpha = (r.*r)/(r'*A*r);
Xp = X;
X = X - alpha.*r;
P1 = linspace(Xp(1),X(1));
P2 = linspace(Xp(2),X(2));
T = 0.5*(3*P1.^2+2*P1.*P2+5*P2.^2)-P1-P2;
plot3(P1,P2,T,'Color','r','LineWidth',2)
hold on
r = A*X - b;
end
hold off
subplot(1,2,2)
contour(xx,yy,Z); %绘制等高线
hold on
%开始求解
X = X0;
r = A*X - b;
%开始迭代
while(abs(r)>e0)
% alpha 是每次迭代的步长
alpha = (r.*r)/(r'*A*r);
Xp = X;
X = X - alpha.*r;
P1 = linspace(Xp(1),X(1));
P2 = linspace(Xp(2),X(2));
plot(P1,P2,'Color','r','LineWidth',2)
hold on
r = A*X - b;
end
非常尴尬的一点是每回下降的方向应该是正交的不知为何没有体现出来。先发了,往后再思考这个问题