算例:一根长11m的铁棒,左侧温度100℃,右侧0℃,试计算其稳态温度场。我们将铁棒均匀分割成11段,每段1m长,假设截面积为1㎡。首先写出一维稳态常物性无内热源的导热方程,并离散之,如下图:
公式可见,每个节点温度是相邻节点温度的平均值。我们编写如下程序:
1. var numNode=12;//节点数共12个
2. var xPos=new Array(numNode);//节点坐标
3. var T=new Array(numNode);//节点温度
4. for(var i=0;i<numNode;i++){
5. T[i]=0;//初始化为0
6. xPos[i]=i;//位置
7. }
8. T[0]=100;//左侧节点温度100
9.
10. for(var iter=0;iter<100;iter++){//先迭代100次吧
11. for (var i=1;i<numNode-1;i++) {
12. T[i]=(T[i-1]+T[i+1])/2.0;//中间节点温度是相邻节点温度的平均值!
13. }
14. }
全部代码:
1. <!DOCTYPEhtml>
2. <htmlstyle="height: 100%">
3. <head>
4. <metacharset="utf-8">
5. </head>
6. <bodystyle="height: 100%; margin: 0">
7. <divid="container" style="height: 100%"></div>
8. <scripttype="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
9. <scripttype="text/javascript">
10.
11. var numNode=12;//节点数共12个
12. var xPos=new Array(numNode);//节点坐标
13. var T=new Array(numNode);//节点温度
14. for(var i=0;i<numNode;i++){
15. T[i]=0;//初始化为0
16. xPos[i]=i;//位置
17. }
18. T[0]=100;//左侧节点温度100
19.
20. for(var iter=0;iter<100;iter++){//先迭代100次吧
21. for (var i=1;i<numNode-1;i++) {
22. T[i]=(T[i-1]+T[i+1])/2.0;//中间节点温度是相邻节点温度的平均值!
23. }
24. }
25.
26.
27. var dom = document.getElementById("container");
28. var myChart =echarts.init(dom);
29.
30. option= {
31. xAxis:{
32. type:'category',
33. data:xPos,
34. },
35. yAxis:{
36. type:'value'
37. },
38. series:[{
39. data:T,
40. type:'line'
41. }]
42. };
43.
44. if (option&& typeof option === "object") {
45. myChart.setOption(option,true);
46. }
47. </script>
48. </body>
49. </html>
运行这个网页,得到计算结果:
与理论值完全一致,然而不完美的是我们迭代次数过多了。怎么知道迭代收敛了,而不是直接迭代100次呢?留给读者思考。
算例:一根长11m的铁棒,左侧温度100℃,右侧0℃,初始温度0℃,试计算其温度随时间的变化。我们将铁棒均匀分割成11段,每段1m长,假设截面积为1㎡。首先写出一维非稳态常物性无内热源的导热方程,并离散之,如下图:其中T0表示上一时刻的温度值,T表示当前时刻的温度值:
通过程序实现非稳态温度场的求解:
1. varlmd=34,Cp=680,rho=7200;//分别定义材料的导热系数、比热和密度
2. var spaceStep=1;//空间步长1m
3. varmaxTimeStep=0.5*spaceStep*spaceStep/(lmd/rho/Cp);//显式最大时间步长
4. vartimeStep=0.9*maxTimeStep;//比较保险的时间步长,太大容易发散
5. console.log("时间步长:",timeStep);
6. var numNode=12;//节点数共12个
7. var xPos=new Array(numNode);//节点坐标
8. var T=new Array(numNode);//当前节点温度
9. var T0=new Array(numNode);//上一时刻节点温度
10. for(var i=0;i<numNode;i++){
11. T[i]=T0[i]=0;//初始化为0
12. xPos[i]=i*spaceStep;//坐标赋值
13. }
14. T[0]=T0[0]=100;//左侧节点温度100
15.
16. for(var iter=0;iter<10;iter++){//10个时间步长迭代
17. for (var i=1;i<numNode-1;i++) {
18. var heatLeft=lmd*(T0[i-1]-T0[i])/spaceStep*1*1;//从左侧传导的热量,傅里叶定律
19. var heatRight=lmd*(T0[i+1]-T0[i])/spaceStep*1*1;//从左侧传导的热量,傅里叶定律
20. var Trise=(heatLeft+heatRight)*timeStep/rho/Cp/(1*1*1);//体积为1m
21. T[i]=T0[i]+Trise
22. }
23.
24. for (var i=1;i<numNode-1;i++){
25. T0[i]=T[i];//更新初始值,以备下一轮迭代
26. }
27. }
全部代码如下:
1. <!DOCTYPEhtml>
2. <htmlstyle="height: 100%">
3. <head>
4. <metacharset="utf-8">
5. </head>
6. <bodystyle="height: 100%; margin: 0">
7. <divid="container" style="height: 100%"></div>
8. <scripttype="text/javascript" src="http://echarts.baidu.com/gallery/vendors/echarts/echarts.min.js"></script>
9. <scripttype="text/javascript">
10.
11. var lmd=34,Cp=680,rho=7200;//分别定义材料的导热系数、比热和密度
12. var spaceStep=1;//空间步长1m
13. varmaxTimeStep=0.5*spaceStep*spaceStep/(lmd/rho/Cp);//显式最大时间步长
14. vartimeStep=0.9*maxTimeStep;//比较保险的时间步长,太大容易发散
15. console.log("时间步长:",timeStep);
16. var numNode=12;//节点数共12个
17. var xPos=new Array(numNode);//节点坐标
18. var T=new Array(numNode);//当前节点温度
19. var T0=new Array(numNode);//上一时刻节点温度
20. for(var i=0;i<numNode;i++){
21. T[i]=T0[i]=0;//初始化为0
22. xPos[i]=i*spaceStep;//坐标赋值
23. }
24. T[0]=T0[0]=100;//左侧节点温度100
25.
26. for(var iter=0;iter<10;iter++){//10个时间步长迭代
27. for (var i=1;i<numNode-1;i++) {
28. var heatLeft=lmd*(T0[i-1]-T0[i])/spaceStep*1*1;//从左侧传导的热量,傅里叶定律
29. var heatRight=lmd*(T0[i+1]-T0[i])/spaceStep*1*1;//从左侧传导的热量,傅里叶定律
30. var Trise=(heatLeft+heatRight)*timeStep/rho/Cp;
31. T[i]=T0[i]+Trise
32. }
33.
34. for (var i =1;i<numNode-1;i++){
35. T0[i]=T[i];//更新初始值,以备下一轮迭代
36. }
37. }
38.
39. var dom = document.getElementById("container");
40. var myChart =echarts.init(dom);
41.
42. option= {
43. xAxis:{
44. type:'category',
45. data:xPos,
46. },
47. yAxis:{
48. type:'value'
49. },
50. series:[{
51. data:T,
52. type:'line'
53. }]
54. };
55.
56. if (option&& typeof option === "object") {
57. myChart.setOption(option,true);
58. }
59. </script>
60. </body>
61. </html>
运行网页,查看计算结果:
值得注意的是,时间步长有限制,太大了会导致计算发散。这个结果到底对不对呢?请读者与理论值比较!
结语,一维的介绍完了,二维的其实就是多了两个维度,读者可以参考本文程序开发二维程序。后面章节的二维导热算例和本文思路不一样,仅供本科生选读。