实验七

实验内容

1、确定方程组是否可解并用程序给出结果。

2、Jacobi方法。

3、Jacobi方法。

4、G-S方法。

5、QR分解。


实验综述

本实验均基于 MATLAB 2019b 版本

安装MATLAB 2019b 点击查看

实验过程

确定方程组是否可解并用程序给出结果。

实验代码
%% 确定方程组是否可解并用程序给出结果。
%  版本 2019b
%  说明 方程组:
%    x1 + 4*x2 - 2*x3 +3*x4 = 6
%    2*x1 + 2*x2 + 4*x4 = 2
%    3*x1 - x3 + 2*x4 = 1
%    x1 + 2*x2 + 2*x3 - 3*x4 = 8
%% 代码部分
clc,close,clear;
A = [1 4 -2 3;2 2 0 4;3 0 -1 2;1 2 2 -3];b = [6 2 1 8]';
Ar = rank(A);Br = rank([A b]);
if Ar ~= Br
    disp('系数矩阵的秩不等于增广矩阵的秩,方程组无解');
elseif Br == 4
    disp('系数矩阵的秩等于增广矩阵的秩等于未知数个数,方程组有唯一解');
    xx = A\b;
    fprintf('其解为:x1 = %.2f x2 = %.2f x3 = %.2f x4 = %.2f\n',xx(1),xx(2),xx(3),xx(4));
else
    disp('系数矩阵的秩等于增广矩阵的秩小于未知数个数,方程组有无穷多解');
    disp('其通解为:')
    u0 = null(sym(A));
    u = sym(A)\sym(b);
end
实验效果

Jacobi方法。

实验代码
%% 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
实验效果