数值作业1Word文档格式.docx
《数值作业1Word文档格式.docx》由会员分享,可在线阅读,更多相关《数值作业1Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
ck-j+s+1,j:
=ck-j+s+1,j-
ck-t+s+1,jct-j+s+1,j
[j=k,k+1,…min(k+s,n)]
Ci-k+s+1,k:
=(ci-k+s+1,k-
ci-t+s+1,tct-k+s+1,k)/cs+1,k
[i=k+1,k+2,…min(k+r,n);
k<
n]
(2)求解Lx=y,Uuk=x(数组y先是存放原方程组右端的向量,后来存放中间变量,最后求解新的迭代向量uk)
yi:
=yi-
ci-t+s+1,tyt
[i=2,3,…,n]
un:
=yn/cs+1,n
un:
=(yi-
ci-t+s+1,tut)/cs+1,i
[i=n-1,n-2,…1]
六.算法说明:
1.选择不同的初始向量会得到不同的特征值,这是因为收敛速度的不同引起的.通过选择几组不同的初始向量比较后,发现当初始向量按照程序中的取值时比较合理,得到的特征值较为精确.
2.利用矩阵U所有主元素乘积求detA,cond(A)
可有公式cond(A)
=
求得。
,
分别利用幂法和反幂法求的。
#include<
stdio.h>
stdlib.h>
math.h>
intMax(inta,intb,intc);
intMin(inta,intb);
doublea[501],C[5][501];
/*声明全局变量*/
/******************************************/
/*函数:
power*/
/*功能:
幂法按模最大求特征值*/
/*说明:
p是矩阵运算是需要平移的量*/
doublepower(doublep)
{
intm,k,t,n;
doubledPreVal,dVal;
doubley[501],u[501],s=0,b=0.16,c=-0.064,sum;
dPreVal=0.0;
dVal=0.0;
t=0;
/*********初始化u[n]*******/
for(n=0;
n<
501;
n++)
u[n]=1;
while(t<
2||fabs(dVal-dPreVal)/fabs(dVal)>
=1e-12)/*迭代循环*/
{sum=0;
dPreVal=dVal;
for(k=0;
k++)/*求模*/
{
sum+=u[k]*u[k];
}
/**********计算迭代向量Y*********/
k++)
{
y[k]=u[k]/sqrt(sum);
/*******矩阵与迭代向量相乘***********/
/*******求出新的迭代向量***********/
for(m=0;
m<
m++)
if(m==0)
{
s=(a[m]-p)*y[0]+b*y[1]+c*y[2];
}
elseif(m==1)
s=b*y[0]+(a[m]-p)*y[1]+b*y[2]+c*y[3];
}
elseif(m==499)
s=c*y[497]+b*y[498]+(a[m]-p)*y[499]+b*y[500];
elseif(m==500)
s=c*y[498]+b*y[499]+(a[m]-p)*y[500];
elseif(m!
=0&
&
m!
=1&
=499&
=500)
s=c*y[m-2]+b*y[m-1]+(a[m]-p)*y[m]+b*y[m+1]+c*y[m+2];
u[m]=s;
dVal=dVal+u[m]*y[m];
t++;
returndVal;
}
Max*/
求三个数的最大值*/
intMax(inta,intb,intc)
{
intmax;
max=a;
if(b>
max)max=b;
if(c>
max)max=c;
returnmax;
Min*/
求两个数的最小值*/
intMin(inta,intb)
if(a<
b)returna;
elsereturnb;
revpower*/
反幂法按模最小求特征值*/
doublerevpower()
Intk,t,n,m,x;
doubledPreVal,dVal;
doubley[501],u[501],v[501],s,sum;
/********初始化迭代向量u[n]**********/
/*************迭代循环(根据精度要求选择适当的迭代次数)********/
while(t<
2||fabs(1.0/dVal-1.0/dPreVal)/fabs(1.0/dVal)>
=1e-12)
sum+=u[k]*u[k];
/***********计算迭代向量Y**************/
y[k]=u[k]/sqrt(sum);
v[k]=y[k];
/**********根据Doolittle分解来求解方程组得到新的迭代向量*********/
for(k=2;
=501;
s=0;
m=Max(1,1,k-2);
for(x=m;
x<
=k-1;
x++)
s=s+C[k-x+2][x-1]*y[x-1];
y[k-1]=y[k-1]-s;
u[500]=y[500]/C[2][500];
for(k=500;
k>
0;
k--)
m=Min(k+2,501);
for(x=k+1;
=m;
s=s+C[k-x+2][x-1]*u[x-1];
u[k-1]=(y[k-1]-s)/C[2][k-1];
k<
k++)
dVal=dVal+v[k]*u[k];
t++;
return1.0/dVal;
SAVE*/
存储矩阵A带内元素,不存非零元素*/
voidSave(doublep)
inti,j;
doubleb=0.16,c=-0.064;
for(i=0;
i<
5;
i++)
for(j=0;
j<
j++)
if(i==0||i==4)
if((i==0&
j<
=1)||(i==4&
j>
=498))C[i][j]=0;
elseC[i][j]=c;
elseif(i==1||i==3)
if((i==1&
j==0)||(i==3&
j==500))C[i][j]=0;
elseC[i][j]=b;
elseif(i==2)
{
C[i][j]=a[j]-p;
Doolittle*/
Doolittle分解矩阵A带内元素*/
voidDoolittle()
ints,t,x,k,j,i;
doublesum;
for(k=1;
s=Min(k+2,501);
for(j=k;
=s;
j++)
t=Max(1,k-2,j-2);
sum=0.0;