数值分析实验二

随机生成一个n阶方阵与n阶向量构成Ax=b

1、构建n阶对称正定矩阵

• 使用楚列斯基分解求x
• 使用改进的楚列斯基分解求x

代码如下:
main.m
%% A*x = b ,A为n阶对称正定矩阵,求解x
%% 使用楚列斯基分解求x
%% 使用改进的楚列斯基分解求x
 
clear all %初始化,清空变量
close all
clc %清空窗口命令
 
%% 随机生成方阵和向量
n=2;  %阶数
%生成n阶随机对称正定矩阵
M=diag(rand(n,1)); 
Z=orth(rand(n,n));
A=Z'*M*Z;    
b=rand(n,1);  %向量
 
%% 使用楚列斯基分解求x
x1 = Cholesky(A,b,n);
fprintf('******楚列斯基分解求得x=\n');
disp(x1);
 
%% 使用改进的楚列斯基分解求x
x2 = improveCholesky(A,b,n);
fprintf('******改进的楚列斯基分解求得x=\n');
disp(x2);
 
%% 求矩阵A的条件数 
cond1 = cond(A,1);  %1-范数
cond2 = cond(A,2);  %2-范数
cond3 = cond(A,inf);  %∞-范数
fprintf('******矩阵A的条件数为:%d, %d, %d\n',cond1,cond2,cond3);
Cholesky.m
function x = Cholesky(A,b,n)
%楚列斯基法求解线性方程组 A*x = b
lambda = eig(A);   %用eig求矩阵A的特征值
L = chol(A);  %用matlab内置函数chol将正定对称矩阵分解为上三角和下三角,即A=L*L',函数返回上三角
%% 解L'y = b,L'是对应的下三角矩阵
y(1) = b(1)/L(1,1);
if n>1
    for i=2:n
        y(i) = (b(i)-L(1:i-1,i)'*y(1:i-1)')/L(i,i);
    end
end
%% 解Lx = y
x(n) = y(n)/L(n,n);
if n>1
    for i=n-1:-1:1
        x(i) = (y(i)-L(i,i+1:n)*x(i+1:n)')/L(i,i);
    end
end
x = x';
end
improveCholesky.m
function x = improveCholesky(A,b,n)
%改进楚列斯基法求解线性方程组 A*x = b
L = zeros(n,n);
D = diag(n,0);  %主对角矩阵
S = L*D;
for i = 1:n
    L(i,i) = 1;
end
%% 由A=LDL'分解得到L和D
D(1,1)=A(1,1);
for i=2:n
    for j=1:i-1
        S(i,j)=A(i,j)-sum(S(i,1:j-1)*L(j,1:j-1)');
        L(i,1:i-1)=S(i,1:i-1)/D(1:i-1,1:i-1);
    end
    D(i,i) = A(i,i)-sum(S(i,1:i-1)*L(i,1:i-1)');
end
y = zeros(n,1);
x = zeros(n,1);
%% 由LDy=b求解y
for i = 1:n
    y(i) = (b(i)-sum(L(i,1:i-1)*D(1:i-1,1:i-1)*y(1:i-1)))/D(i,i);
end
%% 由L'x=y求解y
for i = n:-1:1
    x(i) = y(i)-sum(L(i+1:n,i)'*x(i+1:n));
end
结果如图:

在这里插入图片描述

2、构建n阶对角占优不可约的三对角矩阵

• 使用简化计算的LU分解求x

代码如下:
%% A*x = b ,A为n阶对称正定矩阵,求解x
 
clear all %初始化,清空变量
close all
clc %清空窗口命令
 
%% 生成方阵和向量
n=4;  %阶数
%n阶对角占优不可约的三对角矩阵
A=[2,2,0,0;
   1,3,-1,0;
   0,1,6,3;
   0,0,2,5];
 
d = rand(n,1);  %向量
 
%% 使用简化计算的LU分解求x
if ~isequal(tril(A,-1)-diag(diag(tril(A,-1),-1),-1),zeros(size(A)))
error('输入矩阵不是一个三角矩阵');
end
if ~isequal(triu(A,1)-diag(diag(triu(A,1),1),1),zeros(size(A)))
error('输入矩阵不是一个三角矩阵');
end
a=[0;diag(tril(A,-1),-1)];%下对角线
b=diag(A);%中对角线
c=[diag(triu(A,1),1);0];%上对角线
l=zeros(size(a,1),1);%求L
u=zeros(size(b,1),1);%求U
n=size(b,1);%矩阵的维度
x=zeros(n,1);
y=zeros(n,1);
u(1)=b(1);
for i=2:n
    l(i)=a(i)/u(i-1);
    u(i)=b(i)-l(i)*c(i-1);
end
y(1)=d(1);
for i=2:n
    y(i)=d(i)-l(i)*y(i-1);
end
x(n)=y(n)/u(n);
for i=n-1:-1:1
    x(i)=(y(i)-c(i)*x(i+1))/u(i);
end
 
fprintf('******追赶法求得x=\n');
disp(x);
%% 求矩阵A的条件数 
cond1 = cond(A,1);  %1-范数
cond2 = cond(A,2);  %2-范数
cond3 = cond(A,inf);  %∞-范数
fprintf('******矩阵A的条件数为:%d, %d, %d\n',cond1,cond2,cond3);
结果如图:

在这里插入图片描述

3、求以上矩阵的条件数

• 包括1-范数、2-范数和∞-范数的条件数

答:包含在上述代码中。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
课题一: 线性方程组的迭代法 一、实验内容 1、设线性方程组 = x = ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 ) 2、设对称正定阵系数阵线方程组 = x = ( 1, -1, 0, 2, 1, -1, 0, 2 ) 3、三对角形线性方程组 = x = ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 ) 试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。 实验要求 1、体会迭代法求解线性方程组,并能与消去法做以比较; 2、分别对不同精度要求,如 由迭代次数体会该迭代法的收敛快慢; 3、对方程组2,3使用SOR方法时,选取松弛因子 =0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者; 4、给出各种算法的设计程序和计算结果。 三、目的和意义 1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较; 2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序; 3、体会上机计算时,终止步骤 (予给的迭代次数),对迭代法敛散性的意义; 4、体会初始解 x ,松弛因子的选取,对计算结果的影响。 课题:数值积分 一、实验内容 选用复合梯形公式,复合Simpson公式,Romberg算法,计算 (1) I = (2) I = (3) I = (4) I = 实验要求 1、 编制数值积分算法的程序; 2、 分别用两种算法计算同一个积分,并比较其结果; 3、 分别取不同步长 ,试比较计算结果(如n = 10, 20等); 4、 给定精度要求 ,试用变步长算法,确定最佳步长。 三、目的和意义 1、 深刻认识数值积分法的意义; 2、 明确数值积分精度与步长的关系; 3、 根据定积分的计算方法,可以考虑重积分的计算问题。 四、流程图设计

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少年李富贵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值