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

📄 fem2.cpp

📁 用超松弛迭代法求解二阶偏微分 方程。得到电场的分布。
💻 CPP
字号:
#include <iostream.h>
#include <math.h>
#include<stdlib.h>
#include<stdio.h>

void print(char *fn,double aa[],int mm,int nn)
{
	FILE *cfPtr;
	int  i,j;
	if((cfPtr=fopen(fn,"w+"))==NULL)	
		printf("File could not be opened\n");
	else
	{
		for(i=0;i<mm;i++){
			for (j=0;j<nn;j++)
			{
				fprintf(cfPtr,"%-f ",aa[i*nn+j]);
				//fprintf(cfPtr,"%-f ", aa[i*n+j]);
				if ((i*nn+j+1)%nn==0)
				{fprintf(cfPtr,"\n");}
			}
			
		}		
	}
	fclose(cfPtr);
}


main()
{
	double BD=0,phi=0,r=0,t=0,u=0;
	static int m=100,n=100;
	int i,j;
	double w=1.0E-3; 
	double omega=2-3.1415926*
		sqrt(2*(1/((m-1)*(m-1))+1/((n-1)*(n-1))));
	//double leigh=0.1,heigh=0.1;
	//double hv=heigh/n;
	//double hh=leigh/m;
	double *a;
    a= new double[m*n];
/////本段将边界条件赋给数组
	for (j=0;j<=n-1;j++)
		{
			a[j]=0;
		}
	for (j=0;j<=n-1;j++)
		{
			a[(m-1)*n+j]=10;
			
		}
	for (i=1;i<m-1;i++)
	{
		a[i*n]=0;
        a[i*n+n-1]=0;
		
	}
	
	
	int Times=0;

///本段用超松弛迭代法计算
	do {
		Times=Times+1;
	  
	for (i=1;i<m-1;i++)
		{
			for (j=1;j<n-1;j++)
			{
				t=a[i*n+j];
				phi=(a[(i+1)*n+j]+a[i*n+(j+1)]+a[(i-1)*n+j]+
				a[i*n+(j-1)])/4;
				a[i*n+j]=t+omega*(phi-t)/4;
				r=fabs(a[i*n+j]-t);	
				//cout<<"The value of r is "<<r<<endl;
				if ((r-u)>=0){
					u=r;
				}                
			  	if ((r/a[i*n+j])<=w)
					continue;
	}
	}
	}
	while (r>w);
/////本段在屏幕上输出计算结果和迭代次数		
		
  /*for (i=0;i<m;i++)
	{
		for (j=0;j<n;j++)
		{
			int ttt=i*n+j;
			cout<<"a["<<ttt+1<<"]="<<a[ttt]<<endl;
		}
	}*/
    cout<<"The times of recicle are "<<Times<<endl;
//////下面语句将计算结果输出到yusong.dat的文件中
    print("yusong.dat",a,m,n);    
	delete []a;
	return 0;
}

⌨️ 快捷键说明

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