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

📄 type.txt

📁 用幂法与反幂法求矩阵的最大特征值及最小特征值
💻 TXT
📖 第 1 页 / 共 2 页
字号:
        for(i=k+1;i<=n;i++)  l[i-1][k-1]=s[i-1]/u[k-1][k-1];		
	}
	for(k=1;k<=n-1;k++)	{
		temp=b[k-1];
		b[k-1]=b[m[k-1]-1];
		b[m[k-1]-1]=temp;
	}
	y[0]=b[0];
	for(i=2;i<=n;i++){
		l_u=0;
		for(t=1;t<=i-1;t++) l_u=l_u+l[i-1][t-1]*y[t-1];	
		y[i-1]=b[i-1]-l_u;
	}
	x[n-1]=y[n-1]/u[n-1][n-1];
	for(i=n-1;i>=1;i--){
		u_x=0;
		for(t=i+1;t<=n;t++)u_x=u_x+u[i-1][t-1]*x[t-1];
		x[i-1]=(y[i-1]-u_x)/u[i-1][i-1];
	}
	do{
		for(i=0;i<=4;i++){
			a_x=0;
			for(j=0;j<=4;j++) a_x=a_x+a1[i][j]*x[j];
			r[i]=b1[i]-a_x;
		}
	    y[0]=r[0];
		for(i=2;i<=n;i++){
			l_u=0;
			for(t=1;t<=i-1;t++)l_u=l_u+l[i-1][t-1]*y[t-1];
			y[i-1]=r[i-1]-l_u;
		}
		d[n-1]=y[n-1]/u[n-1][n-1];
		for(i=n-1;i>=1;i--){
			u_x=0;
			for(t=i+1;t<=n;t++)u_x=u_x+u[i-1][t-1]*d[t-1];	
			d[i-1]=(y[i-1]-u_x)/u[i-1][i-1];
		}
		for(i=0;i<=4;i++)x[i]=x[i]+d[i];			
	}while(MAX(d)/MAX(x)>1e-12);//精度1e-12时中止循环
    return 1;
}

void m_Multi(double *a, double *b, double *c, int la, int lb, int lc, int r, int s, int t)
	//求r*s阶矩阵A与s*t阶矩阵B的乘积矩阵C
{
   int i, j, k;
   for (i=0; i<r; i++)
	   for (j=0; j<t; j++){
		   *(c+i*lc+j)=0;
		   for (k=0; k<s; k++)*(c+i*lc+j)+=*(a+i*la+k)*(*(b+k*lb+j));
	   }
}

void Transpose(double *a, double *ta, int la, int lta, int n, int m)
		//求n*m阶矩阵A的转置TA
{
   int i, j;
   for (i=0; i<m; i++)
      for (j=0; j<n; j++) *(ta+i*lta+j)=*(a+j*la+i);    
}
double Inverse(double *a, double *b, int la, int lb, int n)
        //求n阶方阵A的逆矩阵B
{
   int i, j, k;
   double temp;
   for(i=0; i<n; i++)
      for(j=0; j<n; j++)
		if (i==j)
		    *(b+i*lb+j)=1;
		else
			*(b+i*lb+j)=0;
   for (k=0; k<n; k++){
      j=k;
      for (i=k+1; i<n; i++)
		  if (fabs(*(a+i*la+k))>fabs(*(a+j*la+k)))j=i;
      if (j!=k)
	      for (i=0; i<n; i++){
	      temp=*(a+j*la+i);
	      *(a+j*la+i)=*(a+k*la+i);
	      *(a+k*la+i)=temp;
	      temp=*(b+j*lb+i);
	      *(b+j*lb+i)=*(b+k*lb+i);
	      *(b+k*lb+i)=temp;
		  }
      if (*(a+k*la+k)==0)
	      return 0;
      if ((temp=*(a+k*la+k))!=1)
	  for (i=0; i<n; i++){
		  *(a+k*la+i)/=temp;
	      *(b+k*lb+i)/=temp;
	  }
      for (i=0; i<n; i++)
		 if ((*(a+i*la+k)!=0) && (i!=k)){
	         temp=*(a+i*la+k);
	         for (j=0; j<n; j++){
				 *(a+i*la+j)-=temp*(*(a+k*la+j));
				 *(b+i*lb+j)-=temp*(*(b+k*lb+j));
			 }
		 }
   }
   return 0;
}

double x[5];
double MAX(double a[5])//求最大值
{
	int i;
	double b[5],max;
	for(i=0;i<=4;i++)b[i]=fabs(a[i]);
    max=b[0];
	for(i=0;i<=4;i++)if(b[i]>max)max=b[i];		
	return(max);
}

void InLinearEquation()
		//求n*m阶矩阵A的转置TA
{
	double bb[5],z[5][31][21],dd[5];
	int i,j,m;
	double jj[5][5],d[5],cc[5],ss[5];
	FILE *fp;
	
    for(i=0;i<=30;i++){
       for(j=0;j<=20;j++){	   
            z[0][i][j]=6.7;
			z[1][i][j]=15.6765-0.270079*(i+j);
			z[2][i][j]=5.30249+0.1410822*(i+j);
			z[3][i][j]=15;
			z[4][i][j]=29.9983-0.2366318*(i+j);			
            do{		
                cc[0]=z[0][i][j];
				cc[1]=z[1][i][j];
				cc[2]=z[2][i][j];
				cc[3]=z[3][i][j];
				cc[4]=z[4][i][j];
                jj[0][0]=-exp(-z[0][i][j]);
				jj[1][0]=-2*exp(-2*z[0][i][j]);
				jj[2][0]=1+0.008*i;
				jj[3][0]=2;
				jj[4][0]=1;
				jj[0][1]=-2*exp(-2*z[1][i][j]);
				jj[1][1]=-exp(-z[1][i][j]);
				jj[2][1]=3;
				jj[3][1]=1+0.008*j;
				jj[4][1]=-2;
				jj[0][2]=1;
				jj[1][2]=-2;
				jj[2][2]=-exp(-z[2][i][j]);
				jj[3][2]=1;
				jj[4][2]=-3*(1+0.008*i);
				jj[0][3]=-2;
				jj[1][3]=1;
				jj[2][3]=0;
				jj[3][3]=exp(-z[3][i][j]);
				jj[4][3]=-2*exp(-2*z[3][i][j]);
				jj[0][4]=1;
				jj[1][4]=-1;
				jj[2][4]=-3;
				jj[3][4]=-4*exp(-2*z[4][i][j]);
				jj[4][4]=-3*exp(-z[4][i][j]);
                bb[0]=-(exp(-z[0][i][j])+exp(-2*z[1][i][j])+z[2][i][j]-2*z[3][i][j]+(1+0.008*i)*z[4][i][j]-5.3);
			    bb[1]=-(exp(-2*z[0][i][j])+exp(-z[1][i][j])-2*z[2][i][j]+(1+0.008*j)*z[3][i][j]-z[4][i][j]+25.6);
                bb[2]=-((1+0.008*i)*z[0][i][j]+3*z[1][i][j]+exp(-z[2][i][j])-3*z[4][i][j]+37.8);
			    bb[3]=-(2*z[0][i][j]+(1+0.008*j)*z[1][i][j]+z[2][i][j]-exp(-z[3][i][j])+2*exp(-z[4][i][j])-31.3);
			    bb[4]=-(z[0][i][j]-2*z[1][i][j]-3*(1+0.008*i)*z[2][i][j]+exp(-2*z[3][i][j])+3*exp(-z[4][i][j])+42.1);
	            for(m=0;m<=4;m++){
					 ss[m]=MAX(jj[m]);
					 jj[m][m]=jj[m][m]/ss[m];
					 bb[m]=bb[m]/ss[m];
				}
                xDooLittle(5,jj,bb);	
                dd[0]=z[0][i][j]=x[0]+z[0][i][j];
				dd[1]=z[1][i][j]=x[1]+z[1][i][j];
				dd[2]=z[2][i][j]=x[2]+z[2][i][j];
				dd[3]=z[3][i][j]=x[3]+z[3][i][j];
				dd[4]=z[4][i][j]=x[4]+z[4][i][j];
                d[0]=z[0][i][j]-cc[0];
				d[1]=z[1][i][j]-cc[1];
				d[2]=z[2][i][j]-cc[2];
				d[3]=z[3][i][j]-cc[3];
				d[4]=z[4][i][j]-cc[4];
			}while(MAX(d)/MAX(cc)>1e-12); //精度1e-12时中止循环  
	   }
	}
    int k, r, s, p, q, bestr, bests;
    double t1[31][31], t2[31][31], t3[31][31], c[9][9],bestc[9][9];
    double b[31][9], tb[9][31], g[21][9], tg[9][21];
    double temp, acc, best;
	if ((fp=fopen("output2.txt", "wb"))==NULL){
		printf("Fail to open output file!");
		 exit(-1);
    }
	fprintf(fp, "部分数表:%c\n%c\n", 13, k+1, 13);
	for (i=0; i<31; i++)
        for (j=0; j<9; j++)
			b[i][j]=exp(j*log(1+0.008*i));
    Transpose(b[0], tb[0], 9, 31, 31, 9);
    for (i=0; i<21; i++)
        for (j=0; j<9; j++)
		    g[i][j]=exp(j*log(1+0.008*i));
    Transpose(g[0], tg[0], 9, 21, 21, 9);
    for (k=0; k<5; k++) {
        best=1e-2;
        for (r=1; r<=8; r++)
	        for (s=1; s<=8; s++)
			{
			 m_Multi(tb[0], b[0], t1[0], 31, 9, 31, r+1, 31, r+1);
			 Inverse(t1[0], c[0], 31, 9, r+1);
			 m_Multi(c[0], tb[0], t1[0], 9, 31, 31, r+1, r+1, 31);
			 m_Multi(t1[0], z[k][0], t2[0], 31, 21, 31, r+1, 31, 21);
			 m_Multi(tg[0], g[0], t1[0], 21, 9, 31, s+1, 21, s+1);
			 Inverse(t1[0], c[0], 31, 9, s+1);
			 m_Multi(c[0], tg[0], t3[0], 9, 21, 31, s+1, s+1, 21);
			 Transpose(t3[0], t1[0], 31, 31, s+1, 21);
			 m_Multi(t2[0], t1[0], c[0], 31, 31, 9, r+1, 21, s+1);
	    //求最小二乘法中的拟合系数矩阵C
			 acc=0;
	    //求在指定的r和s下,拟合公式的精度
			 for (i=0; i<31; i++)
			     for (j=0; j<21; j++){
					 temp=0;
					 for (p=0; p<r+1; p++)
						 for (q=0; q<s+1; q++)
							temp+=c[p][q]*b[i][p]*g[j][q];
					 acc+=(z[k][i][j]-temp)*(z[k][i][j]-temp);
					 if ((acc>best) && (k!=0)) {					 
					    i=30;
					    j=20;
					    continue;
					 }
				 }
	    //输出zi=fi(x, y)拟合过程的r, s值和对应精度
	    if (k==0)fprintf(fp, "%d%c%d%c%.12le%c\n", r, 9, s, 9, acc, 13);
	    if (acc<best) { //保存最优精度结果
	       best=acc;
	       memcpy(bestc, c, sizeof(c));
	       bestr=r;
	       bests=s;
	    }
	 }
      //输出最优拟合方案和对应的精度
     fprintf(fp, "Pt(x,y)的系数:"%c\n%c\n", 13, k+1, 13);
     fprintf(fp, "%c\nz%d:%c\n", 13, k+1, 13);
     fprintf(fp, "k=%d l=%d accuracy: %.12le", bestr, bests, best);
     if (best<=1e-4)
		 fprintf(fp, "<=1e-4");
     else
		 fprintf(fp, ">1e-4 (failed)");
     fprintf(fp, "%c\nc(r, s):%c\n", 13, 13);
     for (i=0; i<bestr+1; i++){  
		for (j=0; j<bests+1; j++)
			fprintf(fp, "%.12le%c", bestc[i][j], 9);
		fprintf(fp, "%c\n", 13);
     }
   }
   printf("Done.\n");
   printf("All tasks completed. Open output2.txt to browse the results.\n");
   printf("please press Enter to exit!\n");
   while (!getch());
   fclose(fp);
}
task2输出结果:

部分数表:
1	1	8.837745844330e-001
1	2	6.977120301441e-001
1	3	6.975657242540e-001
1	4	6.999987448592e-001
1	5	1.505611588141e+003
1	6	4.512941773705e+004
1	7	1.872649803994e+005
1	8	8.670652930462e+005
2	1	1.898010526061e-001
2	2	3.280174823932e-003
2	3	3.046761279032e-003
2	4	5.471324216509e-003
2	5	1.504958224150e+003
2	6	4.512987625190e+004
2	7	1.872691715069e+005
2	8	8.670865903482e+005
3	1	1.876627568285e-001
3	2	8.984274352364e-004
3	3	6.274730083732e-004
3	4	3.047559417101e-003
3	5	1.504956026712e+003
3	6	4.512987685427e+004
3	7	1.872691874737e+005
3	8	8.670866404649e+005
4	1	1.873706951595e-001
4	2	5.394108140757e-004
4	3	2.552630812187e-004
4	4	1.683926698549e-003
4	5	1.505543018260e+003
4	6	4.512012150653e+004
4	7	1.872376121115e+005
4	8	8.669618613543e+005
5	1	1.903560150663e+001
5	2	1.884888271124e+001
5	3	1.884848162002e+001
5	4	1.843498381677e+001
5	5	1.769558798928e+003
5	6	4.101866467761e+004
5	7	1.738837249515e+005
5	8	8.140227331282e+005
6	1	1.675253908950e+004
6	2	1.675245017068e+004
6	3	1.675244909018e+004
6	4	1.674980919948e+004
6	5	1.890974466200e+004
6	6	7.448958657218e+003
6	7	1.826432783547e+003
6	8	5.334043019742e+003
7	1	2.333469311487e+003
7	2	2.333299309037e+003
7	3	2.333298145718e+003
7	4	2.329999773526e+003
7	5	5.655699643879e+003
7	6	1.106707317870e+004
7	7	6.809671642811e+004
7	8	3.782409390890e+005
8	1	9.696359203662e+003
8	2	9.696230860322e+003
8	3	9.696229609318e+003
8	4	9.692629298974e+003
8	5	1.280172133745e+004
8	6	2.888465168597e+003
8	7	1.397167732040e+004
8	8	1.063996410661e+005

z1:
k=4 l=3 accuracy: 2.552630812187e-004>1e-4 
c(r, s):
-1.475771674723e+005	4.223996105452e+005	-4.029252308762e+005	1.281130833526e+005	
5.414906717227e+005	-1.549750705807e+006	1.478313319854e+006	-4.700683934399e+005	
-7.440916659950e+005	2.129667465746e+006	-2.031644587878e+006	6.460721025574e+005	
4.539439586022e+005	-1.299324668567e+006	1.239638326950e+006	-3.942466781658e+005	
-1.037444357402e+005	2.969736562723e+005	-2.833591242344e+005	9.012562268687e+004	

z2:
k=4 l=3 accuracy: 2.019681005120e-003>1e-4 
c(r, s):
5.023754577229e+005	-1.438698297897e+006	1.373317787138e+006	-4.369770761016e+005	
-1.842917169676e+006	5.278217430674e+006	-5.038549373515e+006	1.603296477792e+006	
2.532653371180e+006	-7.253724039907e+006	6.924555075671e+006	-2.203548934793e+006	
-1.545099847274e+006	4.425390957295e+006	-4.224796867913e+006	1.344518515976e+006	
3.530868499781e+005	-1.011343188483e+006	9.655714696860e+005	-3.073129216001e+005	

z3:
k=4 l=3 accuracy: 8.616686622126e-004>1e-4 
c(r, s):
-3.049601536690e+005	8.732417153219e+005	-8.334163447258e+005	2.651234355719e+005	
1.118931421082e+006	-3.204262216118e+006	3.058249273696e+006	-9.729202803344e+005	
-1.538009406740e+006	4.404458985904e+006	-4.203838337726e+006	1.337425573074e+006	
9.385209624035e+005	-2.687729225892e+006	2.565402509364e+006	-8.162160246987e+005	
-2.145266929748e+005	6.143818012870e+005	-5.864528750963e+005	1.866011823656e+005	

z4:
k=3 l=3 accuracy: 3.232276740079e-004>1e-4 
c(r, s):
-7.981428261743e+003	2.302433528161e+004	-2.222957417791e+004	7.158933779802e+003	
2.200807464150e+004	-6.355998062555e+004	6.142910214419e+004	-1.979220689567e+004	
-2.016932409158e+004	5.842106931024e+004	-5.652356270043e+004	1.822019003321e+004	
6.175464093908e+003	-1.791894243390e+004	1.734385483914e+004	-5.591002131627e+003	

z5:
k=4 l=3 accuracy: 2.735948933337e-003>1e-4 
c(r, s):
4.417669554680e+005	-1.264908236395e+006	1.207271306427e+006	-3.840995498514e+005	
-1.620217650657e+006	4.639831496617e+006	-4.428632496591e+006	1.409072117292e+006	
2.226271714202e+006	-6.375467658814e+006	6.085460830414e+006	-1.936343594474e+006	
-1.357981813204e+006	3.889006193294e+006	-3.712321301291e+006	1.181322507485e+006	
3.102798697371e+005	-8.886322964983e+005	8.483289049685e+005	-2.699773011676e+005	



⌨️ 快捷键说明

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