北航数值分析第二次大作业 QR分解

发布 2022-09-25 19:37:28 阅读 6701

《数值分析a》

计算实习题目二。

2023年10月。

一、 算法设计方案。

整个程序主要分为四个函数,主函数,拟上三角化函数,qr分解函数以及使用双步位移求解矩阵特征值、特征向量的函数。因为在最后一个函数中也存在qr分解,所以我没有采用参考书上把矩阵m进行的qr分解与矩阵ak的迭代合并的方法,而是在该函数中调用了qr分解函数,这样增强了**的复用性,减少了程序长度;但由于时间关系,对阵中方法的运算速度没有进行深入研究。

1.为了减少qr分解法应用时的迭代次数,首先对给定矩阵进行拟上三角化处理。

2.对经过拟上三角化处理的矩阵进行qr分解。

3.注意到计算特征值与特征向量的过程首先要应用前面两个函数,于是在拟上三角化矩阵的基础上对qr分解函数进行了调用。计算过程中,没有采用goto语句,而是根据流程图采用其他循环方式完成了设计,通过对迭代过程的合并,简化了程序的循环次数,最后在计算特征向量的时候采用了列主元高斯消去法。

二、源程序**。

#include<>

#include<>

#include<>

inti,j,k,l,m定义外部变量。

double d,h,b,c,t,s;

double a[10][10],aa[10][10],r[10][10],q[10][10],rq[10][10];

double x[10][10],y[10][10],qt[10][10],m[10][10];

double u[10],p[10],t[10],w[10],re[10]=,im[10]=;

double epsilon=1e-12;

void main()

voidquasiuppertriangular(double a[10]);

voidqrdecomposition(double a[10]);

voiddoublestepsqr(double a[10]);

inti,j;

for(i=0;i<10;i++)

a[i][i]=1.5*cos(2.2*(i+1));

aa[i][i]=a[i][i];

quasiuppertriangular(a调用拟上三角化函数

printf( "n a经过拟上三角化矩阵为:");

for(i=0;i<10;i输出拟上三角化矩阵。

qrdecomposition(a调用qr分解函数。

printf( "进行qr分解后,r矩阵为:");输出r矩阵。

for(i=0;i<10;i

printf( "q矩阵为:输出q矩阵。

for(i=0;i<10;i

printf( "rq矩阵为:输出rq矩阵。

for(i=0;i<10;i

doublestepsqr(a调用双步位移函数。

printf( "n 特征值实部依次为:");输出特征值实部。

for(j=0;j<10;j

printf("%12e ",re[j]);

printf(" 特征值虚部依次为:输出特征值虚部。

for(j=0;j<10;j

printf("%12e ",im[j]);

/按行输出特征向量。

printf( "n 按行输出实特征根相应特征向量为:

for(i=0;i<10;i

if(i==1||i==2||i==5||i==6)

continue;

for(j=0;j<10;j++)

printf("%12e ",x[i][j]);

printf("");

getchar();

/拟上三角化函数。

voidquasiuppertriangular(double a[10])

for(j=0;j<8;j++)

m=0;for(i=j+2;i<10;i++)

if(a[i][j]!=0)

m=m+1;

if(m==0)

d=0;for(i=j+1;i<10;i++)

d=sqrt(d);

c=-d;if(a[j+1][j]<=0)

h=c*(c-a[j+1][j]);

u[j+1]=a[j+1][j]-c;

for(i=j+2;i<10;i++)

for(i=0;i<10;i++)

for(k=0;k<10;k++)

p[i]=p[i]+u[k]*a[k][i];

p[i]=p[i]/h;

t=0;for(i=0;i<10;i++)

for(k=0;k<10;k++)

t[i]=t[i]+u[k]*a[i][k];

t[i]=t[i]/h;

t=t+p[i]*u[i];

t=t/h;

for(i=0;i<10;i++)

w[i]=t[i]-t*u[i];

for(k=0;k<10;k++)

a[i][k]=a[i][k]-w[i]*u[k]-u[i]*p[k];

if(abs(a[i][k])<1e-12)

a[i][k]=0;

/qr分解函数。

voidqrdecomposition(double a[10])

for(i=0;i<10;i++)

for(j=0;j<9;j++)

m=0;for(i=j+1;i<10;i++)

if(r[i][j]!=0)

m=m+1;

if(m==0)

d=0;for(i=j;i<10;i++)

d=sqrt(d);

c=-d;if(r[j][j]<=0)

h=c*(c-r[j][j]);

u[j]=r[j][j]-c;

for(i=j+1;i<10;i++)

for(i=0;i<10;i++)

for(k=0;k<10;k++)

w[i]=w[i]+u[k]*q[i][k];

for(i=0;i<10;i++)

for(k=0;k<10;k++)

q[i][k]=q[i][k]-(w[i]*u[k])/h);

for(i=0;i<10;i++)

for(k=0;k<10;k++)

p[i]=p[i]+u[k]*r[k][i];

p[i]=p[i]/h;

for(i=0;i<10;i++)

for(k=0;k<10;k++)

r[i][k]=r[i][k]-u[i]*p[k];

if(abs(r[i][k])

r[i][k]=0;

for(i=0;i<10;i计算a(n+1)=rq

for(j=0;j<10;j++)

for(k=0;k<10;k++)

rq[i][j]=rq[i][j]+r[i][k]*q[k][j];

/双步位移法计算特征值特征向量函数

voiddoublestepsqr(double a[10])

int l=1000,m=9定义最大循环次数。

for(i=0;i {

for(;m>-1;)

if(abs(a[m][m-1])

re[m]=a[m][m];

m=m-1降阶。

if(m==04

re[0]=a[0][0];

break;

if(m==-1)

break;

if(m>1)

continue;

b=-a[m][m]-a[m-1][m-15

c=a[m][m]*a[m-1][m-1]-a[m][m-1]*a[m-1][m];

北航数值分析第二次大作业

题目 使用带双步位移的qr分解法求矩阵的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知 i,j 1,2,10 一 算法的设计方案 一 总体方案设计 构造矩阵 a,先利用householder矩阵对矩阵a作相似变换,把a化为拟上三角矩阵a n 1 然后进行带双步位移的qr分解求解矩阵的全部...

北航数值分析大作业第二次

数值分析 计算实习作业。第二题 算法设计方案 1 对矩阵a赋值,取计算精度 1 10 12 2 对矩阵a进行拟上三角化,得到a n 1 并输出a n 1 对矩阵a的拟上三角化,通过直接调用子函数inftrianglize a 来实现 拟上三角化得到的矩阵a n 1 输出至文件中。3 对a n 1 进...

第二次大作业

一 填空题。是指人们关于基本价值的立场 取向 态度 信念 理想系统。是指一种哲学思想或道德标准,用来辨别行为的善与恶,即这会关系中判断行为的一种道德标准。是指风俗习惯及社会传统,它是调节和约束人们行为的一种社会规范。社会工作伦理困境是指由于社会工作者所秉承的 之间的不一致而产生的困顿局面。社会工作专...