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

📄 main.cpp

📁 线性方程迭代法
💻 CPP
字号:
#include<stdio.h>
#include"iostream.h"
#include "math.h"
#include<windows.h>
void readcoe(double **coe,double *res,int m,int n)
{
	int k=m*n+m;
	int p=0;
	FILE *fp;
	double a[10];
	int i=0;
	char ch;
	if((fp=fopen("coe.txt","r+"))==NULL)
	{
		printf("cannot open file\n");
		exit(0);
	}
	while((!feof(fp))&&(p<k))
	{

		ch=fgetc(fp);
		if((ch!=32)&&(ch!=10)&&(!feof(fp)))
		{
			a[i]=ch-48;
			i++;
		}
		else
		{
			if(a[0]!=-3)
			{
				if(p<m*n)
				{
					int n1=p%n;
		            int m1=(p-n1)/n;
			        for(int j=0;j<i;j++)
						coe[m1][n1]=a[j]*pow(10,i-j-1)+coe[m1][n1];
				    i=0;
			        p++;
				}
				else
				{
					for(int j=0;j<i;j++)
						res[p-m*n]=res[p-m*n]+a[j]*pow(10,i-j-1);
				    i=0;
				    p++;
				}
			}
			else
			{
				if(p<m*n)
				{
					int n1=p%n;
		            int m1=(p-n1)/n;
			        for(int j=1;j<i;j++)
						coe[m1][n1]=a[j]*pow(10,i-j-1)+coe[m1][n1];
					coe[m1][n1]=0-coe[m1][n1];
				    i=0;
			        p++;
				}
				else
				{
					for(int j=1;j<i;j++)
						res[p-m*n]=res[p-m*n]+a[j]*pow(10,i-j-1);
					res[p-m*n]=0-res[p-m*n];
				    i=0;
				    p++;
				}
			}
		}
	}
	fclose(fp);
}
void init(double**coe,double *res,double *x,int m,int n)
{
	for(int i=0;i<m;i++)  
		res[i]=0;
	for(i=0;i<m;i++)
		for(int j=0;j<n;j++)
			coe[i][j]=0;
	for(i=0;i<n;i++)
		x[i]=0;
}
void guess(double**coe,double *res,double *x,int m,int n)
{
	double *x2=new double[n];
	double max;
	double count=0;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i!=j)
				coe[i][j]=-coe[i][j]/coe[i][i];
		}
		res[i]=res[i]/coe[i][i];
		coe[i][i]=0;
	}
	do
	{
		count++;
		for(i=0;i<n;i++)
			x2[i]=x[i];
		for(i=0;i<m;i++)
		{
			double s=res[i];
			for(int j=0;j<n;j++)
				s=s+coe[i][j]*x[j];
			x[i]=s;
		}
		max=fabs(x[0]-x2[0]);
		for(i=1;i<n;i++)
			if(max<fabs(x[i]-x2[i]))
				max=fabs(x[i]-x2[i]);
	}while(max>0.0000001);
	cout<<endl<<"根为:"<<endl;
	for(i=0;i<m;i++)
		cout<<"x["<<i+1<<"]="<<x[i]<<" ";
	cout<<"count="<<count<<endl;
}
void sor(double**coe,double *res,double *x,int m,int n)
{
	double *x2=new double[n];
	double max;
	int count=0;
	double w=0.02;
	while(w<2)
	{
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(i!=j)
				coe[i][j]=-coe[i][j]/coe[i][i];
		}
		res[i]=res[i]/coe[i][i];
		coe[i][i]=0;
	}
	do
	{
		count++;
		for(i=0;i<n;i++)
			x2[i]=x[i];
		for(i=0;i<m;i++)
		{
			double s=res[i];
			for(int j=0;j<n;j++)
				s=s+coe[i][j]*x[j];
			x[i]=w*s+(1-w)*x2[i];
		}
		max=fabs(x[0]-x2[0]);
		for(i=1;i<n;i++)
			if(max<fabs(x[i]-x2[i]))
				max=fabs(x[i]-x2[i]);
	}while(max>0.0000001);
	cout<<"w="<<w<<" count="<<count<<endl;
	w=w+0.02;
	}
	cout<<endl<<"根为:"<<endl;
	for(int i=0;i<m;i++)
		cout<<"x["<<i+1<<"]="<<x[i]<<" ";
}
	
	






void main()
{
	int n,m;
	cout<<"输入方程组的阶数:";
	cin>>n;
	cout<<"输入方程组方程个数:";
	cin>>m;
	if(n!=m)
	{
		cout<<"ERROR"<<endl;
		exit(0);		
	}
	double *x=new double[n];
	double *res=new double[m];
	double **coe=new double*[m];
	for(int i=0;i<m;i++)  
		coe[i]=new double[n];
	init(coe,res,x,m,n);
	readcoe(coe,res,m,n);
	guess(coe,res,x,m,n);
//	sor(coe,res,x,m,n);

}

⌨️ 快捷键说明

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