传热学小作业(黑体热辐射定律)

//--------------------------------------------------------------------------------------------------
//传热学小作业(黑体热辐射定律)
//题目描述:
//01.参考书目:ISBN 978-7-5609-4459-3.
//01.任何物体都有不断辐射,吸收,发射电磁波的本领.
//02.辐射出的电磁波在各个波段是不同的,称为谱分布.谱分布与物体本身特性及温度有关,称为热辐射.
//03.为了简化讨论,讨论不依赖具体物性的规律,假设理想物体黑体,作为研究热辐射的物体.
//04.普朗克(M.Planck)定律解释了黑体辐射按波长分布的规律:
//05.单位时间内,黑体单位表面积向其上的半球空间的所有方向辐射出去的,包含波长λ在内的单位波长的能量,称为光谱辐射能力.
//06.Eb=2*PI*h*c*c/{pow(λ,5)*[exp(hc/λkT)-1]}.
//07.其中:Eb-黑体的光谱辐射能力.(W/m^2*m).(对特定波长λ,特定温度T).
//08.     h-普朗克常数,h=6.626E-34(J*s).
//09.     c-真空中的光速,c=2.9979E8(m/s).
//10.     λ-波长(m).
//11.     k-玻尔兹曼常数,k=1.3806E-23(J/K).
//12.     T-黑体的热力学温度(K).
//13.将物理常量进行运算,对公式进行简化:
//14.Eb=c1*pow(λ,-5)/[exp(c2/λT)-1].
//15.其中:c1-2*PI*h*c*c,第一辐射常量,3.742E-16(W*m^2).
//16.	  c2-h*c/k,第二辐射常量,1.4388E-2(m*K).
//程序编制要求:
//1.波长λ,热力学温度T,交互读取.
//2.计算黑体的光谱辐射能力Eb.
//3.绘制给定波长λ内(在不同温度条件下)的位移变化曲线.
//--------------------------------------------------------------------------------------------------------------------
#include //包含Easyx模拟TC的BGI绘图库头文件
#include //包含数学运算头文件
#include //
#define DD 40//宏定义标题边框距离
#define DW 10//宏定义宽度边框距离
#define DH 10//宏定义高度边框距离
#define DC 200//宏定义控件区域宽度
#define nx 10//宏定义x轴刻度数量
#define ny 10//宏定义y轴刻度数量
#define TA 0.1//波长范围
#define TB 10//波长范围
#define T1 600//1.温度T1
#define T2 700//2.温度T2
#define T3 800//3.温度T3
#define T4 900//4.温度T4
#define T5 1000//5.温度T5
#define PI 3.1415926//宏定义圆周率
#define con1 3.741921//常数c1
#define con2 1.439474//常数c2
//辅助颜色------------------------------------------
#define c1 RGB(38,47,86)//宏定义辅助线颜色1
#define c2 RGB(38,47,86)//宏定义辅助线颜色2
#define c3 RGB(255,255,255)//宏定义文字及边框颜色
#define c4 RGB(255,255,0)//外力颜色
#define c5 RGB(0,255,255)//瞬态颜色
#define c6 RGB(0,255,0)//稳态颜色
//曲线颜色------------------------------------------
#define cc1 RGB(0,255,255)//宏定义曲线颜色4(青色)
#define cc2 RGB(0,255,0)//宏定义曲线颜色2(绿色)
#define cc3 RGB(150,100,0)//宏定义曲线颜色3(黄色)
#define cc4 RGB(0,255,100)//宏定义曲线颜色1(红色)
#define cc5 RGB(255,100,0)//宏定义曲线颜色5(青色)
//定义结构体-------------------------------------------------------------------------------------------------------
typedef struct points
{
	double x,y;//定义双精度变量
}DPOINT;//结束结构体
//窗口全局变量-----------------------------------------------------------------------------------------------------
int W = GetSystemMetrics(SM_CXSCREEN);//获取整个屏幕右下角X坐标
int H = GetSystemMetrics(SM_CYSCREEN);//屏幕Y坐标 
int c_h=36;//定义控件高度
//数据全局变量
char is1[20]="6";//预定义:1.辐射波长(μm)
char is2[20]="800";//2.热力温度(K)
char is3[20];//定义字符数组(存储字符串)
double d1,d2,d3,ym1,ymax,ni;//(存储计算值)
int i,j,k;//
double value;//定义双精度变量
char stt[10];//定义字符数组	
//函数声明---------------------------------------------------------------------------------------------------------
void sub_frame();//绘制框架子函数
void sub_calculate();//计算数据子函数
void func_E(double lam,double tt,double *E);//根据波长温度返回能量
//主函数-----------------------------------------------------------------------------------------------------------
void main()
{
	sub_frame();//绘图初始化
	MOUSEMSG m;//定义鼠标消息 
	while(true)//循环
	{
		m=GetMouseMsg();//获取一条鼠标消息 
		switch(m.uMsg)//根据获得的消息选择分支
		{
		case WM_LBUTTONDOWN://鼠标左键单击时判断数据输入
			{
				//判断鼠标位置是否在指定的控件区域
				//A.获取原始数据(横坐标在输入区域时输入数据)-------------------------------
				if(m.x>=W-DW-DC && m.x<=W-DW)
				{
					//1.辐射波长(μm):-----------------------------------------------------
					if(m.y>=H-DH-16*c_h+1 && m.y<=H-DH-15*c_h-1)//
					{
						InputBox(is1,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-16*c_h+1,W-DW,H-DH-15*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-16*c_h+15,is1);//写控件字符串
					}//结束if
					//2.热力温度(K):-----------------------------------------------------
					if(m.y>=H-DH-15*c_h+1 && m.y<=H-DH-14*c_h-1)//
					{
						InputBox(is2,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-15*c_h+1,W-DW,H-DH-14*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-15*c_h+15,is2);//写控件字符串
					}//结束if
				}//结束if(横坐标在输入区域时输入数据)
				sub_frame();//重绘框架
				//B.计算并绘图(横坐标在绘图区域时计算绘图)---------------------------------
				if(m.x>=DW && m.x<=W-DW-DC)
				{
					sub_calculate();//调用计算绘图函数
				}//结束if
				break;//
			}//结束case(结束鼠标左键单击事件消息处理)
		case WM_RBUTTONDOWN://鼠标移动的时候画个空心的圆
			return;//返回while
		}//结束switch(结束鼠标消息)
	}//结束while
}//结束主函数
//绘制框架子函数
void sub_frame()
{
	//1.全屏效果---------------------------------------------------------------------------
	initgraph(W,H);//初始化绘图窗口
	HWND hWnd = GetHWnd();//获取窗口句柄
	LONG style = GetWindowLong(hWnd,-16);//获得窗口风格
	style = style & ~WS_CAPTION & ~WS_SIZEBOX; //窗口全屏显示且不可改变大小
	SetWindowLong(hWnd,-16,style);//设置窗口风格
	SetWindowPos(hWnd, NULL,0,0,W,H,SWP_NOZORDER);//改变窗口位置,尺寸和Z序
	//ShowCursor(FALSE);//显示时隐藏鼠标
	//------------------------------------------------------------------------------------
	//2.绘制工作区边框
	setcolor(c3);
	rectangle(DW,DD,W-DW,H-DH);//外边框
	rectangle(W-DW-DC,DD,W-DW,H-DH);//控件区域边框
	//5.输出标题
	setfont(16,0,"黑体");
	outtextxy(5,10,"传热学小作业(黑体热辐射定律)");
	//6.输出简单说明
	RECT r={W-DW-DC+10,DD+10,W-DW-10,H-DH-10};//
	setfont(12,0,"宋体");//
	drawtext("传热学小作业:\n \n \
				黑体热辐射定律\
				\
				\n\n\
				操作说明:\n\n\
				鼠标左键  : 数据输入\n\
				鼠标右键  : 退出程序\n\
			\n\
			1~2为输入数据   3为计算数据\n\
			\n\n\
			\n\n\
			\
			\n", &r, DT_WORDBREAK);//
	//7.调整说明文字下面的矩形控件
	int c_x1=W-DW-DC,c_x2=W-DW;//控件左右x坐标
	int c_y1=H-DH;//第1个控件下y坐标
	for(int i=1;i<=16;i++)
	{
		rectangle(c_x1,c_y1,c_x2,c_y1-c_h);//
		c_y1=c_y1-c_h;
	}//结束for
	//8.绘制控件说明文字
	outtextxy(c_x1+10,H-DH-16*c_h+15,"1.辐射波长(μm):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-15*c_h+15,"2.热力温度(K):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-14*c_h+15,"3.光谱辐射力(nW/m^3):");//输出字符串模拟控件文字
	//8.初始化原始数据
	outtextxy(W-DW-DC+DC/2+15,H-DH-16*c_h+15,is1);//写控件字符串
	outtextxy(W-DW-DC+DC/2+15,H-DH-15*c_h+15,is2);//写控件字符串
}//结束子程序
//计算数据子函数
void sub_calculate()
{
	//1.原始数据转化为双精度数
	d1=atof(is1);//1.辐射波长(μm)
	d2=atof(is2);//2.热力温度(K)
	//2.根据数据计算要求项目---------------------------------------------------------------------------
	func_E(d1,d2,&d3);//3.光谱辐射力(nW/m^3)
	//求得指定波长范围温度范围下的辐射能量范围
	ymax=0.0;//
	for(i=0;i<=(TB-TA)*100.0;i++)//波长范围(波长或温度为0无意义)
	{
		func_E((TA+i*00.1),T5,&ym1);//求得这个波长在最高温度下的辐射能量
		if(ymax < ym1){ymax=ym1;}//存储最大辐射能量
	}//	
	//3.将计算结果转化为字符串--------------------------------------------------------------------------
	gcvt(d3,6,is3);//
	//4.将字符串写入控件中
	setfillcolor(BLACK);
	//------------------------------------------------------------
	fillrectangle(W-DW-DC+DC/2+40,H-DH-14*c_h+1,W-DW,H-DH-13*c_h);
	outtextxy(W-DW-DC+DC/2+45,H-DH-14*c_h+15,is3);//写控件字符串	
	//------------------------------------------------------------
	setcolor(cc1);//说明曲线颜色
	line(W-DW-DC-200,H-DH-6*c_h+10,W-DW-DC-260,H-DH-6*c_h+10);	
	outtextxy(W-DW-DC-200+15,H-DH-6*c_h+5,"1.温度T1=");//写控件字符串
	value=T1;//所在的刻度数值
	gcvt(value,5,stt);//将浮点数value转换为字符串stt
	outtextxy(W-DW-DC-200+80,H-DH-6*c_h+5,stt);//在规定的位置放置字符串
	//------------------------------------------------------------
    setcolor(cc2);//说明曲线颜色
	line(W-DW-DC-200,H-DH-5*c_h+10,W-DW-DC-260,H-DH-5*c_h+10);	
	outtextxy(W-DW-DC-200+15,H-DH-5*c_h+5,"2.温度T2=");//写控件字符串
	value=T2;//所在的刻度数值
	gcvt(value,5,stt);//将浮点数value转换为字符串stt
	outtextxy(W-DW-DC-200+80,H-DH-5*c_h+5,stt);//在规定的位置放置字符串
	//------------------------------------------------------------
	setcolor(cc3);//说明曲线颜色
	line(W-DW-DC-200,H-DH-4*c_h+10,W-DW-DC-260,H-DH-4*c_h+10);	
	outtextxy(W-DW-DC-200+15,H-DH-4*c_h+5,"3.温度T3=");//写控件字符串
	value=T3;//所在的刻度数值
	gcvt(value,5,stt);//将浮点数value转换为字符串stt
	outtextxy(W-DW-DC-200+80,H-DH-4*c_h+5,stt);//在规定的位置放置字符串
	//------------------------------------------------------------
	setcolor(cc4);//说明曲线颜色
	line(W-DW-DC-200,H-DH-3*c_h+10,W-DW-DC-260,H-DH-3*c_h+10);	
	outtextxy(W-DW-DC-200+15,H-DH-3*c_h+5,"4.温度T4=");//写控件字符串
	value=T4;//所在的刻度数值
	gcvt(value,5,stt);//将浮点数value转换为字符串stt
	outtextxy(W-DW-DC-200+80,H-DH-3*c_h+5,stt);//在规定的位置放置字符串
	//------------------------------------------------------------
	setcolor(cc5);//说明曲线颜色
	line(W-DW-DC-200,H-DH-2*c_h+10,W-DW-DC-260,H-DH-2*c_h+10);	
	outtextxy(W-DW-DC-200+15,H-DH-2*c_h+5,"5.温度T5=");//写控件字符串
	value=T5;//所在的刻度数值
	gcvt(value,5,stt);//将浮点数value转换为字符串stt
	outtextxy(W-DW-DC-200+80,H-DH-2*c_h+5,stt);//在规定的位置放置字符串
	//------------------------------------------------------------
	//5.绘制工作区坐标线
	//画x轴刻度标线及文字(时间t)---------------------------
	double xstep=(W-2*DW-DC)/(1.0*nx);//x方向步长(nx个刻度)(对应的绘图单位)
	double ystep=(H-DH-DD)/(1.0*ny);//y方向步长(ny个刻度)(对应的绘图单位)
	double x_scale=(W-2*DW-DC)*1.0/(1.0*(TB-TA));//每个数学单位x对应的屏幕单位
	double y_scale=(H-DH-DD)*1.0/(1.0*ymax);//辐射能量
	for(i=0;i<=nx;i++)
	{
		setcolor(c1);//竖直辅助线颜色
		line(DW+xstep*i,H-DH,DW+xstep*i,DD);//画竖直小刻度线
		setcolor(c3);//文字颜色
		value=TA+i*(TB-TA)/(1.0*nx);//所在的刻度数值
		gcvt(value,6,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+xstep*i-10,H-DH-20,stt);//在规定的位置放置字符串
	}//结束for
	//画y轴刻度标线及文字(位移+速度)---------------------------
	for(i=0;i<=ny;i++)
	{
		setcolor(c2);//水平辅助线颜色
		line(DW,DD+ystep*i,W-DW-DC,DD+ystep*i);//画水平小刻度线
		setcolor(cc3);//文字颜色
		value=(ny-i)*(1.0*ymax)/ny;//所在的刻度数值
		gcvt(value,5,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+15,DD+ystep*i-10,stt);//在规定的位置放置字符串
	}//结束for
	//6.重新绘制工作区边框
	setcolor(c3);
	rectangle(DW,DD,W-DW,H-DH);//外边框
	rectangle(W-DW-DC,DD,W-DW,H-DH);//控件区域边框	
	//------------------------------------------------------------
	//7.获取温度变化时的变化曲线------------------------------------------------	
	double n1,n2,n3,n4,n5,n6;//
	DPOINT *p1;//1.对应T1
	DPOINT *p2;//2.对应T2
	DPOINT *p3;//3.对应T3
	DPOINT *p4;//4.对应T4
	DPOINT *p5;//5.对应TC
	p1=new DPOINT[10000];//定义N1点表
	p2=new DPOINT[10000];//定义N2点表
	p3=new DPOINT[10000];//定义N3点表
	p4=new DPOINT[10000];//定义N4点表
	p5=new DPOINT[10000];//定义N5点表
	for(j=0;j<=(TB-TA)*100.0;j++)//波长范围
	{
		double lam=TA+j*0.01;//波长
		//1.温度T1--------------------------------
		func_E(lam,T1,&n1);//3.光谱辐射力(nW/m^3)
		p1[j].x=DW+(j*0.01)*x_scale;
		p1[j].y=H-DH-n1*y_scale;
		//1.温度T2--------------------------------
		func_E(lam,T2,&n2);//3.光谱辐射力(nW/m^3)
		p2[j].x=DW+(j*0.01)*x_scale;
		p2[j].y=H-DH-n2*y_scale;
		//3.温度T3--------------------------------
		func_E(lam,T3,&n3);//3.光谱辐射力(nW/m^3)
		p3[j].x=DW+(j*0.01)*x_scale;
		p3[j].y=H-DH-n3*y_scale;
		//4.温度T4--------------------------------
		func_E(lam,T4,&n4);//3.光谱辐射力(nW/m^3)
		p4[j].x=DW+(j*0.01)*x_scale;
		p4[j].y=H-DH-n4*y_scale;
		//5.温度T5--------------------------------
		func_E(lam,T5,&n5);//3.光谱辐射力(nW/m^3)
		p5[j].x=DW+(j*0.01)*x_scale;
		p5[j].y=H-DH-n5*y_scale;
	}//结束for
	//8.绘制温度变化时的变化曲线---------------------------------------------------
	setcolor(cc1);//曲线颜色1
	for(j=0;j<=(TB-TA)*100.0-1;j++)//
	{
		line(p1[j].x,p1[j].y,p1[j+1].x,p1[j+1].y);//
	}//结束for
	setcolor(cc2);//曲线颜色2
	for(j=0;j<=(TB-TA)*100.0-1;j++)//
	{
		line(p2[j].x,p2[j].y,p2[j+1].x,p2[j+1].y);//
	}//结束for
	setcolor(cc3);//曲线颜色3
	for(j=0;j<=(TB-TA)*100.0-1;j++)//
	{
		line(p3[j].x,p3[j].y,p3[j+1].x,p3[j+1].y);//
	}//结束for
	setcolor(cc4);//曲线颜色4
	for(j=0;j<=(TB-TA)*100.0-1;j++)//
	{
		line(p4[j].x,p4[j].y,p4[j+1].x,p4[j+1].y);//
	}//结束for
	setcolor(cc5);//曲线颜色5
	for(j=0;j<=(TB-TA)*100.0-1;j++)//
	{
		line(p5[j].x,p5[j].y,p5[j+1].x,p5[j+1].y);//
	}//结束for
}//结束子函数
void func_E(double lam,double tt,double *E)//根据波长温度返回能量
{
	*E=100000.0*con1*pow(lam,-5.0)/(exp(1.0*con2*10000.0/(lam*tt))-1.0);//单位(E-9)
}//
//*/
//--------------------------------------------------------------------------------------------------

传热学小作业(黑体热辐射定律)_第1张图片

你可能感兴趣的:(数学建模,算法)