二维稳态导热的数值计算
2.1物理问题
一矩形区域,其边长L=W=1,假设区域内无内热源,导热系数为常数,三个边温度为T1=0,一个边温度为T2=1,求该矩形区域内的温度分布。
2.2 数学描述
?2T?2T对上述问题的微分方程及其边界条件为:2?2?0
?x?y x=0,T=T1=0
x=1,T=T1=0 y=0,T=T1=0 y=1,T=T2=1
?n??sh?y??T?T12?1?(?1)nn?L???
该问题的解析解:??sin??x??T2?T1?n?1n?L?sh?n??W????L?2.3数值离散
2.3.1区域离散
区域离散x方向总节点数为N,y方向总节点数为M,区域内任一节点用I,j表示。
2.3.2方程的离散
??2t???2t?对于图中所有的内部节点方程可写为:?2???2??0
??x?i,j??y?i,j用
I,j
节点的二阶中心差分代替上式中的二阶导数,得:
Ti+1,j?2Ti,j+Ti-1,j?x2?Ti,j+1?2Ti,j+Ti,j-1?y2?0
?y2?x2上式整理成迭代形式:Ti,j??Ti?1,j?Ti-1,j?+2(?x2??y2)?Ti,j?1?Ti,j-1?
2(?x2??y2)(i=2,3……,N-1),(j=2,3……,M-1)
补充四个边界上的第一类边界条件得:T1,j?T1 (j=1,2,3……,M)
TN,j?T1 (j=1,2,3……,M) Ti,j?T1 (i=1,2,3……,N)
Ti,M?T2 (i=1,2,3……,N)
传热学C程序源之二维稳态导热的数值计算 #include
char s; inti,j,l;
float cha,x,y;
float t[N][M],a[N][M]; /*打印出题目*/
printf(\二维稳态导热问题\\t\\t\ printf(\何鹏举\\n\
printf(\题目:补充材料练习题二\\n\
printf(\矩形区域,边长L=W=1,假设区域内无内热源,导热系数为常熟,三个边温度为T1=0,一个边温度为T2=1,求该矩形区域内的温度分布。\\n\ printf(\是否要手动对温度场赋予初值?(Y/N):\ scanf(\ if(s=='y'||s=='Y')
/*手动赋予温度初场*/
{
printf(\请首先假定一个温度场的初始分布,即给出各节点的温度初值(一行一行进行):\\n\
for(i=0;i /*自动赋予温度初场*/ { for(i=0;i /*四个边界上的第一类边界条件*/ for(j=0;j t[0][j]=0; t[M-1][j]=0; } for(i=0;i t[i][0]=0; t[i][N-1]=1; } /*步长计算*/ x=1.0/(N-1); y=1.0/(M-1); /*迭代循环*/ cha=1; while(cha>0.0001) { for(i=0;i t[i][j]=0.5*y*y*(t[i+1][j]+t[i-1][j])/(x*x+y*y)+0.5*x*x*(t[i][j+1]+t[i][j-1])/(x*x+y*y); cha=0; for(i=0;i cha=cha+abs(a[i][j]-t[i][j]); cha=cha/(N*M); } /*输出温度分布,其中l控制输出值的排列;这个结果是按照笛卡尔坐标系下平面从左上角开始依次的*/ printf(\经数值离散计算的该矩形区域内温度分布为:\\n\ l=0; for(j=M-1;j>=0;j--) for(i=0;i printf(\ l=l+1; if(l==N) { printf(\ l=0; } } /*为了是生成的exe文件结果算的后不会立即退出,方便观看*/ getchar();getchar(); /*其中第一个getchar读取了回车键,第二个getchar读取任意键*/ }