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

📄 huyugv.cpp

📁 运用lu分解法解非齐次方程.非常好的程序 希望能给别人一个借鉴
💻 CPP
字号:
#  include "stdio.h"
#  include "math.h"
#  include <iostream.h>
#  include "fstream.h"
#  include "stdlib.h"
#  define MAX 200
#  define N   200
double U[N][N],L[N][N];
void InputData(int *p,double a[MAX][MAX],double b[MAX])
{
	int i,j;
	ifstream infile("data.txt",ios::in|ios::nocreate);
	if(!infile)
	{
		cout<<"ERROR:不能打开输入文件!";
		exit(1);
	}
	infile>>*p;
    printf("从Data.txt中读入的方程的阶数为%d:\n",*p);
	printf("方程的系数:\n");

    for(i=0;i<*p;i++)
	{	
		for(j=0;j<*p;j++)
		{
           infile>>a[i][j];
		   printf("%lf  ",a[i][j]);
        }
		printf("\n");
	}
    printf("向量b:\n");
    for(i=0;i<*p;i++)
	{
		infile>>b[i];
		printf("%lf  ",b[i]);
    }
    printf("\n");
}

void lut(int n,double a[MAX][MAX],double b[MAX])
{   
    double y[N];
    double x[N];
    int i,j,k;
    double sum;

	for(i=0;i<N;i++)
	for(j=0;j<N;j++)
	{
			L[i][j]=0;
			U[i][j]=0;
	}
    if (a[0][0]==0) { printf("No answer"); getchar();}
    for(j=0;j<n;j++)
        U[0][j]=a[0][j];

    for(j=1;j<n;j++)
        L[j][0]=a[j][0]/U[0][0];
 for(i=1;i<n;i++)
 {
   sum=0;
   for(k=0;k<i;k++) sum=sum+L[i][k]*U[k][i];
   U[i][i]=a[i][i]-sum;
   if(U[i][i]==0)  { printf("No answer"); getchar();}
        for(j=i+1;j<n;j++)
        {
             sum=0;
             for(k=0;k<i;k++) sum=sum+L[i][k]*U[k][j];
             U[i][j]=a[i][j]-sum;
             sum=0;
             for(k=0;k<i;k++) sum=sum+L[j][k]*U[k][i];
             L[j][i]=(a[j][i]-sum)/U[i][i];
        }

 }
   for (i=0;i<n;i++)
   {         
	         L[i][i]=1;
             y[0]=b[0]/L[0][0];
             sum=0  ;
             for (k=0;k<i;k++)   sum=sum+L[i][k]*y[k];
             y[i]=(b[i]-sum)/L[i][i];
    }

   x[n-1]=y[n-1]/U[n-1][n-1];

      for (i=1;i<n;i++)
      {  
	     k=n-1-i;
         sum=0;
         for(j=k+1;j<n+1;j++)
             sum=sum+U[k][j]*x[j];
         x[k]=(y[k]-sum)/U[k][k];
      }
	  //printf("\nx[N]:\n");
	  for (i=0;i<n;i++)
      {		  b[i]=x[i];
              //printf("%lf ",x[i]);
	  }
}



void main()
{
int xuanze;
int i,j,k,n;
double c;
double a[MAX][MAX];
double b[MAX];
int state=0;
double lanmuda,d,e,Nmax;
double r[MAX],x[MAX];
memu:
printf("                        ╭═══════════════╮\n");
printf("                        ║       LU分解求解方程         ║\n");
printf("    ╭═════════┤                              ├═════════╮\n");
printf("    ║                  ║     沈红丽,高莲,胡玉贵       ║                  ║\n ");
printf("   ║                  ╰═══════════════╯                  ║\n ");
printf("   ║                                                                      ║\n");
printf("    ║                【 1 】.利用LU分解法求方程的解(Data.txt)              ║\n");
printf("    ║                【 2 】.计算希尔伯特矩阵的解                          ║\n");
printf("    ║                【 3 】.退出程序                                      ║\n"); 
printf("    ║                  (输入数字选择相应程序)                              ║\n");
printf("    ╰═══════════════════════════════════╯\n");
printf("请输入选择:");
scanf("%d",&xuanze);
if(xuanze==1)
{

    //printf("输入系数矩阵阶数n:");
    //scanf("%d",&n);

    //if(n>MAX)                        |
     //{printf("超出范围\n");while(1);}
    //else
     
    /* printf("输入系数:\n");
     for(i=0;i<n;i++)
       for(j=0;j<n;j++)
       scanf("%lf",&a[i][j]);

      printf("输入向量b:\n");
      for(i=0;i<n;i++)
      scanf("%lf",&b[i]);



     printf("输入的方程组为:\n");
     for(i=0;i<n;i++)
     {
       for(j=0;j<n;j++)
         printf(" %lf  ",a[i][j]);
         printf("    %lf \n",b[i]);
     }*/


	 InputData(&n,a,b);
     lut(n,a,b);
     printf("\n分解后的L矩阵:\n");
     for(i=0;i<n;i++)
     {
       for(j=0;j<n;j++)
           printf(" %lf  ",L[i][j]);
       printf("\n");
     }

	 printf("\n分解后的U矩阵:\n");
     for(i=0;i<n;i++)
     {
       for(j=0;j<n;j++)
           printf(" %lf  ",U[i][j]);
       printf("\n");
     }
     printf("\n输入方程组的解为:\n");
	 for(i=0;i<n;i++)
	 {
		 printf("x[%d]=%lf\n",i,b[i]);
	 }
	 goto memu;

   

}




else if(xuanze==2)
{


   printf("输入hilbert矩阵的阶数n: ");
   scanf("%d",&n);
   d=1/(double)n/2;

   printf("希尔伯特矩阵系数a:\n");
   for(i=0;i<n;i++)
   {  b[i]=0;
      for(j=0;j<n;j++)
      {a[i][j]=1/(double)(i+j+2);
       b[i]=b[i]+1/(double)(i+j+2);
       printf("  %lf",a[i][j]);
	   if((i*n+j+1)%7==0)printf("\n");
      }
      
   }
   printf("\n希尔伯特矩阵系数b:\n");
   for(i=0;i<n;i++)
   {   
	  printf("  %lf",b[i]);
      if((i+1)%7==0)printf("\n");
   }
   //printf("shu ru lanmuda( 0<lanmuda<=%lf )\n",d*d/9);
   //scanf("%lf",&lanmuda);
   lanmuda=d*d/9;
   printf("\n输入最大迭代次数Nmax: ");
   scanf("%lf",&Nmax);
   printf("输入计算精度e: ");
   scanf("%lf",&e);

   for(i=0;i<n;i++)
        a[i][i]=a[i][i]+lanmuda ;
   //liezhuyuan(n,a,b);
   lut(n,a,b);
   for(i=0;i<n;i++)
      x[i]=b[i];

   for(k=1;k<=Nmax;k++)
   {


   for(i=0;i<n;i++)
   {  b[i]=0;
      for(j=0;j<n;j++)
      {
	   a[i][j]=1/(double)(i+j+2);
       b[i]=b[i]+1/(double)(i+j+2);
      }
   }

      for(i=0;i<n;i++)
      {
         r[i]=b[i];
         for(j=0;j<n;j++)
         r[i]=r[i]-a[i][j]*x[j];
       /*  printf("  %lf  \n",r[i]);  */

      }
      for(i=0;i<n;i++)
        a[i][i]=a[i][i]+lanmuda;
      lut(n,a,b);

      c=0;
      for(i=0;i<n;i++)
      {
      x[i]=x[i]+r[i];
      if(c<fabs(r[i]))
      c=fabs(r[i]);
      }
      if(c<e)
        {
		  printf("\n计算结果:\n");
		  printf("======================================================================\n");
          for(i=0;i<n;i++)
		  {
               
			  printf("x[%3d]=%lf   ",i+1,x[i]);
			  if((i+1)%4==0)printf("\n");
          }

		  printf("\n=====================================================================\n");
		  //printf("\n迭代的次数为%d\n",k);
        //while(1);
        break;
        }
        
   }
   //printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
   goto memu; 
   getchar();
}
else 
{
	exit(1);//退出;
}
 
}

⌨️ 快捷键说明

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