⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 type.txt

📁 用幂法与反幂法求矩阵的最大特征值及最小特征值
💻 TXT
📖 第 1 页 / 共 2 页
字号:
Task1源程序

//105012001057     杨舟
#include "Special.h"
#include <math.h>
#include <stdio.h>

void main ()
{
	printf("作业一,用幂法与反幂法,求解矩阵的最大、最小特征值及所有特征相量\n");
	printf("作者 :105012001057     杨舟\n");
	printf("在生成的.txt文件中看结果\n");
    SolveProblem();
}
#include<math.h>
#include<stdio.h>
#include <conio.h>
#include <process.h>
#define N 501

int Function(b,d,n,l,il,m)
int n,l,il,m;
double b[],d[];
{
	int ls,k,i,j,is,u,v;
	double p,t;
	if(il!=2*l+1)
		printf ("fail !\n");return (-2);
	ls=l;
	for (k=0;k<n-1;k++){
		p=0.0;
		for (i=k;i<=ls;i++){
			t=fabs (b[i*il]);
			if(t>p)  p=t;is=i;	
		}
		if(p+1.0==1.0)printf("fail!\n");return (0);
		for (j=0;j<m;j++) {
			u=k*m+j;v=is*m+j;
			t=d[u];
			d[u]=d[v];
			d[v]=t;
		}
		for (j=0;j<il;j++){
			u=k*il+j;
			v=is*il+j;
			t=b[u];
			b[u]=b[v];
			b[v]=t;
		}
		for (j=0;j<m;j++){
			u=k*m+j;
			d[u]/=b[k*il];
		}
		for (j=1;j<il;j++){
			u=k*il+j;
			b[u]/=b[k*il];
		}
	 	for (i=k+1;i<=ls;i++){
			t=b[i*il];
			for (j=0;j<m;j++){
				u=i*m+j;
				v=k*m+j;
				d[u]-=t*d[v];
			}
			for (j=1;j<il;j++){
				u=i*il+j;
				v=k*il+j;
				b[u-1]=b[u]-t*b[v];
			}
			u=i*il+il-1;
			b[u]=0.0;
			}
			if(ls!=n-1) ls++;
		}
		p=b[(n-1)*il];
		if (fabs(p)+1.0==1.0){
			printf("fail!\n");
			return(0);
		}
		for(j=0;j<m;j++){
			u=(n-1)*m+j;
			d[u]/=p;
		}
		ls=1;
		for (i=n-2;i>=0;i--){
			for (k=0;k<m;k++){
				u=i*m+k;
				for(j=1;j<=ls;j++){
					v=i*il+j;is=(i+j)*m+k;
					d[u]-=b[v]*d[is];
				}
			}
			if(ls!=il-1) ls++;
		}
	return (2);
}


void SolveProblem()
{
	FILE * fp;
	static double s[N][5],h[N][5],a[N], b[N],c[N],d,e,f,g,MAX,MIN;
	int n,m,i,j,k;
	if ((fp=fopen("File1.txt","w"))==NULL){
		printf("can't open file");
		exit(0);
	}
	//利用矩阵的特殊形态采用幂法求矩阵的最大特征植及其特征向量
	for (i=0;i<N;i++){
		a[i]=(20.2-0.3*i)*sin(0.2*i+0.2);
		b[i]=0.1;
	}
	for (j=0;j<2000;j++){
		d=f=0;
		for(k=0;k<N;k++)
			d+=b[k]*b[k];
		d=sqrt (d);
		for (m=0;m<N;m++)
			c[m]=b[m]/d;
		for (n=2;n<N-2;n++)
			b[n]=-c[n-2]+2*c[n-1]+c[n]*a[n]+2*c[n+1]-c[n+2];
		b[0]=a[0]*c[0]+2*c[1]-c[2];
		b[1]=2*c[0]+a[1]*c[1]+2*c[2]-c[3];
		b[N-2]=-c[N-4]+2*c[N-3]+a[N-2]*c[N-2]+2*c[N-1];
		b[N-1]=-c[N-3]+2*c[N-2]+a[N-1]*c[N-1];
		for (i=0;i<N;i++)
			f+=b[i]*c[i];
		if(fabs((f-g)/f)<1.0e-12){
			MAX=f;
			break;
		}
		g=f;
		}
	for(i=0;i<N;i++){
		if (c[i]<1.0e-12)
			c[i]=0;
	}
	fprintf (fp,"最大特征值 MAX=%e \n",f);
	fprintf (fp,"最大特征向量如下: \n",f);
	for (i=0;i<20;i++)  fprintf(fp,"Ymax[%2d]=%12e   Ymax[%2d]=%12e\n",i,c[i],i+480,c[480+i]);
//采用矩阵的特殊形态利用反幂法及矩阵位移求矩阵的最小特征值及其特征向量
	for(i=2;i<N;i++){
		s[i][2]=(20.2-0.3*i)*sin(0.2*i+0.2);
		s[i][1]=s[i][3]=2;
		s[i][0]=s[i][4]=-1;
	}
	s[0][3]=s[0][4]=s[1][4]=s[N-2][4]=s[N-1][3]=s[N-1][4]=0;
	s[0][0]=20.2*sin(0.2);
	s[1][1]=19.9*sin(0.4);
	s[1][0]=s[0][1]=s[1][2]=2;
	s[0][2]=s[1][3]=-1;
	for (i=0;i<N;i++)	b[i]=1;
	for (j=0;j<2000;j++) {
		d=f=0;
		for(k=0;k<N;k++)
			d+=b[k]*b[k];
		d=sqrt (d);
		for(m=0;m<N;m++) {
			c[m]=b[m]/d;
			b[m]=c[m];
			for(k=0;k<5;k++)
			h[m][k]=s[m][k];
		}
		Function(h,b,N,2,5,1);
		for (i=0;i<N;i++)  f+=b[i]*c[i];
		if(fabs((f-g)/f)<1.0e-12){
			MIN=1/f; 
			for(i=0;i<N;i++)
			if (fabs(b[i])<1.0e-12) b[i]=0;
			fprintf (fp,"最小特征值MIN=%e \n",1/f);
			fprintf (fp,"最小特征向量如下: \n",f);
			for (i=0;i<20;i++)
			fprintf(fp,"Ymin[%2d]=%12e   Ymin[%2d]=%12e\n",i,b[i],i+480,b[480+i]);
			break;
		}
		g=f ;
	}
//采用矩阵的特殊形态利用反幂法及矩阵的位移求矩阵的最接近MIN+(MAX-MIN)*i/40   i=1,2,3......39的特征值
	fprintf (fp,"前39个特征值如下: \n",f);
	for (n=1;n<40;n++){
		for(i=2;i<N;i++)  s[i][2]=(20.2-0.3*i)*sin(0.2*i+0.2)-MIN-(MAX-MIN)*n/40;
		s[0][0]=20.2*sin(0.2)-MIN-(MAX-MIN)*n/40;
		s[1][1]=19.9*sin(0.4)-MIN-(MAX-MIN)*n/40;
		for (i=0;i<N;i++)
		b[i]=1;
		for (j=0;j<2000;j++){
			d=f=0;
			for(k=0;k<N;k++)
				d+=b[k]*b[k];
			d=sqrt (d);
			for (m=0;m<N;m++){
				c[m]=b[m]/d;
				b[m]=c[m];
				for(k=0;k<5;k++)
				h[m][k]=s[m][k];
			}
			fprintf (fp,"前39个特征值如下: \n",f);
			Function(h,b,N,2,5,1);
			for (i=0;i<N;i++)   f+=b[i]*c[i];
			if(fabs((f-g)/f)<1.0e-12){
				fprintf (fp,"R[%2d]=%e \n",n,1/f+MIN+(MAX-MIN)*n/40);
				break;
			}
			g=f;
		}
	}
	fprintf(fp,"cond(A)2=%e",fabs(MAX/MIN));
	fclose(fp);
}

输出结果:
最大特征值MAX=1.295227e+002 
最大特征向量:
Ymax[ 0]=0.000000e+000   Ymax[480]=2.631399e-007
Ymax[ 1]=0.000000e+000   Ymax[481]=0.000000e+000
Ymax[ 2]=0.000000e+000   Ymax[482]=1.029005e-008
Ymax[ 3]=0.000000e+000   Ymax[483]=0.000000e+000
Ymax[ 4]=0.000000e+000   Ymax[484]=1.458288e-009
Ymax[ 5]=0.000000e+000   Ymax[485]=1.527734e-008
Ymax[ 6]=0.000000e+000   Ymax[486]=0.000000e+000
Ymax[ 7]=0.000000e+000   Ymax[487]=0.000000e+000
Ymax[ 8]=0.000000e+000   Ymax[488]=1.991713e-005
Ymax[ 9]=0.000000e+000   Ymax[489]=3.216506e-004
Ymax[10]=0.000000e+000   Ymax[490]=0.000000e+000
Ymax[11]=0.000000e+000   Ymax[491]=0.000000e+000
Ymax[12]=0.000000e+000   Ymax[492]=0.000000e+000
Ymax[13]=0.000000e+000   Ymax[493]=4.295616e-001
Ymax[14]=0.000000e+000   Ymax[494]=8.650533e-001
Ymax[15]=0.000000e+000   Ymax[495]=2.564592e-001
Ymax[16]=0.000000e+000   Ymax[496]=0.000000e+000
Ymax[17]=0.000000e+000   Ymax[497]=0.000000e+000
Ymax[18]=0.000000e+000   Ymax[498]=1.145012e-004
Ymax[19]=0.000000e+000   Ymax[499]=1.914237e-004
最小特征值MIN=-8.522555e-002 
最小特征向量:
Ymin[ 0]=0.000000e+000   Ymin[480]=0.000000e+000
Ymin[ 1]=0.000000e+000   Ymin[481]=0.000000e+000
Ymin[ 2]=0.000000e+000   Ymin[482]=0.000000e+000
Ymin[ 3]=0.000000e+000   Ymin[483]=0.000000e+000
Ymin[ 4]=0.000000e+000   Ymin[484]=0.000000e+000
Ymin[ 5]=0.000000e+000   Ymin[485]=0.000000e+000
Ymin[ 6]=0.000000e+000   Ymin[486]=0.000000e+000
Ymin[ 7]=0.000000e+000   Ymin[487]=0.000000e+000
Ymin[ 8]=0.000000e+000   Ymin[488]=0.000000e+000
Ymin[ 9]=0.000000e+000   Ymin[489]=0.000000e+000
Ymin[10]=-2.421502e-012   Ymin[490]=0.000000e+000
Ymin[11]=7.953745e-012   Ymin[491]=0.000000e+000
Ymin[12]=-1.605720e-011   Ymin[492]=0.000000e+000
Ymin[13]=5.367981e-011   Ymin[493]=0.000000e+000
Ymin[14]=-1.308649e-011   Ymin[494]=0.000000e+000
Ymin[15]=2.314420e-010   Ymin[495]=0.000000e+000
Ymin[16]=5.556372e-010   Ymin[496]=0.000000e+000
Ymin[17]=8.390359e-010   Ymin[497]=0.000000e+000
Ymin[18]=1.477916e-011   Ymin[498]=0.000000e+000
Ymin[19]=-4.625589e-009   Ymin[499]=0.000000e+000
前39个特征值:
R[ 1]=3.056388e+000 
R[ 2]=6.489945e+000 
R[ 3]=9.564912e+000 
R[ 4]=1.275439e+001 
R[ 5]=1.632627e+001 
R[ 6]=1.921472e+001 
R[ 7]=2.229771e+001 
R[ 8]=2.597543e+001 
R[ 9]=2.868669e+001 
R[10]=3.193983e+001 
R[11]=3.564729e+001 
R[12]=3.937208e+001 
R[13]=4.197839e+001 
R[14]=4.522796e+001 
R[15]=4.888966e+001 
R[16]=5.159172e+001 
R[17]=5.538324e+001 
R[18]=5.852370e+001 
R[19]=6.161734e+001 
R[20]=6.466978e+001 
R[21]=6.821488e+001 
R[22]=7.171427e+001 
R[23]=7.464117e+001 
R[24]=7.759094e+001 
R[25]=8.087850e+001 
R[26]=8.397963e+001 
R[27]=8.701173e+001 
R[28]=9.025961e+001 
R[29]=9.358174e+001 
R[30]=9.576691e+001 
R[31]=1.005445e+002 
R[32]=1.033006e+002 
R[33]=1.075460e+002 
R[34]=1.107756e+002 
R[35]=1.136181e+002 
R[36]=1.160765e+002 
R[37]=1.201132e+002 
R[38]=1.236528e+002 
R[39]=1.269185e+002 
cond(A)2=1.519763e+003

Task2 源程序

#include "InLinearEquation.h"

//function declaration
double MAX(double a[5]);
int xDooLittle(int n,double a[5][5],double b[5]);
void m_Multi(double *a, double *b, double *c, int la, int lb, int lc, int r, int s, int t);
						
void Transpose(double *a, double *ta, int la, int lta, int n, int m);
							
double Inverse(double *a, double *b, int la, int lb, int n);					
void InLinearEquation();


void main()
{
	printf("作业二,用迭代法求解非线性方程组\n");
	printf("作者 :31090124     杨鸿元\n");
	printf("在生成的.txt文件中看结果\n");
	InLinearEquation();
}

//InLinearEquation.h
//includes files here
#include <conio.h>
#include <math.h>
#include <memory.h>
#include <process.h>
#include <stdio.h>


int xDooLittle(int n,double a[5][5],double b[5])
//DooLittle 分解法子程序
{
	int i,j,k,t,i_k,m[5];
	double u[5][5],l[5][5],s[5],y[5],r[5],d[5],a1[5][5],b1[5];
	double u_x,l_u,max,temp,a_x;
    for(i=0;i<=4;i++)
		for(j=0;j<=4;j++)	a1[i][j]=a[i][j];		
		for(i=0;i<=4;i++)	b1[i]=b[i];			
	for(k=1;k<=n;k++){ 
		for(i=k;i<=n;i++){	
			l_u=0;
			for(t=1;t<=k-1;t++)  
				l_u=l_u+l[i-1][t-1]*u[t-1][k-1];
			s[i-1]=a[i-1][k-1]-l_u;
		}
		max=fabs(s[k-1]);
		i_k=k;
		m[k-1]=k;
		for(i=k;i<=n;i++){
			if(fabs(s[i-1])>max){
				max=fabs(s[i-1]);
				i_k=i;
			    m[k-1]=i_k;
			}
		}
		if(i_k!=k){
			for(t=1;t<=k-1;t++){   
				temp=l[k-1][t-1];
				l[k-1][t-1]=l[i_k-1][t-1];
				l[i_k-1][t-1]=temp;
			}
			for(t=k;t<=n;t++){			
				temp=a[k-1][t-1];
				a[k-1][t-1]=a[i_k-1][t-1];
				a[i_k-1][t-1]=temp;
			}
            temp=s[k-1];
			s[k-1]=s[i_k-1];
			s[i_k-1]=temp;
		}
		u[k-1][k-1]=s[k-1];
	    for(j=k+1;j<=n;j++){		
			l_u=0;
			for(t=1;t<=k-1;t++)  l_u=l_u+l[k-1][t-1]*u[t-1][j-1];
			u[k-1][j-1]=a[k-1][j-1]-l_u;
		}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -