共轭梯度法求解线性方程组:Ax=b
数值分析老师给的作业,写出来代码平时分满分。简单勿喷,hhhh
原理
CG求解线性方程组的原理大家翻一翻数值分析的课本即可,此处不哔哔直接上matlab代码
代码
%qjyang
clc
clear;
A = [10 1 2 3 4
4 9 -3 1 -3
2 -1 7 3 -5
3 2 3 12 -2
4 -3 -5 -1 15];%求解线性方程组Ax=b
b=[12 -27 14 17 12]';
x0=ones(5,1);%给定的初始点
max_n=400;%最大迭代次数
fprintf('数值分析-CG法求解线性方程组:');
x=x0;
lon=1e-4;%求解精度值
r=b-A*x;%r0
d=r;%d0=r0=b-Ax
%循环结构
for k=0:max_n
alpha=(r'*r)/(d'*A*d);
xx=x+alpha*d;
rr=b-A*xx;
if (norm(rr,2)/norm(b,2))<= lon
fprintf('\n 满足条件的解:');
n = k+1;
x=xx;
r=rr;
fprintf('\n x%d = ',k+1);
fprintf(' %10.4f',x);
fprintf('\n r%d = ',k+1);
fprintf(' %10.4f',r);
fprintf('\n');
fprintf('迭代次数:\n %d',n);
fprintf('\n方程的解:\n');
fprintf('%10.4f',x);
return
end
beta=(rr'*rr)/(r'*r);
d=rr+beta*d;
x=xx;
r=rr;
fprintf('\n x%d = ',k+1);
fprintf(' %10.4f',x);%连续打印所有求解值直到满足精度为止
end
%循环结构
代码运行结果
数值分析-CG法求解线性方程组:
x1 = 0.2605 -2.2351 1.7395 0.9076 1.1849
x2 = 0.2781 -2.3507 1.9072 1.3397 0.9460
x3 = 0.2741 -2.3303 1.7348 1.5023 0.9852
x4 = 0.2284 -2.3847 1.5846 1.5107 0.9084
x5 = 0.4896 -2.7493 1.2607 1.5399 0.5980
x6 = 0.5301 -2.7901 1.2230 1.5403 0.6113
x7 = 0.5287 -2.7954 1.2246 1.5460 0.6110
x8 = 0.5261 -2.7954 1.2239 1.5466 0.6113
x9 = 0.5251 -2.7937 1.2238 1.5474 0.6122
x10 = 0.5251 -2.7921 1.2251 1.5473 0.6131
x11 = 0.5246 -2.7911 1.2273 1.5460 0.6140
x12 = 0.5239 -2.7911 1.2279 1.5462 0.6144
x13 = 0.5232 -2.7904 1.2283 1.5466 0.6149
x14 = 0.5231 -2.7897 1.2286 1.5466 0.6152
满足条件的解:
x15 = 0.5230 -2.7894 1.2287 1.5463 0.6153
r15 = 0.0012 -0.0016 0.0012 -0.0017 -0.0007
迭代次数:
15
方程的解(满足精度条件):
0.5230 -2.7894 1.2287 1.5463 0.6153
芜湖!下班淦饭!