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

📄 线性方程组的求解.cpp

📁 插值,常微分方程的初值,非线性方程的跟的求解,拟合,微分,线性方程组的求解,积分的实现
💻 CPP
字号:
////////////////////////////////////////////////////////////////////////////////////////////////
#include"myhead.h"
////////////////////////////////////////////////////////////////////////////////////////////////
void exchange(int r,int k);
double max(int k);
double max(double a[],int n);
int flag,n;
double A[20][21],ark;
///////////////////////////////////////////////////////////////////////////////////////////////
void fun_2()
{
	 system("cls");//执行系统清屏命令
	 cout<<"	 ******************************************************************"<<endl
		 <<"	 *                        求解线性方程组的解                      *"<<endl
		 <<"	 ******************************************************************"<<endl
		 <<"	 *                       1、高斯列主元消去法:                    *"<<endl
	 	 <<"	 *                       2、矩阵的LU分解法:                      *"<<endl
		 <<"	 *                       3、雅可比迭代法:                        *"<<endl
		 <<"	 ******************************************************************"<<endl;
	 cout<<"	 请选择一个数字(1-3):";
	 int ch=0;
	 cin>>ch;

	 if(ch==1)
		 g();
	 if(ch==2)
		 LU();
	 if(ch==3)
		 y();
	 system("pause");
}
//////////////////////////////////////////////////////////////////////////////////////////////
void g()
{
	double x[21];      //此数组用于存放方程解
	int k,i,j;
	printf("	 输入方程组的维数:n=");
	scanf("%d",&n);
	printf("	 现在输入系数矩阵A和向量b:");
	for(i=1;i<=n;i++)
	{
		printf("\n	 请输入a%d1--a%d%d系数和向量b%d:",i,i,n,i);  //实现将每一行中的系数和向量一次性输入, 
                                                               //数之间用空格格开,输完后回车确定   
		for(j=1;j<=n+1;j++)     //将刚才输入的数存入数组
		scanf("%f",&A[i][j]);
   }

   for(k=1;k<=n-1;k++)                       
   {
	   ark=max(k);
	   if(ark==0)                //判断方程是否为线性方程,即是否合法
	   {
		   printf("\n	 此方程组不合法!");
		   return;
	   }
	   else if(flag!=k)
				exchange(flag,k);
		for(i=k+1;i<=n;i++)
			for(j=k+1;j<=n+1;j++)
				A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
   }

   x[n]=A[n][n+1]/A[n][n];

   for( k=n-1;k>=1;k--)
   {
	   double me=0;
	   for(j=k+1;j<=n;j++)
	   {
		   me=me+A[k][j]*x[j];
		}
       x[k]=(A[k][n+1]-me)/A[k][k];
   }
   for(i=1;i<=n;i++)
   {
	   printf("\n x%d=%f",i,x[i]);
   }
   system("pause");
}

///////////////////////////////////////////////////////////////////////////////
void exchange(int r,int k)         //交换行的矩函数
{
	int i;
	for(i=1;i<=n+1;i++)
		A[0][i]=A[r][i];
	for(i=1;i<=n+1;i++)
		A[r][i]=A[k][i];
	for(i=1;i<=n+1;i++)
		A[k][i]=A[0][i];
}

////////////////////////////////////////////////////////////////////////////////
double max(int k)           //比校系数大小的函数
{
	int i;
	double  temp=0;
	for(i=k;i<=n;i++)
    if(fabs(A[i][k])>temp)
    {	
		temp=fabs(A[i][k]);
		flag=i;
    }
	return temp;
}
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
void  y()                                 //雅可比函数
{
	double a[10][10],b[10],x0[10],x[10],y[10];
	int n;
	int i,j;
	double  sum,e;
	cout<<"	 请输入方程组的阶数和误差限:";
	cin>>n>>e;
	cout<<"	 请输入系数矩阵:";
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			cin>>a[i][j];
	cout<<"	 请输入B矩阵:";
    for(i=0;i<n;i++)
		cin>>b[i];
	cout<<"	 请输入X的初值:"<<endl;
    for(i=0;i<n;i++)
		cin>>x0[i];
	while(1)
		{	for(i=0;i<n;i++)
				{  sum=0;
					for(j=0;j<n;j++)
						sum=a[i][j]*x0[j]+sum;
					x[i]=x0[i]+(b[i]-sum)/a[i][i];
					y[i]=fabs(x[i]-x0[i]);
				}
			if(max(y,n)<=e)break;
			else 
				for(i=0;i<n;i++)
					x0[i]=x[i];
		}
	cout<<"	 方程组的根为:"<<endl;
    for(i=0;i<n;i++)
		cout<<x[i]<<endl;
}
///////////////////////////////////////////////////////////////////////////////////////////
double  max(double a[],int n)
{ 
	double m;
	m=a[0];
	for(int i=0;i<n;i++)
	  if(a[i]>m)
			 m=a[i];
	return m;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//LU分解
int  LU()
{ 
	double a[10][10],b[10],l[10][10],u[10][10],x[10],y[10];
	int n,i,j,k;
	double a1,b1,c,d;
	cout<<"	 请输入方程组的阶数:";
	cin>>n;
	cout<<"	 请输入系数矩阵"<<endl;
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{cin>>a[i][j];
		    l[i][j]=0;
			u[i][j]=0;}
    cout<<"	 请输入B矩阵"<<endl;
    for(j=1;j<=n;j++)
		cin>>b[j];
    for(i=1;i<=n;i++)
	{u[1][i]=a[1][i];
	l[i][i]=1;}
    for(i=2;i<=n;i++)
		 l[i][1]=a[i][1]/u[1][1];
    for(i=2;i<=n;i++)
		{
		  for(j=i;j<=n;j++)
		  { b1=0;
			for(k=1;k<=i-1;k++)
				b1=b1+l[i][k]*u[k][j];
			u[i][j]=a[i][j]-b1;
		  }
		  for(j=i+1;j<=n;j++)
		  { a1=0;
	          for(k=1;k<=i-1;k++)
				a1=a1+l[j][k]*u[k][i];
			l[j][i]=(a[j][i]-a1)/u[i][i];
		  }
		}
	cout<<"	 产生的L矩阵为:"<<endl;
     for(i=1;i<=n;i++)
		{for(j=1;j<=n;j++)
			cout<<l[i][j]<<"   ";
	     cout<<endl;
		}
	cout<<"	 产生的U矩阵为:"<<endl;
     for(i=1;i<=n;i++)
		{for(j=1;j<=n;j++)
			cout<<u[i][j]<<"   ";
	     cout<<endl;
		}
	 y[1]=b[1];
	 for(i=2;i<=n;i++)
		{c=0;
		 for(k=1;k<=i-1;k++)
		  c=c+l[i][k]*y[k];
	      y[i]=b[i]-c;
		}
	 x[n]=y[n]/u[n][n];
	 for(i=n-1;i>=1;i--)
		{d=0;
	      for(j=i+1;j<=n;j++)
			  d=u[i][j]*x[j]+d;
		  x[i]=(y[i]-d)/u[i][i];
		}
	 cout<<"	 方程组的根为:"<<endl;
	 for(i=1;i<=n;i++)
	 {cout<<'x'<<i<<'=';
	 cout<<x[i]<<endl;}
 return 0;
}

⌨️ 快捷键说明

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