数值分析大作业1

合集下载

北航数值分析大作业 第一题 幂法与反幂法

北航数值分析大作业 第一题 幂法与反幂法

数 值 分 析(B ) 大 作 业(一)姓名: 学号: 电话:1、算法设计:①求1λ、501λ和s λ的值:s λ:s λ表示矩阵的按模最小特征值,为求得s λ直接对待求矩阵A 应用反幂法即可。

1λ、501λ:若矩阵A 的特征值满足关系 1n λλ<<且1n λλ≠,要求1λ、及501λ时,可按如下方法求解: a . 对矩阵A 用幂法,求得按模最大的特征值1m λ。

b . 按平移量1m λ对矩阵A 进行原点平移得矩阵1m BA I λ=+,对矩阵B 用反幂法求得B 的按模最小特征值2m λ。

c . 321m m m λλλ=-则:113min(,)m m λλλ=,13max(,)n m m λλλ=即为所求。

②求和A 的与数5011140k k λλμλ-=+最接近的特征值ik λ(k=0,1,…39):求矩阵A 的特征值中与P 最接近的特征值的大小,采用原点平移的方法:先求矩阵 B=A-PI 对应的按模最小特征值k β,则k β+P 即为矩阵A 与P 最接近的特征值。

在本次计算实习中则是先求平移矩阵k B A I μ=-,对该矩阵应用反幂法求得s λ,则与k μ最接近的A 的特征值为:s P λ+重复以上过程39次即可求得ik λ(k=0,1,…39)的值。

③求A 的(谱范数)条件数2cond()A 和行列式det A :在(1)中用反幂法求矩阵A 的按模最小特征值时,要用到Doolittle 分解方法,在Doolittle 分解完成后得到的两个矩阵分别为L 和U ,则A 的行列式可由U 阵求出,即:det(A)=det(U)。

求得det(A)不为0,因此A 为非奇异的实对称矩阵,则: max 2()scond A λλ=,max λ和s λ分别为模最大特征值与模最小特征值。

2、程序源代码:#include "Stdio.h"#include "Conio.h"#include "math.h"//****************************************************************************// // 在存储带状矩阵时,下面的几个量在程序中反复用到,为方便编程故把它们定义成宏.// // M :转换后的矩阵的行数,M=R+S+1。

北航数值分析报告大作业一

北航数值分析报告大作业一

北京航空航天大学数值分析大作业一学院名称自动化专业方向控制工程学号 ZY1403140学生许阳教师玉泉日期 2014 年 11月26 日设有501501⨯的实对称矩阵A ,⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=5011A a b c b c c b c b a其中,064.0,16.0),501,,2,1(64.0)2.0sin()024.064.1(1.0-==⋅⋅⋅=--=c b i e i i a ii 。

矩阵A 的特征值为)501,,2,1(⋅⋅⋅=i i λ,并且有||min ||,501150121i i s λλλλλ≤≤=≤⋅⋅⋅≤≤1.求1λ,501λ和s λ的值。

2.求A 的与数4015011λλλμ-+=kk 最接近的特征值)39,,2,1(⋅⋅⋅=k k i λ。

3.求A 的(谱数)条件数2)A (cond 和行列式detA 。

一 方案设计1 求1λ,501λ和s λ的值。

s λ为按模最小特征值,||min ||5011i i s λλ≤≤=。

可使用反幂法求得。

1λ,501λ分别为最大特征值及最小特征值。

可使用幂法求出按模最大特征值,如结果为正,即为501λ,结果为负,则为1λ。

使用位移的方式求得另一特征值即可。

2 求A 的与数4015011λλλμ-+=kk 最接近的特征值)39,...,2,1(=k k i λ。

题目可看成求以k μ为偏移量后,按模最小的特征值。

即以k μ为偏移量做位移,使用反幂法求出按模最小特征值后,加上k μ,即为所求。

3 求A 的(谱数)条件数2)(A cond 和行列式detA 。

矩阵A 为非奇异对称矩阵,可知,||)(min max2λλ=A cond(1-1)其中m ax λ为按模最大特征值,min λ为按模最小特征值。

detA 可由LU 分解得到。

因LU 均为三角阵,则其主对角线乘积即为A 的行列式。

二 算法实现1 幂法使用如下迭代格式:⎪⎪⎩⎪⎪⎨⎧⋅===⋅⋅⋅=------||max |)|sgn(max ||max /),,(111111)0()0(10k k k k k k k k Tn u u Ay u u u y u u u β任取非零向量 (2-1)终止迭代的控制理论使用εβββ≤--||/||1k k k , 实际使用εβββ≤--||/||||||1k k k(2-2)由于不保存A 矩阵中的零元素,只保存主对角元素a[501]及b,c 值。

数值分析大作业一

数值分析大作业一

数值分析大作业一一、算法设计方案1、求λ1和λ501的值:思路:采用幂法求出按模最大特征值λmax,该值必为λ1或λ501,若λmax小于0,则λmax=λ1;否则λmax=λ501。

再经过原点平移,使用幂法迭代出矩阵A-λmax I的特征值,此时求出的按模最大特征值即为λ1和λ501的另一个值。

2、求λs的值:采用反幂法求出按模最小的特征值λmin即为λs,其中的方程组采用LU分解法进行求解。

3、求与μk最接近的特征值:对矩阵A采用带原点平移的反幂法求解最小特征值,其中平移量为:μk。

4、A的条件数cond(A)=| λmax/λmin|;5、A的行列式的值:先将A进行LU分解,再求U矩阵对角元素的乘积即为A 行列式的值。

二、源程序#include<iostream>#include<iomanip>#include<math.h>#define N 501#define E 1.0e-12 //定义精度常量#define r 2#define s 2using namespace std;double a[N];double cc[5][N];void init();double mifa();double fmifa();int max(int aa,int bb);int min(int aa,int bb);int max_3(int aa,int bb,int cc);void LU();void main(){double a1,a2,d1,d501=0,ds,det=1,miu[39],lamta,cond;int i,k;init();/*************求λ1和λ501********************/a1=mifa();if(a1<0)d1=a1; //若小于0则表示λ1的值elsed501=a1; //若大于0则表示λ501的值for(i=0;i<N;i++)a[i]=a[i]-a1;a2=mifa()+a1;if(a2<0)d1=a2; //若小于0则表示λ1的值elsed501=a2; //若大于0则表示λ501的值cout<<"λ1="<<setiosflags(ios::scientific)<<setprecision(12)<<d1<<"\t";cout<<"λ501="<<setiosflags(ios::scientific)<<setprecision(12)<<d501<<endl;/**************求λs*****************/init();ds=fmifa();cout<<"λs="<<setiosflags(ios::scientific)<<setprecision(12)<<ds<<endl;/**************求与μk最接近的特征值λik**************/cout<<"与μk最接近的特征值λik:"<<endl;for(k=0;k<39;k++){miu[k]=d1+(k+1)*(d501-d1)/40;init();for(i=0;i<N;i++)a[i]=a[i]-miu[k];lamta=fmifa()+miu[k];cout<<"λi"<<k+1<<"\t\t"<<setiosflags(ios::scientific)<<setprecision(12)<<lamta<<en dl;}/**************求A的条件数**************/cout<<"矩阵A的条件式";cond=abs(max(abs(d1),abs(d501))/ds);cout<<"cond="<<setiosflags(ios::scientific)<<setprecision(12)<<cond<<endl;/**************求A的行列式**************/cout<<"矩阵A的行列式";init();LU();for(i=0;i<N;i++){det*=cc[2][i];}cout<<"det="<<setiosflags(ios::scientific)<<setprecision(12)<<det<<endl;system("pause");}/**************初始化函数,给a[N]赋值*************/void init(){int i;for(i=1;i<=501;i++)a[i-1]=(1.64-0.024*i)*sin((double)(0.2*i))-0.64*exp((double)(0.1/i)); }/**************幂法求最大绝对特征值**************/double mifa(){int i,k=0;double u[N],y[N]={0},b=0.16,c=-0.064,Beta_=0,error;for(i=0;i<501;i++)u[i]=1; //令u[N]=1for(k=1;k<2000;k++) //控制最大迭代次数为2000{/***求y(k-1)***/double sum_u=0,gh_sum_u;for(i=0;i<N;i++){sum_u+=u[i]*u[i]; }gh_sum_u=sqrt(sum_u);for(i=0;i<N;i++){y[i]=u[i]/gh_sum_u;}/****求新的uk****/u[0]=a[0]*y[0]+b*y[1]+c*y[2];u[1]=b*y[0]+a[1]*y[1]+b*y[2]+c*y[3]; //前两列和最后两列单独拿出来求中D间的循环求for(i=2;i<N-2;i++){u[i]=c*y[i-2]+b*y[i-1]+a[i]*y[i]+b*y[i+1]+c*y[i+2];}u[N-2]=c*y[N-4]+b*y[N-3]+a[N-2]*y[N-2]+b*y[N-1];u[N-1]=c*y[N-3]+b*y[N-2]+a[N-1]*y[N-1];/***求beta***/double Beta=0;for(i=0;i<N;i++){Beta+=y[i]*u[i];}//cout<<"Beta"<<k<<"="<<Beta<<"\t"; 输出每次迭代的beta /***求误差***/error=abs(Beta-Beta_)/abs(Beta);if(error<=E) //若迭代误差在精度水平内则可以停止迭代{return Beta;} //控制显示位数Beta_=Beta; //第个eta的值都要保存下来,为了与后个值进行误差计算 }if(k==2000){cout<<"error"<<endl;return 0;} //若在最大迭代次数范围内都不能满足精度要求说明不收敛}/**************反幂法求最小绝对特¬征值**************/double fmifa(){int i,k,t;double u[N],y[N]={0},yy[N]={0},b=0.16,c=-0.064,Beta_=0,error;for(i=0;i<501;i++)u[i]=1; //令u[N]=1for(k=1;k<2000;k++){double sum_u=0,gh_sum_u;for(i=0;i<N;i++){sum_u+=u[i]*u[i]; }gh_sum_u=sqrt(sum_u);for(i=0;i<N;i++){y[i]=u[i]/gh_sum_u;yy[i]=y[i]; //用重新赋值,避免求解方程组的时候改变y的值}/****LU分解法解方程组Au=y,求新的***/LU();for(i=2;i<=N;i++){double temp_b=0;for(t=max(1,i-r);t<=i-1;t++)temp_b+=cc[i-t+s][t-1]*yy[t-1];yy[i-1]=yy[i-1]-temp_b;}u[N-1]=yy[N-1]/cc[s][N-1];for(i=N-1;i>=1;i--){double temp_u=0;for(t=i+1;t<=min(i+s,N);t++)temp_u+=cc[i-t+s][t-1]*u[t-1];u[i-1]=(yy[i-1]-temp_u)/cc[s][i-1];}double Beta=0;for(i=0;i<N;i++){Beta+=y[i]*u[i];}error=abs(Beta-Beta_)/abs(Beta);if(error<=E){return (1/Beta);}Beta_=Beta;}if(k==2000){cout<<"error"<<endl;return 0;} }/**************求两数最大值的子程序**************/int max(int aa,int bb){return(aa>bb?aa:bb);}/**************求两数最小值的子程序**************/int min(int aa,int bb){return(aa<bb?aa:bb);}/**************求三数最大值的子程序**************/int max_3(int aa,int bb,int cc){ int tt;if(aa>bb)tt=aa;else tt=bb;if(tt<cc) tt=cc;return(tt);}/**************LU分解**************/void LU(){int i,j,k,t;double b=0.16,c=-0.064;/**赋值压缩后矩阵cc[5][501]**/for(i=2;i<N;i++)cc[0][i]=c;for(i=1;i<N;i++)cc[1][i]=b;for(i=0;i<N;i++)cc[2][i]=a[i];for(i=0;i<N-1;i++)cc[3][i]=b;for(i=0;i<N-2;i++)cc[4][i]=c;for(k=1;k<=N;k++){for(j=k;j<=min(k+s,N);j++){double temp=0;for(t=max_3(1,k-r,j-s);t<=k-1;t++)temp+=cc[k-t+s][t-1]*cc[t-j+s][j-1];cc[k-j+s][j-1]=cc[k-j+s][j-1]-temp;}//if(k<500){for(i=k+1;i<=min(k+r,N);i++){double temp2=0;for(t=max_3(1,i-r,k-s);t<=k-1;t++)temp2+=cc[i-t+s][t-1]*cc[t-k+s][k-1];cc[i-k+s][k-1]=(cc[i-k+s][k-1]-temp2)/cc[s][k-1];}}}}三、程序结果。

数值分析大作业

数值分析大作业

数值分析上机作业(一)一、算法的设计方案1、幂法求解λ1、λ501幂法主要用于计算矩阵的按模最大的特征值和相应的特征向量,即对于|λ1|≥|λ2|≥.....≥|λn|可以采用幂法直接求出λ1,但在本题中λ1≤λ2≤……≤λ501,我们无法判断按模最大的特征值。

但是由矩阵A的特征值条件可知|λ1|和|λ501|之间必然有一个是最大的,通过对矩阵A使用幂法迭代一定次数后得到满足精度ε=10−12的特征值λ0,然后在对矩阵A做如下的平移:B=A-λ0I由线性代数(A-PI)x=(λ-p)x可得矩阵B的特征值为:λ1-λ0、λ2-λ0…….λ501-λ0。

对B矩阵采用幂法求出B矩阵按模最大的特征值为λ∗=λ501-λ0,所以λ501=λ∗+λ0,比较λ0与λ501的大小,若λ0>λ501则λ1=λ501,λ501=λ0;若λ0<λ501,则令t=λ501,λ1=λ0,λ501=t。

求矩阵M按模最大的特征值λ的具体算法如下:任取非零向量u0∈R nηk−1=u T(k−1)∗u k−1y k−1=u k−1ηk−1u k=Ay k−1βk=y Tk−1u k(k=1,2,3……)当|βk−βk−1||βk|≤ε=10−12时,迭终终止,并且令λ1=βk2、反幂法计算λs和λik由已知条件可知λs是矩阵A 按模最小的特征值,可以应用反幂法直接求解出λs。

使用带偏移量的反幂法求解λik,其中偏移量为μk=λ1+kλ501−λ140(k=1,2,3…39),构造矩阵C=A-μk I,矩阵C的特征值为λik−μk,对矩阵C使用反幂法求得按模最小特征值λ0,则有λik=1λ0+μk。

求解矩阵M按模最小特征值的具体算法如下:任取非零向量u 0∈R n ηk−1= u T (k−1)∗u k−1y k−1=u k−1ηk−1 Au k =y k−1βk =y T k−1u k (k=1,2,3……)在反幂法中每一次迭代都要求解线性方程组Au k =y k−1,当K 足够大时,取λn =1βk 。

北航数值分析大作业第一题幂法与反幂法

北航数值分析大作业第一题幂法与反幂法

《数值分析》计算实习题目第一题:1. 算法设计方案(1)1λ,501λ和s λ的值。

1)首先通过幂法求出按模最大的特征值λt1,然后根据λt1进行原点平移求出另一特征值λt2,比较两值大小,数值小的为所求最小特征值λ1,数值大的为是所求最大特征值λ501。

2)使用反幂法求λs ,其中需要解线性方程组。

因为A 为带状线性方程组,此处采用LU 分解法解带状方程组。

(2)与140k λλμλ-5011=+k 最接近的特征值λik 。

通过带有原点平移的反幂法求出与数k μ最接近的特征值 λik 。

(3)2cond(A)和det A 。

1)1=nλλ2cond(A),其中1λ和n λ分别是按模最大和最小特征值。

2)利用步骤(1)中分解矩阵A 得出的LU 矩阵,L 为单位下三角阵,U 为上三角阵,其中U 矩阵的主对角线元素之积即为det A 。

由于A 的元素零元素较多,为节省储存量,将A 的元素存为6×501的数组中,程序中采用get_an_element()函数来从小数组中取出A 中的元素。

2.全部源程序#include <stdio.h>#include <math.h>void init_a();//初始化Adouble get_an_element(int,int);//取A 中的元素函数double powermethod(double);//原点平移的幂法double inversepowermethod(double);//原点平移的反幂法int presolve(double);//三角LU 分解int solve(double [],double []);//解方程组int max(int,int);int min(int,int);double (*u)[502]=new double[502][502];//上三角U 数组double (*l)[502]=new double[502][502];//单位下三角L 数组double a[6][502];//矩阵Aint main(){int i,k;double lambdat1,lambdat2,lambda1,lambda501,lambdas,mu[40],det;init_a();//初始化Alambdat1=powermethod(0);lambdat2=powermethod(lambdat1);lambda1=lambdat1<lambdat2?lambdat1:lambdat2;lambda501=lambdat1>lambdat2?lambdat1:lambdat2;presolve(0);lambdas=inversepowermethod(0);det=1;for(i=1;i<=501;i++)det=det*u[i][i];for (k=1;k<=39;k++){mu[k]=lambda1+k*(lambda501-lambda1)/40;presolve(mu[k]);lambda[k]=inversepowermethod(mu[k]);}printf("------------所有特征值如下------------\n");printf("λ=%1.11e λ=%1.11e\n",lambda1,lambda501);printf("λs=%1.11e\n",lambdas);printf("cond(A)=%1.11e\n",fabs(lambdat1/lambdas));printf("detA=%1.11e \n",det);for (k=1;k<=39;k++){printf("λi%d=%1.11e ",k,lambda[k]);if(k % 3==0) printf("\n");} delete []u;delete []l;//释放堆内存return 0;}void init_a()//初始化A{int i;for (i=3;i<=501;i++) a[1][i]=a[5][502-i]=-0.064;for (i=2;i<=501;i++) a[2][i]=a[4][502-i]=0.16;for (i=1;i<=501;i++) a[3][i]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i); }double get_an_element(int i,int j)//从A中节省存储量的提取元素方法{if (fabs(i-j)<=2) return a[i-j+3][j];else return 0;}double powermethod(double offset)//幂法{int i,x1;double beta=0,prebeta=-1000,yita=0;for (i=1;i<=501;i++)u[i]=1,y[i]=0;//设置初始向量u[]for (int k=1;k<=10000;k++){yita=0;for (i=1;i<=501;i++) yita=sqrt(yita*yita+u[i]*u[i]);for (i=1;i<=501;i++) y[i]=u[i]/yita;for (x1=1;x1<=501;x1++){u[x1]=0;for (int x2=1;x2<=501;x2++)u[x1]=u[x1]+((x1==x2)?(get_an_element(x1,x2)-offset):get_an_element(x1,x2))*y[x2];} prebeta=beta;beta=0;for (i=1;i<=501;i++) beta=beta+ y[i]*u[i];if (fabs((prebeta-beta)/beta)<=1e-12) {printf("offset=%f lambda=%f err=%e k=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};//输出中间过程,包括偏移量,误差,迭代次数}return (beta+offset);}double inversepowermethod(double offset)//反幂法{int i;double u[502],y[502];double beta=0,prebeta=0,yita=0;for (i=1;i<=501;i++)u[i]=1,y[i]=0; //设置初始向量u[]for (int k=1;k<=10000;k++){yita=0;for (i=1;i<=501;i++) yita=sqrt(yita*yita+u[i]*u[i]);for (i=1;i<=501;i++) y[i]=u[i]/yita;solve(u,y);prebeta=beta;beta=0;for (i=1;i<=501;i++) beta=beta+ y[i]*u[i];beta=1/beta;if (fabs((prebeta-beta)/beta)<=1e-12) {printf("offset=%f lambda=%f err=%e k=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};//输出中间过程,包括偏移量,误差,迭代次数}return (beta+offset);}int presolve(double offset)//三角LU分解{int i,k,j,t;double sum;for (k=1;k<=501;k++)for (j=1;j<=501;j++){u[k][j]=l[k][j]=0;if (k==j) l[k][j]=1;} //初始化LU矩阵for (k=1;k<=501;k++){for (j=k;j<=min(k+2,501);j++){sum=0;for (t=max(1,max(k-2,j-2)) ; t<=(k-1) ; t++)sum=sum+l[k][t]*u[t][j];u[k][j]=((k==j)?(get_an_element(k,j)-offset):get_an_element(k,j))-sum;}if (k==501) continue;for (i=k+1;i<=min(k+2,501);i++){sum=0;for (t=max(1,max(i-2,k-2));t<=(k-1);t++)sum=sum+l[i][t]*u[t][k];l[i][k]=(((i==k)?(get_an_element(i,k)-offset):get_an_element(i,k))-sum)/u[k][k];}}return 0;}int solve(double x[],double b[])//解方程组{int i,t;double y[502];double sum;y[1]=b[1];for (i=2;i<=501;i++){sum=0;for (t=max(1,i-2);t<=i-1;t++)sum=sum+l[i][t]*y[t];y[i]=b[i]-sum;}x[501]=y[501]/u[501][501];for (i=500;i>=1;i--){sum=0;for (t=i+1;t<=min(i+2,501);t++)sum=sum+u[i][t]*x[t];x[i]=(y[i]-sum)/u[i][i];}return 0;}int max(int x,int y){return (x>y?x:y);}int min(int x,int y){return (x<y?x:y);}3.计算结果结果如下图所示:部分中间结果:给出了偏移量(offset),误差(err),迭代次数(k)4.讨论迭代初始向量的选取对计算结果的影响,并说明原因使用u[i]=1(i=1,2,...,501)作为初始向量进行迭代,可得出以上结果。

西南交大数值分析第一次大作业答案

西南交大数值分析第一次大作业答案

数值分析大作业1、证明:1-x-sinx=0在[0,1]内有一个根,使用二分法求误差不大于0.5*10^-4的根要迭代多少次,并输出每一步的迭代解和迭代误差证明:令f(x)= 1-x-sinx;f(0)=1,f(1)=-sin1f(0)*f(1)<0f’(x)=1-cosx<0在[0,1]内恒成立所以1-x-sinx=0在[0,1]内恒有一个根程序:function chap2bisecta = 0;b = 1;fprintf('n || a || b || c || r \n')for k=1:15c = (a+b)/2;r=(b-a)/2;fa =1-a-sin(a);fb =1-b-sin(b);fc =1-c-sin(c);fprintf('%d || %f || %f || %f \n',k,a,b,c,r);if abs(fc)<0.5*10^(-4) r=c; sprintf('the root is: %d' , r);elseif fa*fc<0 b=c;elseif fb*fc<0 a=c;endendroot = (a+b)/2结果:n || a || b || c || r1 || 0.000000 || 1.000000 || 0.500000 ||5.000000e-001 ||2 || 0.500000 || 1.000000 || 0.750000 ||2.500000e-001 ||3 || 0.500000 || 0.750000 || 0.625000 ||1.250000e-001 ||4 || 0.500000 || 0.625000 || 0.562500 ||6.250000e-002 ||125 || 0.500000 || 0.562500 || 0.531250 ||3.125000e-002 ||6 || 0.500000 || 0.531250 || 0.515625 ||1.562500e-002 ||7 || 0.500000 || 0.515625 || 0.507813 ||7.812500e-003 ||8 || 0.507813 || 0.515625 || 0.511719 ||3.906250e-003 || 9 || 0.507813 || 0.511719 || 0.509766 ||1.953125e-003 || 10 || 0.509766 || 0.511719 || 0.510742 ||9.765625e-004 || 11 || 0.510742 || 0.511719 || 0.511230 ||4.882813e-004 || 12 || 0.510742 || 0.511230 || 0.510986 ||2.441406e-004 || 13 || 0.510742 || 0.511230 || 0.510986 ||2.441406e-004 || 14 || 0.510742 || 0.511230 || 0.510986 ||2.441406e-004 || 15 || 0.510742 || 0.511230 || 0.510986 ||2.441406e-004 || root =0.510986328125000。

数值分析大作业课题一

数值分析大作业课题一

迭代格式的比较1、自定义函数:function y=fun1(x)y=(3*x+1)/x^2;主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun1(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=1Please input the number of iterations:k=5x=1.000000x=4.000000x=0.812500x=5.207101x=0.613018x=7.554877结论:发散2、自定义函数:function y=fun2(x)y=(x^3-1)/3;主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun2(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=1Please input the number of iterations:k=8x=1.000000x=0.000000x=-0.333333x=-0.345679x=-0.347102x=-0.347273x=-0.347294x=-0.347296x=-0.347296结论:收敛3、自定义函数:function y=fun3(x)y=(3*x+1)^(1/3);主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun3(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=1Please input the number of iterations:k=11x=1.000000x=1.587401x=1.792790x=1.854542x=1.872325x=1.877384x=1.878819x=1.879225x=1.879340x=1.879372x=1.879382x=1.879384结论:收敛4、自定义函数:function y=fun4(x)y=1/(x^2-3);主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun4(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=1Please input the number of iterations:k=9x=1.000000x=-0.500000x=-0.363636x=-0.348703x=-0.347414x=-0.347306x=-0.347297x=-0.347296x=-0.347296x=-0.347296结论:收敛5、自定义函数:function y=fun5(x)y=sqrt(3+1/x);主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun5(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=1Please input the number of iterations:k=6x=1.000000x=2.000000x=1.870829x=1.880033x=1.879336x=1.879389x=1.879385结论:收敛6、自定义函数:function y=fun6(x)y=x-1/3*((x^3-3*x-1)/(x^2-1));主程序:x0=input('Please input the initial value£ºx0=');k=input('Please input the number of iterations£ºk='); x(1)=x0;i=1;while i<=kx(i+1)=fun6(x(i));i=i+1;xk=x(i);endfprintf(' x=%f\n',x);运行结果:Please input the initial value:x0=3Please input the number of iterations:k=6x=3.000000x=2.291667x=1.965507x=1.884402x=1.879404x=1.879385x=1.879385结论:收敛要求2,输出迭代次数:自定义函数:interation.m%x0为初始值,k为最大迭代次数,e为控制精度function interation(x0,k,e)x(1)=x0;i=1;while i<=kx(i+1)=fun6(x(i));if abs(x(i+1)-x(i))<efprintf(' the number of iterations: n=%f\n',i);breakendi=i+1;endx=x(i);fprintf(' a root of the original equation: x=%8.6f\n',x);取形式6为例,运行结果:>>interation(5,24,0.00001)the number of iterations: n=7.000000a root of the original equation: x=1.879385。

数值分析作业题(1)

数值分析作业题(1)

第一章 误差与算法1. 误差分为有__模型误差___, _观测误差___, __方法误差____, ___舍入误差____, Taylor 展开式近似表达函数产生的误差是_方法误差 .2. 插值余项是插值多项式的 方法误差。

0.2499作为1/4的近似值, 有几位有效数字?00.24990.249910,0m =⨯=即,031|0.2499|0.00010.5100.510,34m n n ---=<⨯=⨯=即22 3.1428751...,7=作为圆周率的近似值,误差和误差限分别是多少,有几位有效数字?2133.142875 3.14159260.00126450.5100.510---=<⨯=⨯有3位有效数字.* 有效数字与相对误差的关系3. 利用递推公式计算积分110,1,2,...,9n x n I x e dx n -==⎰错误!未找到引用源。

, 建立稳定的数值算法。

该算法是不稳定的。

因为:11()()...(1)!()n n n I n I n I εεε-=-==-111n n I I n n -=-, 10110I =4. 衡量算法优劣的指标有__时间复杂度,__空间复杂度_.时间复杂度是指: , 两个n 阶矩阵相乘的乘法次数是 , 则称两个n 阶矩阵相乘这一问题的时间复杂度为 .二 代数插值1.根据下表数据建立不超过二次的Lagrange 和Newton 插值多项式, 并写出误差估计式, 以及验证插值多项式的唯一性。

x 0 1 4f(x) 1 9 3Lagrange:设0120120,1,4;()1()9()3x x x f x f x f x ======则,, 对应 的标准基函数 为:1200102()()(1)(x 4)1()(1)(x 4)()()(01)(04)4x x x x x l x x x x x x ----===------ 1()...l x =2()...l x =因此, 所求插值多项式为:220()()()....i i i P x f x l x ===∑ (3)2()()(0)(1)(x 4)3!f R x x x ξ=--- Newton:构造出插商表:xi f(xi ) 一 二 三0 11 9 84 3 -2 -5/2所以, 所求插值多项式为:2001001201()()[,]()[,,]()()518(0)(0)(1)2...P x f x f x x x x f x x x x x x x x x x =+-+--=+----=插值余项: 2()[0,1,4,](0)(1)(x 4)R x f x x x =---2. 已知函数f(0)=1,f(1)=3,f(2)=7,则f[0,1]=___2________, f[0,1,2]=____1______)('],[000x f x x f =3.过0,1两节点构造三次Hermite 插值多项式, 使得满足插值条件: f(0)=1. .’(0)=... f(1.=2. .’(1)=1设0101010,1,()1()2'()0,'()1x x f x f x f x f x ======则,, 写出插商表:xi f(xi) 一 二 三0 10 1 01 a 1 11 a 1 0 a-1因此, 所求插值多项式为:插值余项:222()[0,0,1,1,](1)R x f x x x =-4.求f(x)=sinx 在[a,b]区间上的分段线性插值多项式, 并写出误差估计式。

(完整版)数值分析第一次作业

(完整版)数值分析第一次作业

问题1:20.给定数据如下表:试求三次样条插值S(x),并满足条件 (1)S`(0.25)=1.0000,S`(0.53)=0.6868; (2)S ’’(0.25)=S ’’(0.53)=0。

分析:本问题是已知五个点,由这五个点求一三次样条插值函数。

边界条件有两种,(1)是已知一阶倒数,(2)是已知自然边界条件。

对于第一种边界(已知边界的一阶倒数值),可写出下面的矩阵方程。

⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡432104321034322110d M M M M M 200020000020022d d d d λμμλμλμλ其中μj =j1-j 1-j h h h +,λi=j1-j j h h h +,dj=6f[x j-1,x j ,x j+1], μn =1,λ0=1对于第一种边界条件d 0=0h 6(f[x 0,x 1]-f 0`),d n =1-n h 6(f`n-f `[x n-1,x n ]) 解:由matlab 计算得:由此得矩阵形式的线性方程组为:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡ 2.1150-2.4286-3.2667-4.3143-5.5200-M M M M M 25714.00001204286.000004000.026000.0006429.023571.0001243210解得 M 0=-2.0286;M 1=-1.4627;M 2= -1.0333; M 3= -0.8058; M 4=-0.6546S(x)=⎪⎪⎩⎪⎪⎨⎧∈-+-+-∈-+-+-∈-+-+-∈-+-+-]53.0,45.0[x 5.40x 9.1087x 35.03956.8.450-x 1.3637-x .5301.67881- ]45.0,39.0[x 9.30x 11.188x 54.010.418793.0-x 2.2384-x .450(2.87040-]39.0,30.0[x 03.0x 6.9544x 9.30 6.107503.0-x 1.9136-x .3902.708779-]30.0,25.0[x 5.20x 10.9662x 0.3010.01695.20-x 4.8758-x .3006.76209-33333333),()()()(),()()()),()()()(),()()()(Matlab 程序代码如下:function tgsanci(n,s,t) %n代表元素数,s,t代表端点的一阶导。

数值分析第一次大作业

数值分析第一次大作业

《数值分析》计算实习报告第一题院系:机械工程及自动化学院_学号: _____姓名: _ ______2017年11月7日一、算法设计方案1、求λ1,λ501和λs 的值1)利用幂法计算出矩阵A 按模最大的特征值,设其为λm 。

2)令矩阵B =A −λm I (I 为单位矩阵),同样利用幂法计算出矩阵B 按模最大的特征值λm ′。

3)令λm ′′=λm ′+λm 。

由计算过程可知λm 和λm ′′分别为矩阵A 所有特征值按大小排序后,序列两端的值。

即,λ1=min⁡{λm ,λm ′′},λ501=max⁡{λm ,λm ′′}。

4) 利用反幂法计算λs 。

其中,反幂法每迭代一次都要求解线性方程组1k k Au y -=,由于矩阵A 为带状矩阵,故可用三角分解法解带状线性方程组的方法求解得到k u 。

2、求A 的与数μk =λ1+k λ501−λ140最接近的特征值λi k (k =1,2, (39)1) 令矩阵D k =A −μk I ,利用反幂法计算出矩阵D k 按模最小的特征值λi k ′,则λi k =λi k ′+μk 。

3、求A 的(谱范数)条件数cond(A )2和行列式det A1) cond(A)2=|λm λs |,前文已算出m λ和s λ,直接带入即可。

2) 反幂法计算λs 时,已经对矩阵A 进行过Doolittle 分解,得到A=LU 。

而L 为对角线上元素全为1的下三角矩阵,U 为上三角矩阵,可知det 1L =,5011det ii i U u ==∏,即有5011det det det ii i A L U u ====∏。

最后,为节省存储量,需对矩阵A 进行压缩,将A 中带内元素存储为数组C [5][501]。

二、源程序代码#include<windows.h>#include<iostream>#include<iomanip>#include<math.h>using namespace std;#define N 501#define K 39#define r 2#define s 2#define EPSI 1.0e-12//求两个整数中的最大值int int_max2(int a, int b){return(a>b ? a : b);}//求两个整数中的最小值int int_min2(int a, int b){return(a<b ? a : b);}//求三个整数中的最大值int int_max3(int a, int b, int c){int t;if (a>b)t = a;else t = b;if (t<c) t = c;return(t);}//定义向量内积double dianji(double x[], double y[]) {double sum = 0;for (int i = 0; i<N; i++)sum = sum + x[i] * y[i];return(sum);}//计算两个数之间的相对误差double erro(double lamd0, double lamd1){double e, d, l;e = fabs(lamd1 - lamd0);d = fabs(lamd1);l = e / d;return(l);}//矩阵A的压缩存储初始化成Cvoid init_c(double c[][N]){int i, j;for (i = 0; i<r + s + 1; i++)for (j = 0; j<N; j++)if (i == 0 || i == 4)c[i][j] = -0.064;else if (i == 1 || i == 3)c[i][j] = 0.16;elsec[i][j] = (1.64 - 0.024*(j + 1))*sin(0.2*(j + 1)) - 0.64*exp(0.1 / (j + 1)); }//矩阵复制void fuzhi_c(double c_const[][N], double c[][N]){int i, j;for (i = 0; i<r + s + 1; i++)for (j = 0; j<N; j++)c[i][j] = c_const[i][j];}//LU三角分解void LUDet_c(double c_const[][N], double c_LU[][N]){double sum;int k, i, j;fuzhi_c(c_const, c_LU);for (k = 1; k <= N; k++){for (j = k; j <= int_min2(k + s, N); j++){sum = 0;for (i = int_max3(1, k - r, j - s); i <= k - 1; i++)sum += c_LU[k - i + s][i - 1] * c_LU[i - j + s][j - 1];c_LU[k - j + s][j - 1] -= sum;}for (j = k + 1; j <= int_min2(k + r, N); j++){sum = 0;for (i = int_max3(1, j - r, k - s); i <= k - 1; i++)sum += c_LU[j - i + s][i - 1] * c_LU[i - k + s][k - 1];c_LU[j - k + s][k - 1] = (c_LU[j - k + s][k - 1] - sum) / c_LU[s][k - 1];}}}//三角分解法解带状线性方程组void jiefc(double c_const[][N], double b_const[], double x[]){int i, j;double b[N], c_LU[r + s + 1][N], sum;for (i = 0; i<N; i++)b[i] = b_const[i];LUDet_c(c_const, c_LU);for (i = 2; i <= N; i++){sum = 0;for (j = int_max2(i - 2, 1); j <= i - 1; j++)sum += c_LU[i - j + 2][j - 1] * b[j - 1];b[i - 1] -= sum;}x[N - 1] = b[N - 1] / c_LU[2][N - 1];for (i = N - 1; i >= 1; i--){sum = 0;for (j = i + 1; j <= int_min2(i + 2, N); j++)sum += c_LU[i - j + 2][j - 1] * x[j - 1];x[i - 1] = (b[i - 1] - sum) / c_LU[2][i - 1];}}//幂法求按模最大特征值double mifa_c(double c_const[][N]){double u[N], y[N];double sum, length_u, beta0, beta1;int i, j;for (i = 0; i<N; i++)//迭代初始向量u[i] = 0.5;length_u = sqrt(dianji(u, u));for (i = 0; i<N; i++)y[i] = u[i] / length_u;for (i = 1; i <= N; i++){sum = 0;for (j = int_max2(i - 2, 1); j <= int_min2(i + 2, N); j++)sum = sum + c_const[i - j + 2][j - 1] * y[j - 1];u[i - 1] = sum;}beta1 = dianji(u, y);do{beta0 = beta1;length_u = sqrt(dianji(u, u));for (i = 0; i<N; i++)y[i] = u[i] / length_u;for (i = 1; i <= N; i++){sum = 0;for (j = int_max2(i - 2, 1); j <= int_min2(i + 2, N); j++)sum = sum + c_const[i - j + 2][j - 1] * y[j - 1];u[i - 1] = sum;}beta1 = dianji(u, y);} while (erro(beta0, beta1) >= EPSI);return(beta1);}//反幂法求按模最小特征值double fmifa_c(double c_const[][N]){double u[N], y[N];double length_u, beta0, beta1;int i;for (i = 0; i<N; i++)//迭代初始向量u[i] = 0.5;length_u = sqrt(dianji(u, u));for (i = 0; i<N; i++)y[i] = u[i] / length_u;jiefc(c_const, y, u);beta1 = dianji(y, u);do{beta0 = beta1;length_u = sqrt(dianji(u, u));for (i = 0; i<N; i++)y[i] = u[i] / length_u;jiefc(c_const, y, u);beta1 = dianji(y, u);} while (erro(beta0, beta1) >= EPSI);beta1 = 1 / beta1;return(beta1);}//计算lamd_1、lamd_501、lamd_svoid calculate1(double c_const[][N], double &lamd_1, double &lamd_501, double &lamd_s) {int i;double lamd_mifa0, lamd_mifa1, c[r + s + 1][N];lamd_mifa0 = mifa_c(c_const);fuzhi_c(c_const, c);for (i = 0; i<N; i++)c[2][i] = c[2][i] - lamd_mifa0;lamd_mifa1 = mifa_c(c) + lamd_mifa0;if (lamd_mifa0<lamd_mifa1){lamd_1 = lamd_mifa0;lamd_501 = lamd_mifa1;}else{lamd_501 = lamd_mifa0;lamd_1 = lamd_mifa1;}lamd_s = fmifa_c(c_const);}//平移+反幂法求最接近u_k的特征值void calculate2(double c_const[][N], double lamd_1, double lamd_501, double lamd_k[]){int i, k;double c[r + s + 1][N], h, temp;temp = (lamd_501 - lamd_1) / 40;for (k = 1; k <= K; k++){h = lamd_1 + k*temp;fuzhi_c(c_const, c);for (i = 0; i<N; i++)c[2][i] = c[2][i] - h;lamd_k[k - 1] = fmifa_c(c) + h;}}//计算cond(A)和det(A)void calculate3(double c_const[][N], double lamd_1, double lamd_501, double lamd_s, double &cond_A, double &det_A){int i;double c_LU[r + s + 1][N];if (fabs(lamd_1)>fabs(lamd_501))cond_A = fabs(lamd_1 / lamd_s);elsecond_A = fabs(lamd_501 / lamd_s);LUDet_c(c_const, c_LU);det_A = 1;for (i = 0; i<N; i++)det_A *= c_LU[2][i];}//*主程序*//int main(){int i, count = 0;double c_const[5][N], lamd_k[K];double lamd_1, lamd_501, lamd_s;double cond_A, det_A;//设置白背景黑字system("Color f0");//矩阵A压缩存储到c[5][501]init_c(c_const);cout << setiosflags(ios::scientific) << setiosflags(ios::right) << setprecision(12) << endl;//计算lamd_1、lamd_501、lamd_scalculate1(c_const, lamd_1, lamd_501, lamd_s);cout << " 矩阵A的最小特征值:λ1 = " << setw(20) << lamd_1 << endl;cout << " 矩阵A的最大特征值:λ501 = " << setw(20) << lamd_501 << endl;cout << " 矩阵A的按模最小的特征值:λs = " << setw(20) << lamd_s << endl;//求最接近u_k的特征值calculate2(c_const, lamd_1, lamd_501, lamd_k);cout << endl << " 与数u_k最接近的特征值:" << endl;for (i = 0; i<K; i++){cout << " λ_ik_" << setw(2) << i + 1 << " = " << setw(20) << lamd_k[i] << " ";count++;if (count == 2){cout << endl;count = 0;}}//计算cond_A和det_Acalculate3(c_const, lamd_1, lamd_501, lamd_s, cond_A, det_A);cout << endl << endl;cout << " 矩阵A的条件数:cond(A) = " << setw(20) << cond_A << endl;cout << " 矩阵A的行列式的值:det(A) = " << setw(20) << det_A << endl << endl;return 0;}三,计算结果四,分析初始向量选择对计算结果的影响当选取初始向量0(1,1,,1)Tu=时,计算的结果如下:此结果即为上文中的正确计算结果。

北航数值分析大作业一.docx

北航数值分析大作业一.docx

数值分析—计算实习作业一学院:机械工程学院专业:材料加工工程姓名:暴一品学号:SY12071342012-10-29一、算法设计方案观察矩阵A ,结构为带状,且与主对角线相邻的两个带的值b 和c 都是常数。

从而可以用带原点平移的幂法或反幂法计算λ1和λ501。

所以算法的设计方案如下:1.求按模最大的特征值,并记为max_eigenvalue ,算法如下所示⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=======------≤≤-),2,1()sgn(),,(/max ),,()(1)()(11)1(11)1(1)1()0()0(10ΛΛΛk h h h h Ay u h u y h h h h u k r k r k Tk nk k kk r k k k j nj k rTn β任取非零向量2.平移矩阵得到A ’=A-max_eigenvalueI ,再次用幂法,这次求出的A ’的按模大的特征值pymax_eigenvalue 就是与步骤1求出的特征值相差最大的特征值。

即两者一个为最大的特征值,另一个为最小的特征值。

3.根据max_eigenvalue 和pymax_eigenvalue 的正负性,直接确定λ1,和λ501。

4.对原矩阵A 用反幂法,求出其按模最小的特征值,记为s_eigenvalue ,此即λs 。

⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧=====∈--------),2,1(/111111110Λk u y y Au u y u u R u k T k k k k k k k k Tk k n βηη任取非零向量在反幂法的求解过程中,每迭代一次都要求满足解线性方程组Auk=yk-1。

本题中矩阵A 上半带宽为2,下半带宽也为2 。

故选择采用三角分解法求解方程组:先将原矩阵改写成5行501列的矩阵C (不存储A 的0元素) A 的带内元素aij=c 中的元素ci-j+3。

再对C 矩阵做LU 分解。

对于k=1,2,…,n ,执行∑---=+-+-+-+--=1)2,2,1max(,3,3,3,3:k j k t jj t t t k j j k j j k ccc c [j=k,k+1,…,min(k+2,n)]kk s k r i t k k t t t i k k i k k i c ccc c ,31),,1max(,3,3,3,3/)(:∑---=+-+-+-+--=[i=k+1,k+2,…,min(k+2,n);k<n]求解Lx=b ,Uuk=x (数组b 先是存放原方程组右端向量yk-1,后来存放中间向量x )∑--=+--=1),1max(,3:i r i t tt t i i i bcb b (i=2,3,…,n )nn kn c b u ,3/:=in i i t kt tt i i ki c u cb u ,3),2min(1,3/)(:∑++=+--= (i=n-1,n-2, (1)5.对k=1,2,……39执行:先根据题中给出的公式算出μk ,再将矩阵平移A ”=A-μk ,对矩阵A ”运用反幂法(线性方程组的解法同上),就可以求出与μk 最接近的特征值λik ,保存在数组py_eigenvalue 中。

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

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

b2[i-1]=b[i-1]-sum3; } x[n-1]=b2[n-1]/C[s][n-1]; for(i=n-1;i>=1;i--) { double sum4=0; for(int t=i+1;t<=min(i+s,n);t++) { sum4+=C[i-t+s][t-1]*x[t-1]; } x[i-1]=(b2[i-1]-sum4)/C[s][i-1]; } } /*反幂法*/ double FMF(double C[m][n]) { LU(C); for(int k=1;k<=n;k++) u[k-1]=1; /*为迭代初始向量赋值*/ beta1=beta2=0; do { ent=0; for(int i=1;i<=n;i++) ent+=u[i-1]*u[i-1]; ent=sqrt(ent); for(i=1;i<=n;i++) y[i-1]=u[i-1]/ent; HD(C,y,u); beta1=beta2; beta2=0; for(i=1;i<=n;i++) { beta2+=y[i-1]*u[i-1]; } }while(fabs(1/beta2-1/beta1)/fabs(1/beta2)>1.0e-12); return 1/beta2; } /*求 detA*/ double det(double C[m][n]) { LU(C); double detA=1; for(int j=1;j<=n;j++)
数值分析第一次作业
姓名:吴少波 学号:SY1105513
一、算法的设计方案 1.将带状矩阵 A 压缩为矩阵 C 存储。先用幂法算出 A 按模最大的特征值,记为 maxLambda, 再 将 其 平 移 ,用 带 原点 平 移 的 幂 法求 A-maxLambdaI 按模 最 大的 特 征 值 , 记为 p1 , 记 p2=p1+maxLambda,比较 maxLambda 和 p2 的大小,大的为λ 501,小的为λ 1。 用反幂法求解λ s 时,其中需解方程 Auk=yk-1,先把矩阵 A LU 分解(不列主元) ,再在每次循环 迭代时回代求解。 2.将 A 平移μ k(k=1,2,…,39)个单位,用带原点平移的反幂法求与μ k(k=1,2,…,39) 最接近的 39 个特征值。 3.cond(A)2=│maxLambda / λ s│ A 的行列式等于把 A LU 分解后 A 所有对角线上元素的乘积。 二、源程序(VC6.0 环境下的 C 语言) #include<stdio.h> #include<stdlib.h> #include<math.h> #include<malloc.h> #define m 5 #define n 501 #define r 2 #define s 2 double C[m][n]; double u[n]; double y[n]; double ent,beta1,beta2; void YS(); /*将带状矩阵 A 压缩为 C*/ int max(int a,int b); /*两数求较大的一个*/ int min(int a,int b); /*两数求较小的一个*/ double MF(double C[m][n]); /*幂法*/ double FMF(double C[m][n]); /*反幂法*/ void LU(double C[m][n]); /*LU 分解*/ void HD(double C[m][n],double b[n],double x[n]); /*回代过程*/ double det(double C[m][n]); /*求 detA*/ double Move_MF(double C[m][n],double maxLambda); /*带原点平移的幂法*/ double Move_FMF(double C[m][n],double p); /*带原点平移的反幂法*/ /**主函数**/ void main() { /*定义变量*/ double maxLambda=0,minLambda=0,condA,detA,Lambda1,Lambda501,p1,p2,Mu_k,Lambdaik; /*算第一题*/

北航研究生数值分析编程大作业1

北航研究生数值分析编程大作业1

数值分析大作业一、算法设计方案1、矩阵初始化矩阵[]501501⨯=ij a A 的下半带宽r=2,上半带宽s=2,设置矩阵[][]5011++s r C ,在矩阵C 中检索矩阵A 中的带内元素ij a 的方法是:j s j i ij c a ,1++-=。

这样所需要的存储单元数大大减少,从而极大提高了运算效率。

2、利用幂法求出5011λλ,幂法迭代格式:0111111nk k k k kk T k k k u R y u u Ay y u ηηβ------⎧∈⎪⎪=⎪=⎨⎪=⎪⎪=⎩非零向量 当1210/-≤-k k βββ时,迭代终止。

首先对于矩阵A 利用幂法迭代求出一个λ,然后求出矩阵B ,其中I A B λ-=(I 为单位矩阵),对矩阵B 进行幂法迭代,求出λ',之后令λλλ+'='',比较的大小与λλ'',大者为501λ,小者为1λ。

3、利用反幂法求出ik s λλ,反幂法迭代格式:0111111nk k k k kk T k k k u R y u Au y y u ηηβ------⎧∈⎪⎪=⎪=⎨⎪=⎪⎪=⎩非零向量 当1210/-≤-k k βββ时,迭代终止,1s k λβ=。

每迭代一次都要求解一次线性方程组1-=k k y Au ,求解过程为:(1)作分解LU A =对于n k ,...,2,1=执行[][]s k n r k k k i c c c c c n s k k k j c cc c k s ks k t k s k r i t t s t i k s k i k s k i js j t k s j r k t t s t k j s j k j s j k <+++=-=++=-=+++----=++-++-++-++----=++-++-++-∑∑);,min(,...,2,1/)(:),min(,...,1,:,1,11),,1max(,1,1,1,11),,1max(,1,1,1(2)求解y Ux b Ly ==,(数组b 先是存放原方程组右端向量,后来存放中间向量y))1,...,2,1(/)(:/:),...,3,2(:,1),min(1.1.11),1max(,1--=-===-=+++-++-+--=++-∑∑n n i c x c b x c b x n i b c b b i s t n s i i t t s t i i i ns n n ti r i t t s t i i i使用反幂法,直接可以求得矩阵按模最小的特征值s λ。

数值分析期末大作业

数值分析期末大作业

一、问题提出设方程f(x)=x 3-3x-1=0有三个实根 x *1=1.8793 , x *2=-0.34727 ,x *3=-1.53209现采用下面六种不同计算格式,求 f(x)=0的根 x *1 或x *2 。

1、 x = 213xx + 2、x = 313-x3、 x = 313+x4、 x = 312-x 5、 x = x13+6、 x = x - ()1133123---x x x二、目的和意义1、通过实验进一步了解方程求根的算法;2、认识选择计算格式的重要性;3、掌握迭代算法和精度控制;4、明确迭代收敛性与初值选取的关系。

三、结构程序设计本程序实在matlab 软件上进行操作的。

首先建立一个空白的M-文件。

在编辑器中输入以下内容,并保存。

function [X1,m,n,q]=shizi1(p) x=zeros(100,1); x=double(x);x(1,1)=p;i=1;deltax=100;while (i<100 & deltax > 0.000001)x(i+1,1)=(3*x(i,1)+1)/x(i,1)^2deltax=abs(x(i+1,1)-x(i,1));i=i+1;endX1=x(1,1);m=i;n=x(i,1);q=deltax;以上是运行函数,下一步在建立一个执行M-文件,输入以下内容,并保存。

其中X1为初始值,m为迭代次数,n为最后得到的值,q为|x k+1-x k|。

clear all;clc;p=1.8;[X1,m,n,q]=shizi1(p)1、对第一个迭代公式,在执行文件中输入p=1.8;[X1,m,n,q]=shizi1(p)。

得到如下结果如下:初值为1.8,迭代100次,精度为10-6。

可见该迭代公式是发散的,将初值改为-1.5,其他均条件不变。

p=-1.5;[X1,m,n,q]=shizi1(p)改变初值后可以得到一个接近真值的结果x*3的结果ans=-1.5321。

数值分析第一次大作业(宋宝瑞)

数值分析第一次大作业(宋宝瑞)

1、猜想ln(cond(Hn))与n之间在n较小时满足线性关系,在n较大时则不稳定,因此,设n分别为10,20,50,100,如下图所示,可以看出在n<14时,ln(cond(Hn))呈线性稳定增长,n>14时,函数曲线开始趋于平稳并不断波动,波动幅度较小,并有上升趋势。

程序:N=100;y=zeros(N,1);for n=1:NHn=hilb(n);condn=cond(Hn);y(n)=log(condn);endx=1:N;subplot(224);plot(x,y);xlabel('n');ylabel('ln(cond(Hn))');title('ln(cond(Hn))--n(n=100)');grid ;2、可以看出,log(cond(Hnpre)/cond(Hn))在y=0上下波动。

对比整个曲线图,可以发现,经过预处理,条件数有所下降,但下降值不大。

程序:x=1:100;y=zeros(100,1);y1=zeros(100,1);y2=zeros(100,1);for n=1:100Hn=hilb(n);inv_D=zeros(n);for i=1:ninv_D(i,i)=1/sqrt(Hn(i,i));endHnpre=inv_D*Hn*inv_D;y(n)=log(cond(Hnpre)/cond(Hn));y1(n)=log(cond(Hnpre));y2(n)=log(cond(Hn));end%plot(x,y1);plot(x,y,'r',x,y1,'g',x,y2,'k');legend('y','y1','y2');xlabel('n');ylabel('log(cond(Hnpre)/cond(Hn))');title('log(cond(Hnpre)/cond(Hn))--n(n=100)');grid on;3、设b所有值为1,n x1 x2 x34 -4.0000E+00 -4.0000E+00 -4.0000E+00 6.0000E+01 6.0000E+01 6.0000E+01 -1.8000E+02 -1.8000E+02 -1.8000E+02 1.4000E+02 1.4000E+02 1.4000E+0255.0000E+00 5.0000E+00 5.0000E+00 -1.2000E+02 -1.2000E+02 -1.2000E+026.3000E+02 6.3000E+02 6.3000E+02 -1.1200E+03 -1.1200E+03 -1.1200E+03 6.3000E+02 6.3000E+02 6.3000E+026 -6.0000E+00 -6.0000E+00 -6.0000E+00 2.1000E+02 2.1000E+02 2.1000E+02 -1.6800E+03 -1.6800E+03 -1.6800E+03 5.0400E+03 5.0400E+03 5.0400E+03 -6.3000E+03 -6.3000E+03 -6.3000E+03 2.7720E+03 2.7720E+03 2.7720E+0377.0000E+00 7.0000E+00 7.0000E+00 -3.3600E+02 -3.3600E+02 -3.3600E+02 3.7800E+03 3.7800E+03 3.7800E+03-1.6800E+04 -1.6800E+04 -1.6800E+04 3.4650E+04 3.4650E+04 3.4650E+04 -3.3264E+04 -3.3264E+04 -3.3264E+04 1.2012E+04 1.2012E+04 1.2012E+048 -8.0000E+00 -8.0000E+00 -8.0000E+00 5.0400E+02 5.0400E+02 5.0400E+02 -7.5600E+03 -7.5600E+03 -7.5600E+03 4.6200E+04 4.6200E+04 4.6200E+04 -1.3860E+05 -1.3860E+05 -1.3860E+05 2.1622E+05 2.1622E+05 2.1622E+05 -1.6817E+05 -1.6817E+05 -1.6817E+05 5.1480E+04 5.1480E+04 5.1480E+0499.0000E+00 9.0000E+00 9.0001E+00 -7.2000E+02 -7.2000E+02 -7.2000E+02 1.3860E+04 1.3860E+04 1.3860E+04 -1.1088E+05 -1.1088E+05 -1.1088E+05 4.5045E+05 4.5045E+05 4.5045E+05 -1.0090E+06 -1.0090E+06 -1.0090E+06 1.2613E+06 1.2613E+06 1.2613E+06 -8.2368E+05 -8.2368E+05 -8.2368E+05 2.1879E+05 2.1879E+05 2.1879E+0510 -9.9980E+00 -9.9987E+00 -1.0001E+01 9.8983E+02 9.8989E+02 9.9005E+02 -2.3756E+04 -2.3758E+04 -2.3761E+04 2.4021E+05 2.4022E+05 2.4025E+05 -1.2611E+06 -1.2612E+06 -1.2613E+06 3.7833E+06 3.7835E+06 3.7839E+06 -6.7260E+06 -6.7263E+06 -6.7269E+06 7.0006E+06 7.0008E+06 7.0015E+06 -3.9378E+06 -3.9380E+06 -3.9383E+06 9.2370E+05 9.2373E+05 9.2380E+05111.0927E+01 1.0988E+01 1.0992E+01 -1.3124E+03 -1.3188E+03 -1.3192E+03 3.8410E+04 3.8580E+04 3.8587E+04 -4.7823E+05 -4.8015E+05 -4.8022E+05 3.1396E+06 3.1513E+06 3.1515E+06 -1.2060E+07 -1.2102E+07 -1.2102E+072.8484E+07 2.8575E+07 2.8576E+07 -4.1864E+07 -4.1989E+07 -4.1990E+073.7293E+07 3.7398E+07 3.7398E+07 -1.8420E+07 -1.8469E+07 -1.8469E+07 3.8689E+06 3.8786E+06 3.8785E+0612 -9.6349E+00 -1.2768E+01 -1.1739E+01 1.4311E+03 1.8176E+03 1.6833E+03-5.1063E+04 -6.3363E+04 -5.9039E+047.7783E+05 9.4708E+05 8.8711E+05-6.3022E+06 -7.5528E+06 -7.1069E+063.0320E+07 3.5851E+07 3.3868E+07-9.1788E+07 -1.0728E+08 -1.0171E+081.7935E+082.0753E+08 1.9736E+08-2.2572E+08 -2.5889E+08 -2.4688E+081.7662E+082.0099E+08 1.9214E+08-7.8125E+07 -8.8290E+07 -8.4591E+071.4921E+07 1.6757E+07 1.6087E+07可以看出,当n<9时,三种方法计算出的结果几乎一致,当n>9时,三种方法计算出的结果相差越来越大。

数值分析作业(1,2)

数值分析作业(1,2)

数值分析作业(1)1:思考题(判断是否正确并阐述理由)(a)一个问题的病态性如何,与求解它的算法有关系。

(b)无论问题是否病态,好的算法都会得到它好的近似解。

(c)计算中使用更高的精度,可以改善问题的病态性。

(d)用一个稳定的算法计算一个良态问题,一定会得到他好的近似解。

(e)浮点数在整个数轴上是均匀分布。

(f)浮点数的加法满足结合律。

(g)浮点数的加法满足交换律。

(h)浮点数构成有效集合。

(i)用一个收敛的算法计算一个良态问题,一定得到它好的近似解。

√2: 解释下面Matlab程序的输出结果t=0.1;n=1:10;e=n/10-n*t3:对二次代数方程的求解问题20++=ax bx c有两种等价的一元二次方程求解公式22b x ac x -±== 对a=1,b=-100000000,c=1,应采用哪种算法?4:函数sin x 的幂级数展开为: 357sin 3!5!7!x x x x x =-+-+ 利用该公式的Matlab 程序为function y=powersin(x)% powersin. Power series for sin(x)% powersin(x) tries to compute sin(x)from a power seriess=0;t=x;n=1;while s+t~=s;s=s+t;t=-x^2/((n+1)*(n+2))*tn=n+2;end(a ) 解释上述程序的终止准则;(b ) 对于x=/2π、x=11/2π、x =21/2π,计算的精度是多少?分别需要计算多少项?5:指数函数的幂级数展开2312!3!x x x e x =++++ 根据该展开式,编写Matlab 程序计算指数函数的值,并分析计算结果(重点分析0x <的计算结果)。

数值分析作业(2)思考题1:判断下面命题是否正确并阐述理由(a)仅当系数矩阵是病态或奇异的时候,不选主元的Gauss消元法才会失败。

北航硕士研究生数值分析大作业一

北航硕士研究生数值分析大作业一

数值分析—计算实习作业一学院:17系专业:精密仪器及机械姓名:张大军学号:DY14171142014-11-11数值分析计算实现第一题报告一、算法方案算法方案如图1所示。

(此算法设计实现完全由本人独立完成)图1算法方案流程图二、全部源程序全部源程序如下所示#include <iostream.h>#include <iomanip.h>#include <math.h>int main(){double a[501];double vv[5][501];double d=0;double r[3];double uu;int i,k;double mifayunsuan(double *a,double weiyi);double fanmifayunsuan(double *a,double weiyi);void yasuo(double *A,double (*C)[501]);void LUfenjie(double (*C)[501]);//赋值语句for(i=1;i<=501;i++){a[i-1]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);}//程序一:使用幂方法求绝对值最大的特征值r[0]=mifayunsuan(a,d);//程序二:使用幂方法求求平移λ[0]后绝对值最大的λ,得到原矩阵中与最大特征值相距最远的特征值d=r[0];r[1]=mifayunsuan(a,d);//比较λ与λ-λ[0]的大小,由已知得if(r[0]>r[1]){d=r[0];r[0]=r[1];r[1]=d;}//程序三:使用反幂法求λr[2]=fanmifayunsuan(a,0);cout<<setiosflags(ios::right);cout<<"λ["<<1<<"]="<<setiosflags(ios::scientific)<<setprecision(12)<<r[0]<<endl;cout<<"λ["<<501<<"]="<<setiosflags(ios::scientific)<<setprecision(12)<<r[1]<<endl;cout<<"λ[s]="<<setiosflags(ios::scientific)<<setprecision(12)<<r[2]<<endl;//程序四:求A的与数u最接近的特征值for(k=1;k<40;k++){uu=r[0]+k*(r[1]-r[0])/40;cout<<"最接近u["<<k<<"]"<<"的特征值为"<<setiosflags(ios::scientific)<<setprecision(12)<<fanmifayunsuan(a,uu)<<endl;}//程序五:谱范数的条件数是绝对值最大的特征值除以绝对值最小的特征值的绝对值cout<<"cond(A)2="<<fabs(r[0]/r[2])<<endl;//程序六:A的行列式的值就是A分解成LU之U的对角线的乘积yasuo(a,vv);LUfenjie(vv);uu=1;for(i=0;i<501;i++){uu=uu*vv[2][i];}cout<<"Det(A)="<<uu<<endl;return 1;}double mifayunsuan(double *a,double weiyi){int i,k;double b=0.16;double c=-0.064;double ee,w,v1,v2,mm,sum;double u[501];double y[505]={0};for(i=0;i<501;i++)u[i]=1;//给u赋初值if (weiyi!=0){for (i=0;i<501;i++)a[i]-=weiyi;}ee=1;k=0;//使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i+2]=u[i]/w;//注意此处编程与书上不同,之后会解释它的巧妙之处1 }for(i=0;i<501;i++){u[i]=c*y[i]+b*y[i+1]+a[i]*y[i+2]+b*y[i+3]+c*y[i+4];//1显然巧妙之处凸显出来}sum=0;for(i=0;i<501;i++){sum+=y[i+2]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(v2-v1)/fabs(v2);}}if (weiyi!=0){for (i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return (v2+weiyi);}double fanmifayunsuan(double *a,double weiyi){int i,k;double b=0.16;double c=-0.064;double ee,w,v1,v2,mm,sum;double u[501];double y[501];double C[5][501];void yasuo(double *A,double (*C)[501]);void LUfenjie(double (*C)[501]);void qiuU(double (*C)[501],double *y,double *u);//把A阵压缩到C阵中for(i=0;i<501;i++)u[i]=1;//给u赋初值if (weiyi!=0){for (i=0;i<501;i++)a[i]-=weiyi;}yasuo(a,C);LUfenjie(C);ee=1;k=0; //使得初始计算时进入循环语句while(ee>1e-12){mm=0;for(i=0;i<501;i++){mm=mm+u[i]*u[i];}w=sqrt(mm);for(i=0;i<501;i++){y[i]=u[i]/w;}qiuU(C,y,u);sum=0;for(i=0;i<501;i++){sum+=y[i]*u[i];}v1=v2;v2=sum;//去除特殊情况,减少漏洞if(k==0){k++;}else{ee=fabs(1/v2-1/v1)/fabs(1/v2);}}if (weiyi!=0){for (i=0;i<501;i++)a[i]+=weiyi;}//还原A矩阵return (1/v2+weiyi);}void yasuo(double *A,double (*C)[501]){double b=0.16;double c=-0.064;int i;for(i=0;i<501;i++){C[0][i]=c;C[1][i]=b;C[2][i]=A[i];C[3][i]=b;C[4][i]=c;}}void LUfenjie(double (*C)[501]){int k,t,j;int r=2,s=2;double sum;int minn(int ,int );int maxx(int ,int );for(k=0;k<501;k++){for(j=k;j<=minn(k+s,501-1);j++){if(k==0)sum=0;else{sum=0;for(t=maxx(k-r,j-s);t<k;t++){sum=sum+C[k-t+s][t]*C[t-j+s][j];}}C[k-j+s][j]=C[k-j+s][j]-sum;}for(j=k+1;j<=minn(k+r,501-1);j++){if(k<501-1){if(k==0)sum=0;else{sum=0;for(t=maxx(j-r,k-s);t<k;t++){sum=sum+C[j-t+s][t]*C[t-k+s][k];}}C[j-k+s][k]=(C[j-k+s][k]-sum)/C[s][k];}}}}void qiuU(double (*C)[501],double *y,double *u){int i,t;double b[501];double sum;int r=2,s=2;int minn(int ,int );int maxx(int ,int );for(i=0;i<501;i++){b[i]=y[i];}for(i=1;i<501;i++){sum=0;for(t=maxx(0,i-r);t<i;t++){sum=sum+C[i-t+s][t]*b[t];}b[i]=b[i]-sum;}u[500]=b[500]/C[s][500];for(i=501-2;i>=0;i--){sum=0;for(t=i+1;t<=minn(i+s,500);t++){sum=sum+C[i-t+s][t]*u[t];}u[i]=(b[i]-sum)/C[s][i];}}int minn(int x,int y){int min;if(x>y)min=y;elsemin=x;return min;}int maxx(int b,int c){int max;if(b>c){if(b>0)max=b;elsemax=0;}else{if(c>0)max=c;elsemax=0;}return max;}三、特征值以及的值λ[1]=-1.070011361502e+001 λ[501]=9.724634098777e+000λ[s]=-5.557910794230e-003最接近u[1]的特征值为-1.018293403315e+001最接近u[2]的特征值为-9.585707425068e+000最接近u[3]的特征值为-9.172672423928e+000最接近u[4]的特征值为-8.652284007898e+000最接近u[5]的特征值为-8.0934********e+000最接近u[6]的特征值为-7.659405407692e+000最接近u[7]的特征值为-7.119684648691e+000最接近u[8]的特征值为-6.611764339397e+000最接近u[9]的特征值为-6.0661********e+000最接近u[10]的特征值为-5.585101052628e+000最接近u[11]的特征值为-5.114083529812e+000最接近u[12]的特征值为-4.578872176865e+000最接近u[13]的特征值为-4.096470926260e+000最接近u[14]的特征值为-3.554211215751e+000最接近u[15]的特征值为-3.0410********e+000最接近u[16]的特征值为-2.533970311130e+000最接近u[17]的特征值为-2.003230769563e+000最接近u[18]的特征值为-1.503557611227e+000最接近u[19]的特征值为-9.935586060075e-001最接近u[20]的特征值为-4.870426738850e-001最接近u[21]的特征值为2.231736249575e-002最接近u[22]的特征值为5.324174742069e-001最接近u[23]的特征值为1.052898962693e+000最接近u[24]的特征值为1.589445881881e+000最接近u[25]的特征值为2.060330460274e+000最接近u[26]的特征值为2.558075597073e+000最接近u[27]的特征值为3.080240509307e+000最接近u[28]的特征值为3.613620867692e+000最接近u[29]的特征值为4.0913********e+000最接近u[30]的特征值为4.603035378279e+000最接近u[31]的特征值为5.132924283898e+000最接近u[32]的特征值为5.594906348083e+000最接近u[33]的特征值为6.080933857027e+000最接近u[34]的特征值为6.680354092112e+000最接近u[35]的特征值为7.293877448127e+000最接近u[36]的特征值为7.717111714236e+000最接近u[37]的特征值为8.225220014050e+000最接近u[38]的特征值为8.648666065193e+000最接近u[39]的特征值为9.254200344575e+000cond(A)2=1.925204273902e+003 Det(A)=2.772786141752e+118四、现象讨论在大作业的程序设计过程当中,初始向量的赋值我顺其自然的设为第一个分量为1,其它分量为0的向量,计算结果与参考答案存在很大差别,计算结果对比如下图2所示(左侧为正确结果,右侧为错误结果),导致了我花了很多的时间去检查程序算法。

北航数值分析大作业一

北航数值分析大作业一

北航数值分析大作业一————————————————————————————————作者: ————————————————————————————————日期:ﻩ《数值分析B》大作业一SY1103120 朱舜杰一.算法设计方案:1.矩阵A的存储与检索将带状线性矩阵A[501][501]转存为一个矩阵MatrixC[5][501] . 由于C语言中数组角标都是从0开始的,所以在数组MatrixC[5][501]中检索A的带内元素a ij的方法是:A的带内元素aij=C中的元素ci-j+2,j2.求解λ1,λ501,λs①首先分别使用幂法和反幂法迭代求出矩阵按摸最大和最小的特征值λmax和λmin。

λmin即为λs;如果λmax>0,则λ501=λmax;如果λmax<0,则λ1=λmax。

②使用带原点平移的幂法(mifa()函数),令平移量p=λmax,求出对应的按摸最大的特征值λ,max,如果λmax>0,则λ1=λ,max+p;如果λmax<0,则λ501=λ,max+p。

3.求解A的与数μk=λ1+k(λ501-λ1)/40的最接近的特征值λik(k=1,2,…,39)。

使用带原点平移的反幂法,令平移量p=μk,即可求出与μk最接近的特征值λik。

4.求解A的(谱范数)条件数cond(A)2和行列式detA。

①cond(A)2=|λ1/λn|,其中λ1和λn分别是矩阵A的模最大和最小特征值。

②矩阵A的行列式可先对矩阵A进行LU分解后,detA等于U所有对角线上元素的乘积。

二.源程序#include<stdio.h>#include<iostream.h>#include<stdlib.h>#include<math.h>#include<float.h>#include<iomanip.h>#include<time.h>#define E 1.0e-12/*定义全局变量相对误差限*/int max2(inta,intb)ﻩ/*求两个整型数最大值的子程序*/{ﻩif(a>b)return a;elsereturn b;}int min2(int a,intb) /*求两个整型数最小值的子程序*/{if(a>b)return b;elsereturn a;}int max3(int a,int b,intc)/*求三整型数最大值的子程序*/{int t;ﻩif(a>b)ﻩt=a;ﻩelset=b;ﻩif(t<c) t=c;return(t);}voidassignment(double array[5][501]) /*将矩阵A转存为数组C[5][501]*/{int i,j,k;//所有元素归零for(i=0;i<=4;){for(j=0;j<=500;){array[i][j]=0;ﻩj++;}ﻩ i++;}//第0,4行赋值for(j=2;j<=500;){ﻩk=500-j;array[0][j]=-0.064;array[4][k]=-0.064;ﻩj++;}//第1,3行赋值for(j=1;j<=500;){ﻩﻩk=500-j;array[1][j]=0.16;array[3][k]=0.16;ﻩ j++;}//第2行赋值for(j=0;j<=500;){k=j;ﻩﻩj++;array[2][k]=(1.64-0.024*j)*sin((double)(0.2*j))-0.64*exp((do uble)(0.1/j));}}doublemifa(double u[501],double array[5][501],double p) /*带原点平移的幂法*/{int i,j; /* u[501]为初始迭代向量*/double a,b,c=0; /* array[5][501]为矩阵A的转存矩阵*/ﻩdouble y[501]; /*p为平移量*/ﻩfor(;;){a=0;ﻩb=0;/*选用第一种迭代格式*///求ηk-1for(i=0;i<=500;i++){ﻩa=a+u[i]*u[i];ﻩ}a=sqrt(a);//求y k-1for(i=0;i<=500;i++){ﻩﻩy[i]=u[i]/a;}//求u kfor(i=0;i<=500;i++)ﻩ{ﻩu[i]=0;for(j=max2(i-2,0);j<=min2(i+2,500);j++)ﻩ{u[i]+=array[i-j+2][j]*y[j];ﻩ}ﻩu[i]=u[i]-p*y[i]; /*引入平移量*/ﻩ}//求βkﻩfor(i=0;i<=500;i++)ﻩ{ﻩﻩb+=y[i]*u[i];ﻩ}ﻩif(fabs((b-c)/b)<=E) /*达到精度水平,迭代终止*/ ﻩbreak;c=b;ﻩ}return(b+p);/*直接返回A的特征值*/}voidchuzhi(double a[]) /*用随机数为初始迭代向量赋值*/{inti;srand((int)time(0));for(i=0;i<=500;i++)ﻩ{ﻩﻩa[i]=(10.0*rand()/RAND_MAX);/*生成0~10的随机数*/ }}void chuzhi2(double a[],int j)/*令初始迭代向量为e i*/{int i;ﻩfor(i=0;i<=500;i++)ﻩ{a[i]=0;ﻩ}a[j]=1;}void LU(double array[5][501]) /*对矩阵A进行Doolittle分解*/{/*矩阵A转存在C[5][501]中*/ﻩint j,k,t;/*分解结果L,U分别存在C[5][501]的上半部与下半部*/ﻩfor(k=0;k<=500;k++)ﻩ{ﻩﻩfor(j=k;j<=min2((k+2),500);j++)ﻩﻩ{ﻩﻩfor(t=max3(0,k-2,j-2);t<=(k-1);t++)ﻩ{ﻩﻩarray[k-j+2][j]-=array[k-t+2][t]*array[t-j+2][j]; ﻩﻩ}ﻩ}ﻩif(k<500)ﻩfor(j=k+1;j<=min2((k+2),500);j++){ﻩﻩfor(t=max3(0,k-2,j-2);t<=(k-1);t++){ﻩﻩarray[j-k+2][k]-=array[j-t+2][t]*array[t-k+2][k];ﻩﻩ}array[j-k+2][k]=array[j-k+2][k]/array[2][k];}ﻩ}}double fmifa(double u[501],double array[5][501],double p){ /*带原点平移的反幂法*/ﻩinti,j;ﻩdoublea,b,c=0;ﻩdoubley[501];//引入平移量for(i=0;i<=500;i++)ﻩ{array[2][i]-=p;ﻩ}//先将矩阵Doolittle分解LU(array);ﻩfor(;;){a=0;b=0;//求ηk-1for(i=0;i<=500;i++){ﻩﻩa=a+u[i]*u[i];}a=sqrt(a);//求yk-1ﻩfor(i=0;i<=500;i++)ﻩ{y[i]=u[i]/a;ﻩ}//回带过程,求解u kfor(i=0;i<=500;i++)ﻩ{ﻩu[i]=y[i];ﻩ}for(i=1;i<=500;i++)ﻩ{ﻩfor(j=max2(0,(i-2));j<=(i-1);j++)ﻩ{ﻩﻩu[i]-=array[i-j+2][j]*u[j];ﻩ}ﻩﻩ}ﻩu[500]=u[500]/array[2][500];for(i=499;i>=0;i--)ﻩ{for(j=i+1;j<=min2((i+2),500);j++)ﻩﻩ{ﻩﻩu[i]-=array[i-j+2][j]*u[j];ﻩ}ﻩﻩu[i]=u[i]/array[2][i];ﻩ}//求βkfor(i=0;i<=500;i++){ﻩﻩb+=y[i]*u[i];}if(fabs((b-c)/b)<=E) /*达到精度要求,迭代终止*/break;ﻩc=b;}return(p+(1/b)); /*直接返回距离原点P最接近的A的特征值*/}//主函数main(){ int i;double d1,d501,ds,d,a;ﻩdouble u[501];ﻩdoubleMatrixC[5][501];printf(" 《数值分析》计算实习题目第一题\n");ﻩprintf("SY1103120朱舜杰\n");//将矩阵A转存为MatrixCassignment(MatrixC);//用带原点平移的幂法求解λ1,λ501chuzhi(u);ﻩd=mifa(u,MatrixC,0);chuzhi(u);ﻩa=mifa(u,MatrixC,d);ﻩif(d<0)ﻩ{ﻩﻩd1=d;ﻩd501=a;ﻩ}elseﻩ{ﻩﻩﻩd501=d;ﻩﻩd1=a;ﻩ}printf("λ1=%.12e\n",d1);ﻩprintf("λ501=%.12e\n",d501);//用反幂法求λschuzhi(u);ds=fmifa(u,MatrixC,0);printf("λs=%.12e\n",ds);//用带原点平移的反幂法求λikfor(i=1;i<=39;i++){ﻩa=d1+(i*(d501-d1))/40;ﻩﻩassignment(MatrixC);ﻩchuzhi(u);ﻩﻩd=fmifa(u,MatrixC,a);ﻩﻩprintf("与μ%02d=%+.12e最接近的特征值λi%02d=%+.12e\n",i,a,i,d); ﻩ}//求A的条件数d=fabs((d1/ds));ﻩprintf("A的(谱范数)条件数cond<A>2=%.12e\n",d);//求detAﻩassignment(MatrixC);LU(MatrixC);ﻩa=1;for(i=0;i<=500;i++){a*=MatrixC[2][i];}printf("行列式detA=%.12e\n",a);//测试不同迭代初始向量对λ1计算结果的影响。

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

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

一、算法的设计方案1、求矩阵最大特征值,最小特征值与按模最小特征值的方法首先用幂法求出矩阵A 的一个特征值λ,则其必为最大特征值与最小特征值二者其一,之后对矩阵A 进行一次移项,即A-λI ,然后再次用幂法求出另一个按模最大特征值,再比较这两个值的大小,则较大的为矩阵A 的最大特征值,较小的为矩阵A 的最小特征值。

用反幂法可以求得矩阵的按模最小特征值λs 2、求矩阵A 与k μ最接近的特征值k i λ可以先对矩阵A 进行移项,即A-k μI ,对这个移项后的矩阵用反幂法求出按模最小的特征值,然后再加上k μ,就求出所要求的k i λ。

3、求矩阵A 的条件数cond(A)2和行列式detA由于矩阵A 是非奇异的实对称矩阵,所以可以用以下公式方便地求出矩阵A 的条件数cond(A)2=sλλ501对于矩阵A 行列式的求法也比较简单。

由于在用反幂法的过程中对A 进行了Doolittle LU 分解,所以detA=detL*detU ,而detL=1,detU 可以用对角线元素相乘方便地算出,所以detA 就是U 阵对角线元素的乘积。

4、几点说明由于A 中的零元素都不存储,所以在存储矩阵的时候采用书上26页的压缩存储方式。

在反幂法中采用LU 分解求解带状线性方程组的算法来求解每一次迭代的方程组,由于每一次方程左边的系数都相同,所以只要进行一次LU 分解即可。

因为幂法,反幂法,LU 分解,求最大值与最小值在程序编写的过程中多次用到,所以这几项作为子函数单独进行编写。

二、源程序如下:#include "stdio.h"#include "math.h"# define s 2# define r 2# define N 501double c[5][N]={0};double lameda[40];double max(double x,double y);double min(double x,double y);double mifa();double fanmifa();void LUfenjie();void main(){int i=0,j=0;/*============对数组进行赋值==============*/ for(j=3;j<=N;j++)c[0][j-1]=-0.064;for(j=2;j<=N;j++)c[1][j-1]=0.16;for(j=1;j<=N;j++)c[2][j-1]=(1.64-0.024*j)*sin(0.2*j)-0.64*exp(0.1/j);for(j=1;j<=N-1;j++)c[3][j-1]=0.16;for(j=1;j<=N-2;j++)c[4][j-1]=-0.064;/*========幂法求最大和最小特征值==============*/ double a=mifa();for(j=1;j<=N;j++)c[2][j-1]-=a;double b=mifa()+a;double lameda501=max(a,b);double lameda1=min(a,b);printf("矩阵A最大的特征值=%13.11e\n",lameda501);printf("矩阵A最小的特征值=%13.11e\n",lameda1);/*========反幂法求绝对值最小特征值===========*/for(j=1;j<=N;j++)c[2][j-1]+=a;double lamedas=fanmifa();printf("矩阵A按模最小的特征值=%13.11e\n",lamedas);/*========求条件数和行列式的值===========*/double detA=1;for(j=1;j<=N;j++)detA*=c[2][j-1];printf("矩阵A的行列式=%13.11e\n",detA);double condA=fabs(lameda501/lamedas);printf("矩阵A的条件数=%13.11e\n",condA);/*========反幂法求与uk最接近的特征值========*/for(int k=1;k<40;k++){ for(j=3;j<=N;j++)c[0][j-1]=-0.064;for(j=2;j<=N;j++)c[1][j-1]=0.16;for(j=1;j<=N;j++)c[2][j-1]=(1.64-0.024*j)*sin(0.2*j)-0.64*exp(0.1/j);for(j=1;j<=N-1;j++)c[3][j-1]=0.16;for(j=1;j<=N-2;j++)c[4][j-1]=-0.064;for(j=1;j<=N;j++)c[2][j-1]-=(lameda1+k*(lameda501-lameda1)/40);lameda[k]=fanmifa()+(lameda1+k*(lameda501-lameda1)/40);printf("矩阵A最接近u%d的特征值=%13.11e\n",k,lameda[k]);}}double max(double x,double y) //求两数中的最大值{double z;z=x>y ? x:y;return(z);}double min(double x,double y) //求两数中的最小值{double z;z=x<y ? x:y;return(z);}double mifa() //幂法求按模最大特征值{double u[N]={0};double sum=0;double zero=0;double y[N]={0};double b1=0,b2=0;int i=0,j=0;for(i=0;i<N;i++)u[i]=1;do{ sum=0;for(i=0;i<N;i++)sum+=u[i]*u[i];for(i=0;i<N;i++)y[i]=u[i]/sqrt(sum);for(i=0;i<N;i++){ u[i]=0;for(j=max(0,i-2);j<=min(i+2,N-1);j++){u[i]+=c[i-j+s][j]*y[j];}}b2=b1;zero=0;for(i=0;i<N;i++)zero+=y[i]*u[i];b1=zero;}while((fabs(b1-b2)/fabs(b1))>1e-12);return(b1);}double fanmifa() //反幂法求按模最小特征值{double u[N]={0};double sum=0;double zero=0;double y[N]={0};double b[N]={0};double b1=0,b2=0;int i=0,j=0,t=0;for(i=0;i<N;i++)u[i]=1;LUfenjie();do{ sum=0;for(i=0;i<N;i++)sum+=u[i]*u[i];for(i=0;i<N;i++){b[i]=u[i]/sqrt(sum);y[i]=b[i];}for(i=1;i<N;i++)for(t=max(0,i-r);t<i;t++)y[i]-=c[i-t+s][t]*y[t];u[N-1]=y[N-1]/c[s][N-1];for(i=N-2;i>=0;i--){ for(t=i+1;t<=min(i+s,N-1);t++)y[i]-=c[i-t+s][t]*u[t];u[i]=y[i]/c[s][i];}b2=b1;zero=0;for(i=0;i<N;i++)zero+=b[i]*u[i];b1=1/zero;}while((fabs(b1-b2)/fabs(b1))>1e-12);return(b1);}void LUfenjie() //对矩阵做LU分解{ int k=0;int j=0;int i=0;int t=0;for(k=0;k<N;k++){ for(j=k;j<=min(k+s,N-1);j++)for(t=max(max(0,k-r),j-s);t<k;t++)c[k-j+s][j]-=c[k-t+s][t]*c[t-j+s][j];for(i=k+1;i<=min(k+r,N-1);i++){ for(t=max(max(0,i-r),k-s);t<k;t++)c[i-k+s][k]-=c[i-t+s][t]*c[t-k+s][k];c[i-k+s][k]/=c[s][k];}}}三、运行结果如下四、初始向量对计算结果的影响在本程序的编写中,为了方便起见,所以迭代向量的初值选为u=[1 1 1 ...1]。

北航数值分析第一次大作业(幂法反幂法)

北航数值分析第一次大作业(幂法反幂法)

一、问题分析及算法描述1. 问题的提出:(1)用幂法、反幂法求矩阵A =[a ij ]20×20的按摸最大和最小特征值,并求出相应的特征向量。

其中 a ij ={sin (0.5i +0.2j ) i ≠j 1.5cos (i +1.2j ) i =j要求:迭代精度达到10−12。

(2)用带双步位移的QR 法求上述的全部特征值,并求出每一个实特征值相应的特征向量。

2. 算法的描述:(1) 幂法幂法主要用于计算矩阵的按摸为最大的特征值和相应的特征向量。

其迭代格式为:{ 任取非零向量u 0=(h 1(0),⋯,h n (0))T|h r (k−1)|=max 1≤j≤n |h r (k−1)| y ⃑ k−1=u ⃑ k−1|h r (k−1)| u ⃑ k =Ay ⃑ k−1=(h 1(k ),⋯,h n (k ))T βk =sgn (h r (k−1))h r (k ) (k =1,2,⋯) 终止迭代的控制选用≤ε。

幂法的使用条件为n ×n 实矩阵A 具有n 个线性无关的特征向量x 1,x 2,⋯,x n ,其相应的特征值λ1,λ2,⋯,λn 满足不等式|λ1|>|λ2|≥|λ3|≥⋯≥|λn |或λ1=λ2=⋯=λm|λ1|>|λm+1|≥|λm+2|≥⋯≥|λn |幂法收敛速度与比值|λ2λ1|或|λm+1λ1|有关,比值越小,收敛速度越快。

(2) 反幂法反幂法用于计算n ×n 实矩阵A 按摸最小的特征值,其迭代格式为:{任取非零向量u 0∈R nηk−1=√u ⃑ k−1T u ⃑ k−1 y ⃑ k−1=u ⃑ k−1ηk−1⁄ Au ⃑ k =y ⃑ k−1 βk =y ⃑ k−1u ⃑ k (k =1,2,⋯) 每迭代一次都要求解一次线性方程组Au ⃑ k =y ⃑ k−1。

当k 足够大时,λn ≈1βk ,y ⃑ k−1可近似的作为矩阵A 的属于λn 的特征向量。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

因为方阵 A 为实对称矩阵,并且 1 2 501 ,所以矩阵 A 的按模最 大的特征值必为 1 或 501 ,采用如下步骤求解 1 和 501 : Ⅰ 采用幂法求解矩阵 A 中按模最大的特征值 M 1 ; Ⅱ 矩阵 B A M I ,采用幂法求解矩阵 B 中按模最大的特征值 M 2 ; Ⅲ M 3 M 1 M 2 ;比较 M 1 和 M 3 二者的数值大小,则数值大的即为
北京航空航天大学《数值分析 A》计算实习报告
第一章 概述
1.1《数值分析 A》计算实习概述
1)目的: 训练运用计算机进行科学与工程计算的能力。 2)要求: (1)独立进行算法设计、程序设计和上机运算,并得出正确的结果; (2)编制程序时全部采用双精度,要求按题目的要求设计输出,并执行 打印。
1.2 题目概述
5)矩阵 A 中与数 k 1 k 求解 根据已经求解得出 1 和 501 的数值,代入式 k 1 k
501 1
40
, k 1, 2, ,39 最接近的特征值 ik 的
501 1
40
中,利用
VC++ 中 的 for 循 环 语 句 求 解 出 k , k 1, 2, ,39 的 数 值 , 矩 阵
第二章 算法的设计方案 ........................................................................................... 3
2.1 题目分析 ................................................................................................................ 3 2.2 算法设计 ................................................................................................................ 3
5.1 迭代初始向量的选取对结果的影响 ............................................................ 16 5.2 讨论................................................................ 16
//定义常量b、c
/************************************************************************/ /* 函数: 输入稀疏矩阵A的主对角线元素, 将A存储于二维数组C中(为了节约存储空间)*/ /************************************************************************/ void Structure(double Diagonal_A[] , double Store_C[][N] ) { int i; Store_C[0][0]=Store_C[0][1]=Store_C[1][0]=Store_C[4][N-1]=Store_C[4][N-2]=St ore_C[3][N-1]=0; for (i=2;i<N;i++) { Store_C[0][i]=c; } for (i=1;i<N;i++) { Store_C[1][i]=b; } for (i=0;i<N;i++) { Store_C[2][i]=Diagonal_A[i]; } for (i=0;i<N-1;i++) { Store_C[3][i]=b; } for (i=0;i<N-2;i++) { Store_C[4][i]=c; } }
cond ( A)2
1 10.7001 1925.204 ,即为所求矩阵 A 的条件数。行列式 n 0.0055579
detA 的求解,对矩阵 A 先进行 LU 分解,然后利用 VC++的 for 循环语句, 求取 U 的对角线元素乘积, 所得数值即为即为矩阵 A 的行列式值。 求解得出 的 detA=2.772786141752E+118;
1.1《数值分析 A》计算实习概述 .......................................................................... 1 1.2 题目概述 ................................................................................................................ 1
2
北京航空航天大学《数值分析 A》计算实习报告
第二章 算法的设计方案 2.1 题目分析
由题目所求问题出发,结合题目已知条件方阵 A 为实对称矩阵,并且
1 2 501 ,根据已有知识:对非奇异的实对称矩阵 A 有 cond ( A) 1 2 n
( 1 和 n 分别是矩阵 A 的模为最大和模为最小的特征值) ; 由定义可知,S 相当 于为矩阵 A 的按模最小的特征值; 数 k 1 k
0.1 i
, b 0.16, c 0.064 , 矩阵 A 的特征值
i (i 1, 2, , 501) 满足 1 2 …… 501,|s|=min|i|;
试求: (1) 1 , 501 和 s 的值; (2)A 的与数 k 1 k
501 1
《数值分析 A》计算实习 题目:
幂法和反幂法求矩阵特征值
院(系)名 专 班 学 姓 业 名
称 称 级 号 名
机械工程及自动化学院 航空宇航制造工程 SY12073 班 SY1207415 陈俊
2012 年 10 月
目录 第一章 概述 ..................................................................................................................... 1
S t o r e _A D k I ,即有 Store_D[2][ i ] Store_D[2][ i ]k ,对其采用反幂法
求解按模最小的特征值 ' ,则与 k 最接近的对应的特征值 ik 6)矩阵 A 的条件数 cond(A)2 和行列式 detA 的求解 因为 A 是非奇异的实对称矩阵,所以有 cond ( A) 2
3
北京航空航天大学《数值分析 A》计算实习报告
2)幂法的算法说明及程序流程图 (1)幂法的算法说明 A. 取初始向量u[i] B. 初始向量的2——范数 C. 将初始向量单位化,得到初始迭代向量 D. 算法迭代 E. 求出特征值 (2)幂法程序流程图
入口
任选初始迭代向量U 0
k 1 u(Tk 1)uk 1
4.1 结果输出 ............................................................................................................. 15
第五章 关于迭代初始向量的选取讨论 ......................................................... 16
1
'
k ;
1 ( 1 和 n 分别是 n
矩阵 A 的模为最大和模为最小的特征值) ;由已经求解出的 1 , 501 和 S 的 数值( 1 10.7001 , 501 9.7246 , S 0.0055579 ; ) ,可以判断得出按模 最大和按模最小的特征值分别为 1 10.7001 , S 0.0055579 将其带入
第三章 全部源程序
// shuzhi1.cpp : 定义控制台应用程序的入口点。
6
北京航空航天大学《数值分析 A》计算实习报告
// #include "stdafx.h" #include "math.h" #define e 1.0e-12 #define N 501 const double b=0.16; const double c=-0.064; //设定精度水平
第三章 全部源程序 ..................................................................................................... 6 第四章 特征值、条件数和行列式值的输出 .............................................. 15
501 三角分解法对矩阵 A 进行 LU 分解, 则行列式值 det A 1 矩 U 主对角线元素;
阵 A 中与 k 最接近的特征值 ik 可以用反幂法求解矩阵 ( A k I ) 按模最小的特 征值 '' ,则 ik
1
''
uk 。
2.2 算法设计
1)方阵 A 的存储 方阵 A 为 501 阶实对称方阵, 且上下半带宽均为 2, 属于大型带状矩阵, 为了节省存储量,方阵 A 的带外元素不给存储,仅存 A 的带内元素。为此, 设置一个二维数组 Store_C(m ,n) ,用于存放方阵 A 的带内元素,其中 m=2+2+1=5,n=501。数组 C 的第 j 列存放方阵 A 的第 j 列带内元素,并使 方阵 A 的主对角线元素存放在数组 C 的第 3 行中。数组 C 存放完方阵 A 的 带内元素后,多出的单元取零,这些零元共有(1+2)+(1+2)=6 个。在数 组 C 中检索方阵 A 的带内元素的方法是: A 的带内元素 aii =C 中的元素 ci j 2, j ;
相关文档
最新文档