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

📄 svd.c

📁 由c语言编写的解非线性方程
💻 C
字号:
#include<stdio.h>
#include"svdqj.c"
#define M   5
#define N   5
#define ka  6 // ka=max(M,N)+1
void main()
{
    FILE *fp1,*fp2;FILE *fp3;
	int i,j;
	double a[M][N],b[M],x[N],aa[N][M],u[M][M],v[N][N],eps=0.0001,s;
    char ch1[20],ch2[20],flag1,flag2;
	printf("\n");
	printf("*******************************************************************\n\n");
    printf("                  SVD奇异值分解求解线性方程组\n\n");
	printf("*******************************************************************\n\n");
 
	do
    {
		flag1='a';
	printf("  1.请输入存放线性方程组系数矩阵A的文件名:");
    scanf("%s",ch1);
    printf("  2.请输入存放方程组右端向量b的文件名:");
    scanf("%s",ch2);
    printf("\n");
    if((fp1=fopen(ch1,"r"))==NULL)
	{
      printf("没有找到目标文件%s,是否重新输入文件名<Y/N>?",ch1);
      getchar();
      flag1=getchar();
      
	}
    if((fp2=fopen(ch2,"r"))==NULL)
	{
      printf("没有找到目标文件%s,是否重新输入文件名<Y/N>?",ch2);
      getchar();
      flag1=getchar();
	  
	}
	}while((flag1 == 'y')||(flag1 == 'Y'));
	if((flag1 == 'n')||(flag1 == 'N')) return;
    flag1='y';
    for(i=0;i<M;i++)
	{
	   for(j=0;j<N;j++)
	   {
         fscanf(fp1,"%lf",&a[i][j]);
	   }
        fscanf(fp2,"%lf",&b[i]);
	}
   fclose(fp1);fclose(fp2);

    printf("MAT A(%d*%d)=UWV IS:\n",M,N);
    for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
			printf("%13.4f",a[i][j]);
		printf("\n");
	}
	printf("vector b is:\n");
	for(i=0;i<M;i++)
		printf("%13.4f",b[i]);
    printf("\n\n");
    printf("******文件数据读入是否正确<Y/N>?******\n");
	printf("  Y:  文件数据正确,程序继续运行\n");
	printf("  N:  文件数据错误,返回修改数据\n");
    printf("<command>:");
    getchar();
    flag1=getchar();
	
	if((flag1 != 'Y')&&(flag1 != 'y')) return;
    printf("\n");
	printf("对A进行奇异值分解...显示分解结果<Y/N>?");
	getchar();
    flag2=getchar();
	i=ginv(a,M,N,aa,eps,u,v,ka);
	
	if((flag2 == 'y')||(flag2 == 'Y'))
    {
	printf("MAT U(%d*%d) IS:\n",M,M);
	for(i=0;i<M;i++)
	{
		for(j=0;j<M;j++)
		   printf("%13.4e",u[i][j]);
		printf("\n");
	}
	printf("\n");
    printf("MAT V(%d*%d) IS:\n",N,N);
	for(i=0;i<N;i++)
	{
		for(j=0;j<N;j++)
		   printf("%13.4e",v[i][j]);
		printf("\n");
	}
	printf("\n");
    printf("MAT W(%d*%d) IS:\n",M,N);
	for(i=0;i<M;i++)
	{
		for(j=0;j<N;j++)
		   printf("%13.4e",a[i][j]);
		printf("\n");
	}
    printf("\n");
    printf("MAT A+(%d*%d) is:\n",N,M);
	if(i>0)
	{
        for(i=0;i<N;i++)
		{
	 	  for(j=0;j<M;j++)
			printf("%13.4f",aa[i][j]);
		 printf("\n");
		}
		
	}
	}
     printf("\n");
	for(i=0;i<N;i++)
	{
		s=0.0;
		for(j=0;j<M;j++)
		{ s=s+aa[i][j]*b[j];}
		x[i]=s;
	}
	printf("方程组AX=b的解向量X为:\n\n");
    fp3=fopen("svd_x.txt","w");
	for(i=0;i<N;i++)
	{
		printf("%13.4f",x[i]);fprintf(fp3,"%8.2f",x[i]);
	}
	printf("\n");fclose(fp3);
}

⌨️ 快捷键说明

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