Matlab求解线性方程组(二)最速下降法

一,算法原理

 从某个初始点 X ( 0 ) {{X}^{(0)}} X(0) 出发,沿着 f ( X ) f(X) f(X)在点 X ( 0 ) {{X}^{(0)}} X(0)处的负梯度方向

r ( 0 ) = − ∇ f ( X ( 0 ) ) = b − A X ( 0 ) {{r}^{(0)}}=-\nabla f({{X}^{(0)}})=b-A{{X}^{(0)}} r(0)=f(X(0))=bAX(0)

求得 f ( X ) f(X) f(X)的极小值点 X ( 1 ) {{X}^{(1)}} X(1),然后从 X ( 1 ) {{X}^{(1)}} X(1)出发,重复上面的过程得到 X ( 2 ) {{X}^{(2)}} X(2)。如此下去,得到序列 X ( k ) {{X}^{(k)}} X(k)

 可以证明,从任一初始点 X ( 0 ) {{X}^{(0)}} X(0)出发,用最速下降法所得的序列 X ( k ) {{X}^{(k)}} X(k)均收敛于使 X X X最小化 f ( X ) f(X) f(X)的解,也就是方程 A X = b AX=b AX=b解。最速下降法的迭代格式为:给定初值 X ( 0 ) {{X}^{(0)}} X(0) X ( k ) {{X}^{(k)}} X(k)按如下方法决定

r ( k ) = − ∇ f ( X ( k ) ) = b − A X ( k ) {{r}^{(k)}}=-\nabla f({{X}^{(k)}})=b-A{{X}^{(k)}} r(k)=f(X(k))=bAX(k)
λ k = < r ( k ) T , r ( k ) > < r ( k ) T , A r ( k ) > {{\lambda }_{k}}=\frac{<{{r}^{(k)T}},{{r}^{(k)}}>}{<{{r}^{(k)T}},A{{r}^{(k)}}>} λk=<r(k)T,Ar(k)><r(k)T,r(k)>
X ( k + 1 ) = X ( k ) + λ r ( k ) {{X}^{(k+1)}}={{X}^{(k)}}+\lambda {{r}^{(k)}} X(k+1)=X(k)+λr(k)

二,源程序

最速下降法的源程序:

%最速下降法
%     'A';系数矩阵
%     'b':右端项
%     'e0':求解精度
%     'x';方程的解
%     'k':迭代次数
%     'tol':总误差
function [x,k,tol]=fastest(A,b,e0)
x0=zeros(length(b),1);
x=x0;
k=0;
i=1;
r=b-A*x0;
while norm(r)>=e0 
r=b-A*x0;
q=dot(r,r)/dot(A*r,r);
x=x0+q*r;
k=k+1;
tol(i)=norm(x-x0);%误差
x0=x;
i=i+1;
    end
end  

三,实例分析

同样是针对课本的计算实例P113,求解线性方程组Ax=b,其中
Matlab求解线性方程组(二)最速下降法_第1张图片
输入以下代码:(build函数源码在本系列的第一篇文章)

clc;
clear;
n=input('Please input n:');	%输入矩阵A的阶数
e0=input('Please input the accuracy:');
[A,b]=build(n);			%建立课本例3.2方程组系数矩阵及右端项
[x,k,error]=fastest(A,b,e0); 
q=log(error);
plot(q,'linewidth',1.5)
xlabel('迭代次数');
ylabel('log(error)');
title('最速下降法迭代误差变化曲线');

在n=100时,精度为1*10的-6次方时,迭代了19465次才满足精度要求
Matlab求解线性方程组(二)最速下降法_第2张图片

你可能感兴趣的:(计算方法,matlab,线性代数,矩阵)