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

📄 yang.cpp

📁 数学
💻 CPP
字号:
// suanfa.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


#include <stdio.h>
#include <math.h>

//BEGIN_A放置初始距阵,B放b。然后程序依次输出列选高斯,全选高斯,HOUSEHOLDER变换,QR求特征值

double begin_a[5][5]={{10,1,2,3,4},{1,9,-1,2,-3},{2,-1,7,3,-5},{3,2,3,12,-1},{4,-3,-5,-1,15}};
double a[5][5];
double q[5][5];
double b[5] = {0,0,18,24,31};

int n=5;

void init_a()
{
	int i,j;
	for (i=0;i<n;i++)
		for (j=0;j<n;j++)
		a[i][j] = begin_a[i][j];
}

int all_lu(int u[],int v[],int n)
{
	int k,i,j,p,q;
	double max;
	for (k=0;k<=n-2;k++)
	{
		max = 0.0; p = k; q = k;

		for (i=k;i<=n-1;i++)
			for (j=k;j<=n-1;j++)
			{
				if (fabsl(a[i][j])>fabsl(max)) 
				{
					max = a[i][j];
					p = i;
					q = j;
				}
			};

		u[k] = p;
		v[k] = q;		
		if (p>k)
			for (j=0;j<n;j++)
			{
				max = a[k][j];
			    a[k][j] = a[p][j];
			    a[p][j] = max;
		    };
		if (q>k)
			for (i=0;i<n;i++)
			{
				max = a[i][k];
			    a[i][k] = a[i][q];
			    a[i][q] = max;
		    };		
		if (a[k][k] == 0.0)
		{
			printf("error\n");
			return (1);
		}		

		for (i=k+1;i<n;i++)
		{
			a[i][k] = a[i][k]/a[k][k];
			for(j=k+1;j<n;j++)
				a[i][j]=a[i][j]-a[i][k]*a[k][j];
		};
	};
	return (0);
}

int row_lu(int u[],int n) 

{
	int i,k,j;
	int p;
	double max;

	for(k=0;k<n-1;k++)
	{
		max=0; p = k;
		
		for(i=k;i<n;i++)
			if(fabsl(max)<fabsl(a[i][k]))
			{
				max=a[i][k];
				p=i;
			};

		u[k]=p;
		if(p!=k)
			for(i=0;i<n;i++)
			{
				max=a[k][i];
				a[k][i]=a[p][i];
				a[p][i]=max;
			};		
		if (a[k][k] == 0.0)
		{
			printf("error\n");
			return (1);
		};

		for(i=k+1;i<n;i++)
		{
			a[i][k]=a[i][k]/a[k][k];
			for(j=k+1;j<n;j++)
				a[i][j]=a[i][j]-a[i][k]*a[k][j];
		};
	};
return 0;
}


void Left(double b[],int n) 
{
	int i,j;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			b[j]-=b[i]*a[j][i];
}

void Right(double b[],int n) 
{
	int i,j;
	for(i=n-1;i>0;i--)
	{
		b[i]/=a[i][i];
		for(j=0;j<i;j++)
			b[j]-=b[i]*a[j][i];
	}
	b[0]/=a[0][0];
}

void answer_lu_row()
{
	int r,i,j;
	double t;
	int u[20];

	r = row_lu(u,n); 
	if(r==0)
	{
		for (i=0;i<n;i++)
		{
			for (j=0;j<n;j++)
				printf("%10.5e",a[i][j]);
			printf("\n");
		};
		
		for (i=0;i<n-1;i++) 
		{
			if(u[i]!=i)
			{				
				t=b[i];
				b[i]=b[u[i]];
				b[u[i]]=t;
			}
		};
		Left(b,n); 
		Right(b,n);
		for (i=0;i<n;i++)
			printf("x[%d]=%f, ",i+1,b[i]);
		printf("\n");
	}
	printf("\n");
}

void answer_lu_all()
{
	int r,i,j;
	double t;
	int u[20];
	int v[20];

	r = all_lu(u,v,n);
	if(r==0)
	{
		for (i=0;i<n;i++)
		{
			for (j=0;j<n;j++)
				printf("%10.5e",a[i][j]);
			printf("\n");
		}
		
		for (i=0;i<n-1;i++) 
		{
			if(u[i]!=i)
			{				
				t = b[i];
				b[i] = b[u[i]];
				b[u[i]] = t;
			}
		};
		Left(b,n); 
		Right(b,n);
		for (i=0;i<n-1;i++)
		{
			if(v[i]!=i)
			{
				t = b[i];
				b[i] = b[v[i]];
				b[v[i]] = t;
			}
		};
		for (i=0;i<n;i++)
			printf("x[%d]=%f, ",i+1,b[i]);
		printf("\n");
	}
	printf("\n");
}



int house(double b[],double c[])
{
	int i,j,k;

	double h,f,g,h2;

	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			q[i][j] = a[i][j];
	for(i=n-1;i>=1;i--)
	{
		h = 0.0;
		if (i>1)
			for (k=0;k<i;k++) h = h+q[i][k]*q[i][k];
		if (h == 0)
		{
			c[i] = 0.0;
			if (i==1) c[i] = q[i][i-1];
			b[i] = 0.0;
		}
		else
		{
			c[i] = sqrtl(h);
			if (q[i][i-1]>0.0) c[i] = -c[i];
			h = h-q[i][i-1]*c[i];
			q[i][i-1] = q[i][i-1]-c[i];
			f = 0.0;
			for (j=0;j<i;j++)
			{
				q[j][i] = q[i][j]/h;
				g = 0.0;
				for(k=0;k<=j;k++) g = g+q[i][k]*q[j][k];
				if (j+1<=i-1)
					for (k=j+1;k<i;k++) g = g+q[k][j]*q[i][k];
				c[j] = g/h;
				f = f+g*q[j][i];
			}
			h2 = f/(h+h); 
			for (j=0;j<i;j++)
			{
				f = q[i][j];
				g = c[j]-h2*f;
				c[j] = g;
				for(k=0;k<=j;k++) q[j][k] = q[j][k] - f*c[k] - g*q[i][k];
			}
			b[i] = h;
		}
	};
	for(i=0;i<n-1;i++) c[i] = c[i+1];
    c[n-1] = 0.0;
	
	b[0] = 0.0;
	for (i=0;i<=n-1;i++)
	{
		if ((b[i]!=0.0)&&(i-1>=0))
			for (j=0;j<i;j++)
			{
				g = 0.0;
				for (k=0;k<i;k++) g = g+q[i][k]*q[k][j];
				for (k=0;k<i;k++) q[k][j] = q[k][j]-g*q[k][i];
			}
		b[i] = q[i][i]; 
		q[i][i] = 1.0;
		if (i-1>=0)
			for(j=0;j<i;j++)
			{
				q[i][j] = 0;
				q[j][i] = 0;
			};
	};
	
	for (i=0;i<n;i++)
		for (j=0;j<n;j++)
			a[i][j] = 0;
	for (i=0;i<n;i++) {a[i][i] = b[i]; a[i][i+1] = c[i];};
	for (i=1;i<n;i++) a[i][i-1] = c[i-1];
	return 0;

}

int qr(int l,double eps,double b[],double c[])
{
	int i,j,k,m,it;
	double d,f,h,g,p,r,e,s;
	c[n-1] = 0;
	d = 0;
	f = 0;
	for (j=0;j<n;j++)
	{
		it = 0;
		h = eps*(fabsl(b[j])+fabsl(c[j]));
		if (h>d) d = h;
		m = j;
		while ((m<=n-1)&&(fabsl(c[m])>d)) m++;
		if (m!=j)
		{
			do
			{
				if (it==l)
				{
					printf("error\n");
					return -1;
				}
				it++;
				g = b[j];
				p = (b[j+1]-g)/(2.0*c[j]);
				r = sqrtl(p*p+1.0);
				if (p>=0.0) b[j] = c[j]/(p+r);
				else b[j] = c[j]/(p-r);
				h = g-b[j];
				for (i=j+1;i<=n-1;i++) b[i] = b[i]-h;
				f = f+h; p =b[m]; e = 1.0; s =0.0;
				for (i=m-1;i>=j;i--)
				{
					g = e*c[i]; h = e*p;
					if (fabsl(p)>=fabsl(c[i]))
					{
						e = c[i]/p; r =sqrtl(e*e+1.0);
						c[i+1] = s*p*r; s = e/r; e =1.0/r;
					}
					else
					{
						e = p/c[i];
						r = sqrtl(e*e+1.0);
						c[i+1] = s*c[i]*r;
						s = 1.0/r; e = e/r;
					}
					p = e*b[i]-s*g;
					b[i+1] = h+s*(e*g+s*b[i]);
					for (k=0; k<n;k++)
					{				
						h = q[k][i+1]; q[k][i+1] = s*q[k][i]+e*h;
						q[k][i] = e*q[k][i] - s*h;
					}
				}
				c[j] = s*p;
				b[j]=e*p;
			}
			while (fabsl(c[j])>d);
		}
		b[j]+=f;
	};
	for (i=0;i<n;i++)
	{
		k = i;
		p = b[i];
		if (i+1<n)
		{
			j = i+1;
			while ((j<=n-1)&&(b[j]<=p))
			{
				k = j; p = b[j]; j = j+1;
			}
		};
		if (k!=i)
		{
			b[k] = b[i];
			b[i] =p;
			for (j=0;j<n;j++)
			{
				p = q[j][i];
				q[j][i] = q[j][k];
				q[j][k] = p;
			}
		}
	}
	return 1;
}





int _tmain(int argc, _TCHAR* argv[])
{
	
	int i,j;
	double zhu[10],ci[10];
    init_a();
	answer_lu_all();
	init_a();
	answer_lu_row();
	init_a();
	house(zhu,ci);
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++) printf("%10.5e ",a[i][j]);
		printf("\n");
	};
	printf("\n");
	qr(60,0.000001,zhu,ci);
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++) printf("%10.5e ",q[i][j]);
		printf("\n");
	};
	printf("\n");
	for (i=0;i<n;i++)
		printf("%10.5e ",zhu[i]);
	printf("\n");

	return 0;	
}

⌨️ 快捷键说明

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