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

📄 lu文档.c

📁 LU分解 用C的算法
💻 C
字号:
#include<stdio.h>
#include<math.h>
#define N  3

double a[][N]={2,-2,3,1,1,1,1,3,-1};
void multmat(double a[N][N],double b[N][N],double c[N][N]) /*multiply two matrixex*/
{
  int i,j,k;
  for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
	  {
		  c[i][j]=0;
		  for(k=0;k<N;k++)
			  c[i][j]+=a[i][k]*b[k][j];
	  }
}

int sign(double x)  /*seek the sign of a variable*/
{
  if(x<=0)
	  return(-1);
  else 
	  return(1);
}

double twomo(double x[N]) /*compute the "||x-y||*||x-y||"*/
{
  int i;
  double sum=0;
  for(i=0;i<N;i++)
	  sum+=pow(x[i],2);
  /*sum=sqrt(sum);*/
  return (sum);
}

void vectormat(double a[N],double c[N][N])   /*acquire (x-y)(x-y)T*/
{
int i,j;
  for(i=0;i<N;i++)
	  for(j=0;j<N;j++)
		  c[i][j]=a[i]*a[j];
	  
}


void main()
{
 int i,j,k;
 double H[N][N],temp[N][N],Q[N][N],h[N]={0,0,0};
 double sum;
 for(k=0;k<N-1;k++)
 {
   sum=0;
   for(i=k;i<N;i++)
	   sum+=a[i][k]*a[i][k];
   sum=sqrt(sum);
   for(i=k;i<N;i++)
   {	  
	   if(i==k)
		   h[i]=sum*sign(a[k][k])+a[k][k];
	   else
		   h[i]=a[i][k];
   }
	if(k>0)
		for(i=0;i<k;i++)
			h[i]=0;
 vectormat(h,H);
 for(i=0;i<N;i++)
	 for(j=0;j<N;j++)
		 if(i==j)
			 H[i][j]=1-2*H[i][j]/twomo(h);
		 else
             H[i][j]=-2*H[i][j]/twomo(h);
multmat(H,a,temp);
for(i=0;i<N;i++)
	 for(j=0;j<N;j++)
		 a[i][j]=temp[i][j];
if(k==0)
	 for(i=0;i<N;i++)
	    for(j=0;j<N;j++)
		    Q[i][j]=H[i][j];
else
{
    multmat(Q,H,temp);
	for(i=0;i<N;i++)
	 for(j=0;j<N;j++)
		 Q[i][j]=temp[i][j];
}

 }
 
printf("The answer Q  :\n");
for(i=0;i<N;i++)
{ 
	for(j=0;j<N;j++)
		 printf("%f\t",Q[i][j]);
	 printf("\n");
}

printf("\nThe answer R  :\n");
for(i=0;i<N;i++)
{ 
	for(j=0;j<N;j++)
		 printf("%f\t",a[i][j]);
	 printf("\n");
}
}

⌨️ 快捷键说明

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