%% Jacobi方法.
% 版本 2019b
%% 代码部分
clc,close,clear;
A = [0.5 1.1 3.1;6.5 -5.78 -8.7;5 0.96 6.5];
b = [6 -40.8 0.96]';
N = length(b);
fprintf('库函数计算结果:');
x = A\b %库函数计算结果
B = zeros(N,N);g=zeros(N,1);
x = zeros(N,1);%迭代初始值
eps=0.001;%相邻解的距离小于该数时,结束迭代
D = diag(diag(A));
E = -tril(A,-1);%下三角
F = -triu(A,1);%上三角
B = inv(D)*(E+F);
g = inv(D)*b;
for k=1:100 %最大迭代次数为100
y=B*x+g;
% fprintf('第%d次迭代:',k);
% fprintf('\n与上次计算结果的距离(2范数):%f \n',norm(x-y)^2);
% disp(y);
if norm(x-y)<eps
break;
end
x = y;
end
if k == 100
fprintf('达到最大迭代次数%0.0f',k)
else
fprintf('迭代次数%0.0f',k)
end
x
实验效果
Jacobi方法。
实验代码
%% Jacobi方法.
% 版本 2019b
%% 代码部分
clc,close,clear;
A = [1 2 3;2 3 4;3 4 4];
b = [2 3 6]';
N = length(b);
fprintf('库函数计算结果:');
x = A\b %库函数计算结果
B = zeros(N,N);g=zeros(N,1);
x = zeros(N,1);%迭代初始值
eps=0.001;%相邻解的距离小于该数时,结束迭代
D = diag(diag(A));
E = -tril(A,-1);%下三角
F = -triu(A,1);%上三角
B = inv(D)*(E+F);
g = inv(D)*b;
n = 100 %最大迭代次数为100
for k=1:n
y=B*x+g;
% 取消(增加)注释来显示(不显示)每次迭代的结果
% fprintf('第%d次迭代:',k);
% fprintf('\n与上次计算结果的距离(2范数):%f \n',norm(x-y)^2);
% disp(x)
if norm(x-y)<eps
break;
end
x = y;
end
if k == 100
fprintf('达到最大迭代次数%0.0f',k)
else
fprintf('迭代次数%0.0f',k)
end
x
实验效果
G-S方法。
实验代码
%% G-S方法。
% 版本 2019b
%% 代码部分
clc,close,clear;
B=[1 2 3;2 3 4;3 4 4];
b2=[2 3 6];
x0=[0;0;0]; %迭代初值
ep=1e-6; %误差
N=1000; %最大迭代次数
x = G_S(B,b2,x0,ep,N)
function x=G_S(A,b,x0,ep,N)
%用途:用高斯迭代法解线性方程组Ax=b
%A为系数矩阵,b为右端向量,x0为初始向量(默认零向量)
%ep为精度(1e-6),N为最大迭代次数(默认500次),x返回近似解向量
n=length(b);
if nargin<5
N=500;
end
if nargin<4
ep=1e-6;
end
if nargin<3
x0=zeros(n,1);
end
x=zeros(n,1);
k=0;
while k<N
for i=1:n
if i==1
x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);
elseif i==n
x(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);
else
x(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);
end
end
if norm(x-x0,inf)<ep
break;
end
x0=x;
%disp('x=');
%disp(x);可输出中间结果
k=k+1;
end
if k==N
disp('已到达迭代次数上限!');
end
disp(['k=',num2str(k)])
end
实验效果
QR分解。
实验代码
%% QR分解。
% 版本 2019b
%% 代码部分
clc,close,clear;
A1 = [2 -1 0 0;1 2 -1 0;0 -1 2 -1;0 0 -1 2];
A2 = [1 3 2 1 4;2 6 1 0 7;3 9 3 1 11];
[q1,r1] = qr_gs(A1)
[q2,r2] = qr(A2)
% 自定义QR函数
function [Q,R] = qr_gs(A)
[m,n] = size(A);
if m ~= n
error('不满足QR分解要求');
end
Q = zeros(m,n);
X = zeros(n,1);
R = zeros(n);
for k = 1:n
R(k,k) = norm(A(:,k));
if R(k,k) == 0
break;
end
Q(:,k) = A(:,k)/R(k,k);
for j = k+1:n
R(k,j) = Q(:,k)'*A(:,j);
A(:,j) = A(:,j)-R(k,j)*Q(:,k);
end
end
end