数值分析A-实验作业1 - 3.1

这篇具有很好参考价值的文章主要介绍了数值分析A-实验作业1 - 3.1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数值分析A-实验作业1- 3.1

注:为了便于校验结果,本文为实验报告的补充

相关MATLAB函数提示

可能用到的MATLAB函数
zeros(m,n) 生成m行,n列的零矩阵
ones(m,n) 生成m行,n列的元素全为1的矩阵
eye(n) 生成n阶单位矩阵
rand(m,n) 生成m行,n列(0,1)上均匀分布的随机矩阵
diag(x) 返回由向量x的元素构成的对角矩阵
tril(A) 提取矩阵A的下三角部分生成下三角矩阵
tril(A) 提取矩阵A的上三角部分生成上三角矩阵
rank(A) 返回矩阵A的秩
det(A) 返回方阵A的行列式
inv(A) 返回可逆方阵A的逆矩阵
[V,D]=eig(A) 返回方阵A的特征值和特征向量
norm(A,p) 矩阵或向量A的p范数
cond(A,p) 矩阵A的条件数
[L,U,P]=lu(A) 选取列主元LU分解
R=chol(X) 平方根分解
Hi=hilb(n) 生成n阶Hilbert矩阵

实验 3.1(主元的选取与算法的稳定性)

问题提出:

Gauss 消去法是我们在线性代数中已经熟悉的,但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保 Gauss 消去法作为数值算法的稳定性呢? Grauss 消去法从理论算法到数值算法,其关键是主元的选择,主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。

实验内容:

考虑线性方程组
A x = b , A ∈ R n × n , b ∈ R n Ax=b, A\in R^{n \times n},b \in R^n Ax=b,ARn×nbRn
编制一个能自动选取主元,又能手动选取主元的求解线性代数方程组的 Gauss 消去过程.

实验要求1.

取矩阵 A = [ 6 1 8 6 1 ⋱ ⋱ ⋱ 8 6 1 8 6 ] A=\begin{bmatrix} 6& 1 & & & \\ 8 & 6& 1& & \\ & \ddots& \ddots &\ddots & \\ & & 8& 6& 1\\ & & & 8&6 \end{bmatrix} A= 6816186816 , b = [ 7 15 ⋮ 15 14 ] b=\begin{bmatrix} 7\\ 15\\ \vdots\\ 15\\ 14 \end{bmatrix} b= 7151514 ,则方程有解 x ∗ = ( 1 , 1 , ⋯   , 1 ) T x^*=(1,1,\cdots,1)^T x=(1,1,,1)T,取 n = 10 n=10 n=10 计算矩阵的条件数.让程序自动选取主元,结果如何?

解:

(1) 计算条件数

n = 10 n=10 n=10,计算矩阵A的条件数,

%-----  code 计算条件数 -----

% --- 输入矩阵A和b --- 
n = input(' 请输入n: ');
A = zeros(n,n);
b = zeros(n,1);

for i =1:n
    A(i,i) = 6;
end
for i=1:n-1
    A(i,i+1) = 1;
    A(i+1,i) = 8;
end

b(1,1) = 7;
b(2:n-1,1) = 15;
b(n,1) = 14;

% --- 计算矩阵A的3种条件数 --- 
disp('cond(A,1) ');
disp(cond(A,1));
disp('cond(A,2) ');
disp(cond(A,2));
disp('cond(A,inf) ');
disp(cond(A,inf));

得到:

c o n d ( A ) 1 = 2557.5 c o n d ( A ) 2 = 1727.55602491356 c o n d ( A ) ∞ = 2557.5 cond(A)_1=2557.5\\ cond(A)_2=1727.55602491356\\ cond(A)_\infty=2557.5 cond(A)1=2557.5cond(A)2=1727.55602491356cond(A)=2557.5
A A A的条件数很大,说明矩阵 A A A为病态矩阵,方程组 A x = b Ax=b Ax=b为病态方程组,方程两端的微小扰动都可能对结果造成很大的误差。

(2)自动选取主元求解线性方程

输出说明: 使用format long 输出(16位有效数字),计算精度评价指标:$\left |x-x^* \right |_{\infty} $

  •  顺序高斯消去法
%-----  code 顺序Gauss消去 -----
%-----  code 顺序Gauss消去 -----
%-----  code 顺序Gauss消去 -----



clc %清除命令窗口的内容
clear all; %清除工作空间的所有变量,函数,和MEX文件
format long ; %设置输出显示格式为16位有效数字

%---------------------  数值分析 实验3.1 主元的选取与算法的稳定性 ---------------------
    %A  系数矩阵
    %b  右端项
    %n  阶数
%------------------------  1. -------------------------


% --- --- --- --- --- ---输入矩阵A和b --- --- --- --- --- ---

n = input('Input n = ');
A = zeros(n,n);
b = zeros(n,1);

for i =1:n
    A(i,i) = 6;
end
for i=1:n-1
    A(i,i+1) = 1;
    A(i+1,i) = 8;
end

b(1,1) = 7;
b(2:n-1,1) = 15;
b(n,1) = 14;

% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- --- 求解 --- --- --- --- --- --- --- 
disp('------- 精确解: ');
x = ones(n,1)

disp('------- 顺序高斯消元法解: ');
x0 = Gauss0(A,b)

disp('------- 误差 \left\| x-x^* \right\| _{\infty}  : ');
norm(x-x0,inf)
% --- --- --- --- --- ---定义判断函数 --- --- --- --- --- ---
function r= iszero(a)
    if(abs(a-0)<1e-10)
        r=1;
        disp('被除数为0,方程组无解 或有无穷解')
    else
        r=0;
    end
end
% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- ---定义顺序高斯消去函数 --- --- --- --- --- 

function x = Gauss0(A,b)
    %Gauss0为顺序高斯消去法
    %A  系数矩阵
    %b  右端项
    n = size(A,1);
    x = ones(n,1);
    l = ones(n,1);
    
    %消去过程
    for k = 1:n-1
        for i=k+1:n
            if(iszero(A(k,k)))%如果A(k,k)=0则停机
                return;
            else
                l(i) = A(i,k)/A(k,k);
                b(i) = b(i) - l(i)*b(k);
                for j =k:n
                    A(i,j) = A(i,j) - l(i)*A(k,j); 
                end
            end
        end
    end
    
    %回代过程
    if(iszero(A(n,n)))%如果(A(n,n)=0则停机
        return;
    else
       x(n) = b(n)/A(n,n);
    end

    for i=n-1:-1:1
        w=0;
        for j = i+1:n
            w = w + A(i,j)*x(j);
        end
        x(i) = (b(i)-w)/A(i,i);
    end

end

得到结果:
数值分析A-实验作业1 - 3.1
  •  列主元消去法
%-----  code 列主元Gauss消去 -----
%-----  code 列主元Gauss消去 -----
%-----  code 列主元Gauss消去 -----



clc %清除命令窗口的内容
clear all; %清除工作空间的所有变量,函数,和MEX文件
format long ; %设置输出显示格式为16位有效数字

%---------------------  数值分析 实验3.1 主元的选取与算法的稳定性 ---------------------
    %A  系数矩阵
    %b  右端项
    %n  阶数
%------------------------  1. -------------------------


% --- --- --- --- --- ---输入矩阵A和b --- --- --- --- --- ---

n = input('Input n = ');
A = zeros(n,n);
b = zeros(n,1);

for i =1:n
    A(i,i) = 6;
end
for i=1:n-1
    A(i,i+1) = 1;
    A(i+1,i) = 8;
end

b(1,1) = 7;
b(2:n-1,1) = 15;
b(n,1) = 14;

% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- --- 求解 --- --- --- --- --- --- --- 
disp('------- 精确解为x ------- ');
x = ones(n,1)

disp('------- 列主元Gauss消元法解为x1 -------');
x1 = Gauss1(A,b)

disp('------- 误差为 \left\| x-x^* \right\| _{\infty} -------');
norm(x-x1,inf)
% --- --- --- --- --- ---定义判断函数 --- --- --- --- --- ---
function r= iszero(a)
    if(abs(a-0)<1e-10)
        r=1;
        disp('被除数为0,方程组无解 或有无穷解')
    else
        r=0;
    end
end
% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- ---定义列主元Gauss消去函数 --- --- --- --- --- 
function x = Gauss1(A,b)  %Gauss1为列主元高斯消去法
    n = size(A,1);
    x = zeros(n,1);
    l = zeros(n,1);
        
    %消去过程
    for k = 1:n-1
        %找列主元
        MAX = max(abs(A(k:n,k)));%找到第k列,k到n行中绝对值最大的元素值
        index = find((abs(A(k:n,k)))==MAX);%得到第k到n行中最大元素的行标
        index = index+k-1;%转化为在矩阵A中的行标
        
        %列主元交换
        if abs(A(k,k)) ~= MAX %比index ~= k更好,因为可能有多个大小相同的最大值的情况
            index=index(1);
            A([k,index],:) = A([index,k],:);
            b([k,index],:) = b([index,k],:);
        end

        %消去过程
        for i=k+1:n
            if(iszero(A(k,k)))%如果A(k,k)=0则停机
                return;
            else
                l(i) = A(i,k)/A(k,k);
                b(i) = b(i) - l(i)*b(k);
                for j =k:n
                    A(i,j) = A(i,j) - l(i)*A(k,j); 
                end
            end
        end
    end

    %回代过程
    if(iszero(A(n,n)))%如果(A(n,n)=0则停机
        return;
    else
       x(n) = b(n)/A(n,n);
    end

    for i=n-1:-1:1
        w=0;
        for j = i+1:n
            w = w + A(i,j)*x(j);
        end
        x(i) = (b(i)-w)/A(i,i);
    end

end
得到结果:
数值分析A-实验作业1 - 3.1
  •  完全选主元消去法
%-----  code 完全选主元Gauss消去 -----
%-----  code 完全选主元Gauss消去 -----
%-----  code 完全选主元Gauss消去 -----




clc %清除命令窗口的内容
clear all; %清除工作空间的所有变量,函数,和MEX文件
format long ; %设置输出显示格式为16位有效数字

%---------------------  数值分析 实验3.1 主元的选取与算法的稳定性 ---------------------
    %A  系数矩阵
    %b  右端项
    %n  阶数
%------------------------  1. -------------------------


% --- --- --- --- --- ---输入矩阵A和b --- --- --- --- --- ---

n = input('Input n = ');
A = zeros(n,n);
b = zeros(n,1);

for i =1:n
    A(i,i) = 6;
end
for i=1:n-1
    A(i,i+1) = 1;
    A(i+1,i) = 8;
end

b(1,1) = 7;
b(2:n-1,1) = 15;
b(n,1) = 14;

% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- --- 求解 --- --- --- --- --- --- --- 
disp('------- 精确解为x ------- ');
x = ones(n,1)

disp('------- 完全选主元Gauss消元法解为2 -------');
x2 = Gauss2(A,b)

disp('------- 误差为 \left\| x-x^* \right\| _{\infty} -------');
norm(x-x2,inf)
% --- --- --- --- --- ---定义判断函数 --- --- --- --- --- ---
function r= iszero(a)
    if(abs(a-0)<1e-10)
        r=1;
        disp('被除数为0,方程组无解 或有无穷解')
    else
        r=0;
    end
end
% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- ---定义完全选主元Gauss消去函数 --- --- --- --- --- 
function x = Gauss2(A,b) %Gauss2为完全主元高斯消去法
    
    n = size(A,1);
    x = zeros(n,1);
    %l为乘数
    l = zeros(n,1);
    %e为初等变换矩阵,用于列交换之后将最后的解x的位置更正
    e = eye(n);
    %迭代n-1次
    for k = 1:n-1
        %寻找最大主元
        MAX1 = max(abs(A(k:n,k:n)));
        MAX = max(MAX1);
        [index1,index2] = find(abs(A(k:n,k:n))==MAX,1);
        index1 = index1+k-1;
        index2 = index2+k-1;
        %交换行、列
        if k ~= index1
            A([k,index1],:) = A([index1,k],:);
            b([k,index1],:) = b([index1,k],:);
        end
        if k ~= index2
            A(:,[k,index2]) = A(:,[index2,k]);
            e(:,[k,index2]) = e(:,[index2,k]);
        end
        for i=k+1:n
            l(i) = A(i,k)/A(k,k);
            b(i) = b(i) - l(i)*b(k);
            for j =k:n
                A(i,j) = A(i,j) - l(i)*A(k,j); 
            end
        end
    end

    x(n) = b(n)/A(n,n);
    for k=n-1:-1:1
        w=0;
        for j = k+1:n
            w = w + A(k,j)*x(j);
        end
        x(k) = (b(k)-w)/A(k,k);
    end
    x=e*x;

end
      
得到结果
数值分析A-实验作业1 - 3.1

实验要求2.

现选择程序中手动选取主元的功能,每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果.若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果.

(1)按模最小或按模尽可能小的元素作为主元

由完全选主元法就是按模最大的元素作为主元,若将取max换成取min,即按模最小或按模尽可能小的元素作为主元。因此对完全选主元函数myGauss2稍加修改,即可实现手动选取最小主元素。

同理,可以用程序模拟手动选取过程:迭代 k k k次时,在 [ a k k ( k ) ⋯ a k n ( k ) ⋮ ⋱ ⋮ a n k ( k ) ⋯ a n n ( k ) ] \begin{bmatrix} a_{kk}^{(k)} & \cdots &a_{kn}^{(k)}\\ \vdots & \ddots & \vdots \\ a_{nk}^{(k)} & \cdots &a_{nn}^{(k)} \end{bmatrix} akk(k)ank(k)akn(k)ann(k) 中按模最小选取主元。

%-----  code 手动按模最小或尽可能小Gauss消去 -----
%-----  code 手动按模最小或尽可能小Gauss消去 -----
%-----  code 手动按模最小或尽可能小Gauss消去 -----



clc %清除命令窗口的内容
clear all; %清除工作空间的所有变量,函数,和MEX文件
format long ; %设置输出显示格式为16位有效数字

%---------------------  数值分析 实验3.1 主元的选取与算法的稳定性 ---------------------
    %A  系数矩阵
    %b  右端项
    %n  阶数
%------------------------  实验要求(2) -------------------------


% --- --- --- --- --- ---输入矩阵A和b --- --- --- --- --- ---

n = input('Input n = ');
A = zeros(n,n);
b = zeros(n,1);

for i =1:n
    A(i,i) = 6;
end
for i=1:n-1
    A(i,i+1) = 1;
    A(i+1,i) = 8;
end

b(1,1) = 7;
b(2:n-1,1) = 15;
b(n,1) = 14;

% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- --- --- --- --- 求解 --- --- --- --- --- --- --- 
disp('------- 精确解为x ------- ');
x = ones(n,1)

disp('------- 按模最小或尽可能小选取主元Gauss消元法解为x3 -------');
x3 = Gauss3(A,b)

disp('------- 误差为 \left\| x-x^* \right\| _{\infty} -------');
norm(x-x3,inf)
% --- --- --- --- --- ---定义判断函数 --- --- --- --- --- ---
function r= iszero(a)
    if(abs(a-0)<1e-10)
        r=1;
        disp('被除数为0,方程组无解 或有无穷解')
    else
        r=0;
    end
end
% --- --- --- --- --- --- --- --- --- ------ --- --- --- ---


% --- --- 定义 按模最小或尽可能小选取主元的Gauss消去 函数 --- --- --- 
 function x = Gauss3(A,b)
    format long;
    n = size(A,1);
    x = zeros(n,1);
    %l为乘数
    l = zeros(n,1);
    %e为初等变换矩阵,用于列交换之后将最后的解x的位置更正
    e = eye(n);
    %迭代n-1次
    for k = 1:n-1

        %按模最小或尽可能小选取主元
        MIN = Inf;
        for p=k:n
            for q=k:n
                if (abs(A(p,q))<MIN) && (abs(A(p,q))~=0)
                    MIN = abs(A(p,q));
                    index1 = p;
                    index2 = q;
                else
                    index1 = k;
                    index2 = k;
                end
            end
        end

        %交换行、列
        if k ~= index1
            A([k,index1],:) = A([index1,k],:);
            b([k,index1],:) = b([index1,k],:);
        end
        if k ~= index2
            A(:,[k,index2]) = A(:,[index2,k]);
            e(:,[k,index2]) = e(:,[index2,k]);
        end
        for i=k+1:n
            l(i) = A(i,k)/A(k,k);
            b(i) = b(i) - l(i)*b(k);
            for j =k:n
                A(i,j) = A(i,j) - l(i)*A(k,j); 
            end
        end
    end

    x(n) = b(n)/A(n,n);
    for k=n-1:-1:1
        w=0;
        for j = k+1:n
            w = w + A(k,j)*x(j);
        end
        x(k) = (b(k)-w)/A(k,k);
    end
    x=e*x;

end
得到结果
数值分析A-实验作业1 - 3.1
(2)按模最大元素作为主元

分析可知,按模最大元素作为主元即完全选主元法,结果一致。文章来源地址https://www.toymoban.com/news/detail-461862.html

到了这里,关于数值分析A-实验作业1 - 3.1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数值分析实验】(五)线性方程组的迭代解法(含matlab代码)

            迭代法就是用某种极限过程去逐步逼近线性方程精确解的方法。迭代法具有需要计算机的存储单元较少、程序设计简单、原始系数矩阵在计算过程中始终不变等优点,但存在收敛性及收敛速度问题。 3.1.1 算法过程 3.1.2 代码 3.1.3 计算结果 3.2.1 算法过程 3.2.2 代码

    2024年02月03日
    浏览(32)
  • 算法设计与分析—动态规划作业二(头歌实验)

    任务描述 本关任务:计算寻宝人所能带走的宝物的最大价值。 一个寻宝人在沙漠中发现一处神秘的宝藏,宝藏中共有 n 个宝物( n 不超过 20 ),每个宝物的重量不同,价值也不同,宝物 i 的重量是 wi ,其价值为 vi 。 寻宝人所能拿走的宝物的总重量为 m ( m 不超过 50 )。请

    2024年02月06日
    浏览(59)
  • 算法设计与分析—动态规划作业一(头歌实验)

    任务描述 本关任务:求一个序列的最长上升子序列。 相关知识 最长上升子序列问题 当一个序列 Bi 满足 B1 B2 ... Bs 的时候,我们称这个序列是 上升 的。对于给定的一个序列 a1, a2, ..., aN ,我们可以在其中找到一些上升的子序列。 现在给你一个序列,请你求出其中 最长 的上

    2024年02月04日
    浏览(98)
  • 头歌操作系统 课后作业3.1:进程的描述与状态

    第1关:1 号进程的核心栈内容分析 编程要求 根据相关知识,回答问题: (将答案填写在 /data/workspace/myshixun/第三关.txt 中) 1 号进程的核心栈栈底的位置是多少? 1 号进程(用 si)执行函数 task1 中的第一个 int 0x81 指令后,核心栈栈顶的位置是多少?从栈底到栈顶依次放了哪

    2024年02月05日
    浏览(30)
  • 物联网控制原理与技术--基于Matlab/利用MATLAB进行频域分析(伯德图)的应用(超详细/设计/实验/作业/练习)

    (1)熟练掌握运用MATLAB命令绘制控制系统伯德图的方法; (2)了解系统伯德图的一般规律及其频域指标的获取方法; (3)熟练掌握运用伯德图分析控制系统稳定性的方法; 1、Windows 10 2、Matlab 2012a 1. 用MATLAB作伯德图 控制系统工具箱里提供的bode()函数可以直接求取、绘制给

    2024年02月09日
    浏览(31)
  • 数值计算大作业:最小二乘法拟合(Matlab实现)

        作为研究生的入门课,数值计算的大作业算是所有研究生开学的重要编程作业。      我把最小二乘算法在MATLAB中整合成了一个M函数文件least square fitting.m,直线拟合函数lsf_linear.m,以及抛物线拟合函数lsf_parabolic.m。程序放在文章最后了,需要的同学自取。下文为作业详

    2024年02月07日
    浏览(30)
  • 实验6 Matlab数值计算

    实验目的: 掌握数据统计与分析的方法; 掌握数据插值和曲线拟合的方法及其应用; 掌握多项式的常用运算。 实验内容: 利用randn函数生成符合正态分布的10×5随机矩阵A,进行如下操作: 求A的最大元素和最小元素; 求A的每行元素的和以及全部元素的和; 分别对A的每列元

    2024年02月06日
    浏览(50)
  • 实验九 数据微积分与方程数值求解(matlab)

    实验九 数据微积分与方程数值求解 1.1实验目的 1.2实验内容 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1,掌握求数值导数和数值积分的方法; 2,掌握代数方程数组求解的方法; 3,掌握多常微分方程数值求解的方法。 %% clc clear %% 1 clear;clc x=1;i=1; f=inline

    2024年02月12日
    浏览(28)
  • 【数值分析不挂科】第三章 | 数值积分

    为什么要学习数值积分? 数值积分,把积分求值问题归结于被积函数值的计算,从而避开了 牛顿-莱布尼兹 公式需要寻找原函数的困难。 需要特别注意:① 区别于第二章中 n代表点的个数。**本章中的 n 指的是【区间数】**而不是点的个数!【区间数 = 点的个数 - 1】 ②所有

    2024年02月13日
    浏览(33)
  • 10、MATLAB程序设计与应用刘卫国(第三版)课后实验十:方程数值求解

    目录  一、  二、  三、  四、  五、 分别用 3种不同的数值方法解线性方程组。   --------------------------------------- 示例代码 - -------------------------------------------- -------------------------------------- - 运行结果 --------------------------------------------- 求代数方程的数值解。 (1)3x +sin x-e

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包