数学模型小作业(植物生长模型-碳氮比例模型)

//--------------------------------------------------------------------------------------------------
//数学模型小作业(植物生长模型-碳氮比例模型)
//题目描述:
//01.参考书目:ISBN 7-309-04306-5.
//01.植物生长主要依靠:碳(C)和氮(N)两种元素.
//02.碳(C)主要由大气提供,通过光合作用由叶片吸收;氮(N)主要由土壤提供,通过植物的根部吸收.
//03.植物吸收这些元素,在植物体内输送,结合导致植物生长,这一过程机理尚未完全研究清楚,现在只能作简化的近似研究.
//04.通过长期的观察,可以确认以下几个基本假设:
//05.   a.碳(C)由叶吸收,氮(N)由根吸收.
//06.   b.特定植物对碳(C)和氮(N)的需求大致有一个固定的比例.
//07.   c.碳(C)由叶吸收,也可从叶部输送至根部;氮(N)由根吸收,也可从根部输送到叶部.
//08.   d.植物生长每一时刻补充的元素数量依赖于:碳(C)的数量与叶部尺寸有关;氮(N)的数量与根部尺寸有关.
//09.   e.植物生长过程中,叶部尺寸和根部尺寸维持着某种均衡关系.
//[简化假设1]-------------------------------------------------------------------------------------------------
//10.如果不区分植物的根部和叶部,也不分碳(C)和氮(N);笼统的认为植物吸收养料而长大.
//11.假设植物吸收的养料与植物的体积成正比.则:dW/dt=k*V.
//12.其中:W-植物的质量,(单位:kg).W(t)-随时间变化的量.
//        V-植物的体积,(单位:kg/m^3).V(t)-随时间变化的量.
//        k-比例系数,与可供给的养料有关,也与能量转化的比例有关;假设为正的常数.
//13.假设植物的密度为ρ,且生长过程中ρ为常数,则可以得到:dW/dt=k*V=k*W/ρ=(k/ρ)*W.
//14.上面的方程称为生长方程,其解为:W(t)=W0*exp[(k/ρ)*t].
//15.其中:W0-初始时刻(t=0)时植物的质量.
//16.模型缺点:指数函数,植物随时间的增长无限增大,不符合实际.
//[简化假设2]-------------------------------------------------------------------------------------------------
//17.事实上随着植物的增长,维持结构稳定的能量比例增加了,将分子转化为组织的能量比例减少了,植物的生长减缓.
//18.为了对应这个假设,将原先设为常数的比例系数k,假设为变量k1,k1=a-b*W.其中:a,b为正的常数.
//19.则生长方程化为:dW/dt=k1*V=(a-b*W)*(W/ρ).
//20.引进中间变量:k2=a/ρ,Wm=k2*ρ/b,则:dW/dt=k2*W*(1-W/Wm).
//21.若初值为W0,则微分方程的解为:W(t)=Wm/[1-(1-Wm/W0)*exp(-k2*t)].
//21.观察方程可得:W(t)是时间t的单调增加函数,当t->∞,W(t)->Wm;即Wm是植物的极大质量;这个模型近似符合要求.
//[简化假设3][碳氮比例模型]-----------------------------------------------------------------------------------
//22.对上面的模型进一步作如下的假设:
//23.   a.植物生长消耗的碳(C)不仅与供给的碳(C)有关,而且与供给的氮(N)有关.
//24.   b.植物生长消耗的氮(N)不仅与供给的氮(N)有关,而且与供给的碳(C)有关.
//25.   c.C(t)-t时刻植物中碳(C)的浓度.
//26.   d.N(t)-t时刻植物中氮(N)的浓度.
//27.   e.V(t)-t时刻植物的体积.
//28.   f.植物消耗碳的速率:V*f(C,N).f(C,N)是与C(t),N(t)有关的函数,函数形式待确认.
//29.   g.假设任何时刻碳氮比例相同,设为1:λ;则植物消耗氮的速率为:λ*V*f(C,N).
//30.   h.假设R1-结合能的比例系数.(将大量分子结合成组织需要的能量).
//31.   i.假设r-碳的转换系数.(1Kmol碳的干燥植物的质量).
//32.则生长方程为:dW/dt=r*R1*V*f(C,N).
//33.假设植物的密度ρ在生长过程中为常数,则可以得到:dW/dt=r*R1*V*f(C,N)=r*R1*W*f(C,N)/ρ.
//34.下面来假设未知函数f(C,N)的形式,函数必然满足生产经验:
//35.   a.当碳(C)或氮(N)供应减少时,消耗速度f(C,N)下降.
//36.   b.当碳(C)和氮(N)供应都十分充足时,消耗速度f(C,N)不依赖C,N的值,而趋近于某个常数(与具体植物的品种有关).
//37.对应上面的两个要求,假设函数形式为:f(C,N)=[α*C*N]/[1+β*C*N].其中:α,β为正的常数.
//38.考察[t,t+dt]时段内碳(C)元素的平衡-----------------------------------------------------
//39.   a.t时刻碳的数量:V(t)*C(t).
//40.   b.t+dt时刻碳的数量:V(t+dt)*C(t+dt).
//41.   c.时段内消耗碳的数量:V*f(C,N)*dt,可取为:V(t)*f(C(t),N(t))*dt.
//42.   d.时段内增加碳的数量,光合作用与植物表面积(或质量)成正比:R3*W(t)*dt.(R3-比例系数为常数).
//43.   e.碳守恒:V(t+dt)*C(t+dt)=V(t)*C(t)-V*f(C,N)*dt+R3*W(t)*dt.
//44.   f.移项:[V(t+dt)*C(t+dt)-V(t)*C(t)]/dt=R3*W(t)-V*f(C,N).
//45.   g.由于V(t)=W(t)/ρ,令dt->0,得到:d(W*C)/dt=ρ*R3*W-W*f(C,N).
//46.考察[t,t+dt]时段内氮(N)元素的平衡-----------------------------------------------------
//47.   a.t时刻氮的数量:V(t)*N(t).
//48.   b.t+dt时刻氮的数量:V(t+dt)*N(t+dt).
//49.   c.时段内消耗氮的数量:V*λ*f(C,N)*dt,可取为:V(t)*λ*f(C(t),N(t))*dt.
//50.   d.时段内增加氮的数量,根系从土壤中吸收的氮与植物表面积(或质量)成正比:R5*W(t)*dt.(R5-比例系数为常数).
//51.   e.氮守恒:V(t+dt)*N(t+dt)=V(t)*N(t)-V*λ*f(C,N)*dt+R5*W(t)*dt.
//52.   f.移项:[V(t+dt)*N(t+dt)-V(t)*N(t)]/dt=R5*W(t)-V*λ*f(C,N).
//53.   g.由于V(t)=W(t)/ρ,令dt->0,得到:d(W*N)/dt=ρ*R5*W-W*λ*f(C,N).
//54.参数单位及取值说明:(r,ρ,λ,R1,R3,R5均为正常数)----------------------------------------
//55.   a.t-时间单位,为小时(h).
//56.   b.C,N-碳或氮的浓度,kmol/m^3.
//57.   c.W(t)-质量,单位为kg.
//58.   d.R1-结合能在总能量中的比例系数,可取R1=0.5,无量纲.
//59.   e.R3-光合作用增碳的比例系数,可取R3=0.0002,无量纲.
//60.   f.R5-根系增氮的比例系数,可取R5=0.1*R3=0.00002,无量纲.
//61.   g.ρ-植物密度,单位:Kg/m^3,可取ρ=100.
//62.   h.r-1Kmol碳转化为干燥植物的质量,可取r=30.
//63.   i.λ-植物消耗氮的速率比例系数,可取λ=0.22,无量纲.
//64.   j.α,β-与碳和氮消耗速率有关的比例系数,可取α=0.08,β=1.6,无量纲.
//65.方程的变形及求解步骤--------------------------------------------------------------------
//66.引入新的未知函数:y1(t)=W(t);y2(t)=W(t)*C(t);y3(t)=W(t)*N(t).则方程组(33)(45)(53)可以变形为:
//67.   a.d(y1)/dt=[r*R1/ρ]*[α*y1*y2*y3/(y1*y1+β*y2*y3)].
//68.   b.d(y2)/dt=[ρ*R3*y1]-[α*y1*y2*y3/(y1*y1+β*y2*y3)].
//69.   c.d(y3)/dt=[ρ*R5*y1]-[λ*α*y1*y2*y3/(y1*y1+β*y2*y3)].
//70.给定初值W(0),C(0),N(0);采用迭代法近似计算.
//------------------------------------------------------------------------------------------------------------
//程序编制要求(根据第3个近似模型):
//1.初始质量W0,初始碳浓度C0,初始氮浓度N0,交互读取.
//2.密度ρ,系数(r,λ,R1,R3,R5,α,β)交互读取.
//3.绘制时间植物质量示意图.
//--------------------------------------------------------------------------------------------------------------------
#include <graphics.h>//包含Easyx模拟TC的BGI绘图库头文件
#include <math.h>//包含数学运算头文件
#include <iostream.h>//
#define DD 40//宏定义标题边框距离
#define DW 10//宏定义宽度边框距离
#define DH 10//宏定义高度边框距离
#define DC 200//宏定义控件区域宽度
#define nx 10//宏定义x轴刻度数量
#define ny 10//宏定义y轴刻度数量
#define PI 3.1415926//宏定义圆周率
//辅助颜色------------------------------------------
#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)//颜色4
#define c5 RGB(0,255,255)//颜色5
#define c6 RGB(0,255,0)//颜色6
//曲线颜色------------------------------------------
#define cc1 RGB(0,255,0)//宏定义曲线颜色1(青色)
#define cc2 RGB(0,255,255)//宏定义曲线颜色2(绿色)
#define cc3 RGB(240,230,140)//宏定义曲线颜色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]="0.6";//预定义:1.初始质量W0(kg)
char is2[20]="0.35";//2.碳C0(Kmol/m^3)
char is3[20]="0.49";//3.氮N0(Kmol/m^3)
char is4[20]="100";//4.密度ρ(Kg/m^3)
char is5[20]="30";//5.碳转换系数r
char is6[20]="0.22";//6.耗氮速率比λ
char is7[20]="0.08";//7.速度常数α
char is8[20]="1.6";//8.速度常数β
char is9[20]="0.5";//9.结合能比例R1
char is10[20]="200";//10.增碳比例R3(E-6)
char is11[20]="20";//11.增氮比例R5(E-6)
char is12[20]="300";//12.计算时间(h)
char is13[20]="100";//13.输入时间t(h)
char is14[20],is15[20],is16[20];//定义字符数组(存储字符串)
double d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16;//(存储计算值)
double wf,cf,nf,x_scale,y_scale1,y_scale2,y_scale3;
int i,j,k;//
double value;//定义双精度变量
char stt[10];//定义字符数组	
//函数声明---------------------------------------------------------------------------------------------------------
void sub_frame();//绘制框架子函数
void sub_calculate();//计算数据子函数
void func_m1(double y1,double y2,double y3,double *m1);//中间变量1
//主函数-----------------------------------------------------------------------------------------------------------
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.初始质量W0(kg):-----------------------------------------------------
					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.碳C0(Kmol/m^3):-----------------------------------------------------
					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
					//3.氮N0(Kmol/m^3):-----------------------------------------------------
					if(m.y>=H-DH-14*c_h+1 && m.y<=H-DH-13*c_h-1)//
					{
						InputBox(is3,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-14*c_h+1,W-DW,H-DH-13*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-14*c_h+15,is3);//写控件字符串
					}//结束if
					//4.密度ρ(Kg/m^3):-----------------------------------------------------
					if(m.y>=H-DH-13*c_h+1 && m.y<=H-DH-12*c_h-1)//
					{
						InputBox(is4,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-13*c_h+1,W-DW,H-DH-12*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-13*c_h+15,is4);//写控件字符串
					}//结束if
					//5.碳转换系数r:-----------------------------------------------------
					if(m.y>=H-DH-12*c_h+1 && m.y<=H-DH-11*c_h-1)//
					{
						InputBox(is5,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-12*c_h+1,W-DW,H-DH-11*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-12*c_h+15,is5);//写控件字符串
					}//结束if
					//6.耗氮速率比λ:-----------------------------------------------------
					if(m.y>=H-DH-11*c_h+1 && m.y<=H-DH-10*c_h-1)//
					{
						InputBox(is6,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-11*c_h+1,W-DW,H-DH-10*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-11*c_h+15,is6);//写控件字符串
					}//结束if
					//7.速度常数α:-----------------------------------------------------
					if(m.y>=H-DH-10*c_h+1 && m.y<=H-DH-9*c_h-1)//
					{
						InputBox(is7,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-10*c_h+1,W-DW,H-DH-9*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-10*c_h+15,is7);//写控件字符串
					}//结束if
					//8.速度常数β:-----------------------------------------------------
					if(m.y>=H-DH-9*c_h+1 && m.y<=H-DH-8*c_h-1)//
					{
						InputBox(is8,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-9*c_h+1,W-DW,H-DH-8*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-9*c_h+15,is8);//写控件字符串
					}//结束if
					//9.结合能比例R1:-----------------------------------------------------
					if(m.y>=H-DH-8*c_h+1 && m.y<=H-DH-7*c_h-1)//
					{
						InputBox(is9,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-8*c_h+1,W-DW,H-DH-7*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-8*c_h+15,is9);//写控件字符串
					}//结束if
					//10.增碳比例R3(E-6):-----------------------------------------------------
					if(m.y>=H-DH-7*c_h+1 && m.y<=H-DH-6*c_h-1)//
					{
						InputBox(is10,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-7*c_h+1,W-DW,H-DH-6*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-7*c_h+15,is10);//写控件字符串
					}//结束if
					//11.增氮比例R5(E-6):-----------------------------------------------------
					if(m.y>=H-DH-6*c_h+1 && m.y<=H-DH-5*c_h-1)//
					{
						InputBox(is11,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-6*c_h+1,W-DW,H-DH-5*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-6*c_h+15,is11);//写控件字符串
					}//结束if
					//12.计算时间(h):-----------------------------------------------------
					if(m.y>=H-DH-5*c_h+1 && m.y<=H-DH-4*c_h-1)//
					{
						InputBox(is12,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-5*c_h+1,W-DW,H-DH-4*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-5*c_h+15,is12);//写控件字符串
					}//结束if
					//13.输入时间t(h):-----------------------------------------------------
					if(m.y>=H-DH-4*c_h+1 && m.y<=H-DH-3*c_h-1)//
					{
						InputBox(is13,9,"请输入数据");//读入数据
						setfillcolor(BLACK);
						fillrectangle(W-DW-DC+DC/2+10,H-DH-4*c_h+1,W-DW,H-DH-3*c_h);
						outtextxy(W-DW-DC+DC/2+15,H-DH-4*c_h+15,is13);//写控件字符串
					}//结束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~13为输入数据   14~16为计算数据\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.绘制控件说明文字
	setcolor(RGB(0,255,255));//
	outtextxy(c_x1+10,H-DH-16*c_h+15,"1.初始质量W0(kg):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-15*c_h+15,"2.碳C0(Kmol/m^3):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-14*c_h+15,"3.氮N0(Kmol/m^3):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-13*c_h+15,"4.密度ρ(Kg/m^3):");//输出字符串模拟控件文字
	setcolor(RGB(0,255,0));//
	outtextxy(c_x1+10,H-DH-12*c_h+15,"5.碳转换系数r:");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-11*c_h+15,"6.耗氮速率比λ:");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-10*c_h+15,"7.速度常数α:");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-9*c_h+15,"8.速度常数β:");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-8*c_h+15,"9.结合能比例R1:");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-7*c_h+15,"10.增碳比例R3(E-6):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-6*c_h+15,"11.增氮比例R5(E-6):");//输出字符串模拟控件文字
	setcolor(RGB(255,255,255));//
	outtextxy(c_x1+10,H-DH-5*c_h+15,"12.计算时间(h):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-4*c_h+15,"13.输入时间t(h):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-3*c_h+15,"14.植物重量(Kg):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-2*c_h+15,"15.碳Ct(Kmol/m^3):");//输出字符串模拟控件文字
	outtextxy(c_x1+10,H-DH-1*c_h+15,"16.氮Nt(Kmol/m^3):");//输出字符串模拟控件文字
	//8.初始化原始数据
	outtextxy(W-DW-DC+DC/2+30,H-DH-16*c_h+15,is1);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-15*c_h+15,is2);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-14*c_h+15,is3);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-13*c_h+15,is4);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-12*c_h+15,is5);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-11*c_h+15,is6);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-10*c_h+15,is7);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-9*c_h+15,is8);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-8*c_h+15,is9);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-7*c_h+15,is10);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-6*c_h+15,is11);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-5*c_h+15,is12);//写控件字符串
	outtextxy(W-DW-DC+DC/2+30,H-DH-4*c_h+15,is13);//写控件字符串
}//结束子程序
//计算数据子函数
void sub_calculate()
{
	//1.原始数据转化为双精度数
	d1=atof(is1);//1.初始质量W0(kg)
	d2=atof(is2);//2.碳C0(Kmol/m^3)
	d3=atof(is3);//3.氮N0(Kmol/m^3)
	d4=atof(is4);//4.密度ρ(Kg/m^3)
	d5=atof(is5);//5.碳转换系数r
	d6=atof(is6);//6.耗氮速率比λ
	d7=atof(is7);//7.速度常数α
	d8=atof(is8);//8.速度常数β
	d9=atof(is9);//9.结合能比例R1
	d10=0.000001*atof(is10);//10.增碳比例R3(E-6)
	d11=0.000001*atof(is11);//11.增氮比例R5(E-6)
	d12=atof(is12);//12.计算时间(h)
	d13=atof(is13);//13.输入时间t(h)
	//2.根据数据计算要求项目---------------------------------------------------------------------------
	double n1,n2,n3;//
	DPOINT *p1;//1.重量
	DPOINT *p2;//2.碳浓度
	DPOINT *p3;//3.氮浓度
	p1=new DPOINT[10000];//定义N1点表
	p2=new DPOINT[10000];//定义N2点表
	p3=new DPOINT[10000];//定义N3点表
	double w0=d1;//初始值
	double c0=d2;//
	double n0=d3;//
	double m1;//中间变量
	for(int j=0;j<=d12;j++)//时间范围(步长为1)
	{
		func_m1(w0,w0*c0,w0*n0,&m1);//中间变量1
		double dy1=1.0*d5*d9*m1/d4;//增量1
		double dy2=d4*d10*w0-m1;//增量2
		double dy3=d4*d11*w0-d6*m1;//增量3
		w0=w0+dy1;//新w0
		c0=(w0*c0+dy2)/w0;//新c0
		n0=(w0*n0+dy3)/w0;//新n0
		//存储计算值--------------------------------
		p1[j].x=j;p1[j].y=w0;//
		p2[j].x=j;p2[j].y=c0;//
		p3[j].x=j;p3[j].y=n0;//
		//cout<<j<<" "<<n0<<endl;
	}//结束for
	wf=w0;cf=c0;nf=n0;//
	d14=p1[int(d13)].y;//
	d15=p2[int(d13)].y;//
	d16=p3[int(d13)].y;//
	//3.将计算结果转化为字符串--------------------------------------------------------------------------
	gcvt(d14,6,is14);//
	gcvt(d15,6,is15);//
	gcvt(d16,6,is16);//
	//4.将字符串写入控件中
	setfillcolor(BLACK);
	//------------------------------------------------------------
	fillrectangle(W-DW-DC+DC/2+40,H-DH-3*c_h+1,W-DW,H-DH-2*c_h);
	outtextxy(W-DW-DC+DC/2+45,H-DH-3*c_h+15,is14);//写控件字符串	
	//------------------------------------------------------------
	fillrectangle(W-DW-DC+DC/2+40,H-DH-2*c_h+1,W-DW,H-DH-1*c_h);
	outtextxy(W-DW-DC+DC/2+45,H-DH-2*c_h+15,is15);//写控件字符串	
	//------------------------------------------------------------
	fillrectangle(W-DW-DC+DC/2+40,H-DH-1*c_h+1,W-DW,H-DH-0*c_h);
	outtextxy(W-DW-DC+DC/2+45,H-DH-1*c_h+15,is16);//写控件字符串	
	//------------------------------------------------------------
	setcolor(cc1);//说明曲线颜色
	line(W-DW-DC-200,H-DH-4*36+18,W-DW-DC-260,H-DH-4*36+18);	
	outtextxy(W-DW-DC-200+15,H-DH-4*36+12,"1.时刻t_植物重量W(t)");//写控件字符串
	//------------------------------------------------------------
	setcolor(cc2);//说明曲线颜色
	line(W-DW-DC-200,H-DH-3*36+18,W-DW-DC-260,H-DH-3*36+18);	
	outtextxy(W-DW-DC-200+15,H-DH-3*36+12,"2.时刻t_植物碳浓度C(t)");//写控件字符串
	//------------------------------------------------------------
	setcolor(cc3);//说明曲线颜色
	line(W-DW-DC-200,H-DH-2*36+18,W-DW-DC-260,H-DH-2*36+18);	
	outtextxy(W-DW-DC-200+15,H-DH-2*36+12,"3.时刻t_植物氮浓度N(t)");//写控件字符串
	//------------------------------------------------------------
	//5.绘制工作区坐标线
	//画x轴刻度标线及文字(时间t)---------------------------
	double xstep=(W-2*DW-DC)/(1.0*nx);//x方向步长(nx个刻度)(对应的绘图单位)
	double ystep=(H-DH-DD)/(1.0*ny);//y方向步长(ny个刻度)(对应的绘图单位)
	x_scale=(W-2*DW-DC)*1.0/(1.0*d12);//每个数学单位x对应的屏幕单位
	y_scale1=(H-DH-DD)*1.0/(1.0*wf);//重量比例
	y_scale2=(H-DH-DD)*1.0/(1.0*cf);//碳浓度比例
	y_scale3=(H-DH-DD)*1.0/(1.0*d3);//氮浓度比例
	for(i=0;i<=nx;i++)
	{
		setcolor(c1);//竖直辅助线颜色
		line(DW+xstep*i,H-DH,DW+xstep*i,DD);//画竖直小刻度线
		setcolor(c3);//文字颜色
		value=i*(d12)/(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(c1);//水平辅助线颜色
		line(DW,DD+ystep*i,W-DW-DC,DD+ystep*i);//画水平小刻度线
		//1.重量标记---------------
		setcolor(cc1);//文字颜色
		value=(ny-i)*(1.0*wf)/ny;//所在的刻度数值
		gcvt(value,5,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+15,DD+ystep*i+10,stt);//在规定的位置放置字符串
		//2.碳浓度标记---------------
		setcolor(cc2);//文字颜色
		value=(ny-i)*(1.0*cf)/ny;//所在的刻度数值
		gcvt(value,5,stt);//将浮点数value转换为字符串stt
		outtextxy(DW+15,DD+ystep*i-0,stt);//在规定的位置放置字符串
		//3.氮浓度标记---------------
		setcolor(cc3);//文字颜色
		value=(ny-i)*(1.0*d3)/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);//控件区域边框	
	//------------------------------------------------------------
	//8.绘制时刻变化时的重量浓度变化曲线---------------------------------------------------
	setcolor(cc1);//曲线颜色1
	for(j=0;j<=d12-1;j++)//
	{
		//cout<<j<<" "<<DW+(p1[j].x)*x_scale<<" "<<H-DH-(p1[j].y)*y_scale1<<endl;//
		line(DW+(p1[j].x)*x_scale,H-DH-(p1[j].y)*y_scale1,DW+(p1[j+1].x)*x_scale,H-DH-(p1[j+1].y)*y_scale1);//1.重量
	}//结束for
	setcolor(cc2);//曲线颜色2
	for(j=0;j<=d12-1;j++)//
	{
		//cout<<j<<" "<<DW+(p2[j].x)*x_scale<<" "<<H-DH-(p2[j].y)*y_scale2<<endl;//
		line(DW+(p2[j].x)*x_scale,H-DH-(p2[j].y)*y_scale2,DW+(p2[j+1].x)*x_scale,H-DH-(p2[j+1].y)*y_scale2);//2.碳浓度
	}//结束for
	setcolor(cc3);//曲线颜色3
	for(j=0;j<=d12-1;j++)//
	{
		//cout<<j<<" "<<DW+(p3[j].x)*x_scale<<" "<<H-DH-(p3[j].y)*y_scale3<<endl;//
		line(DW+(p3[j].x)*x_scale,H-DH-(p3[j].y)*y_scale3,DW+(p3[j+1].x)*x_scale,H-DH-(p3[j+1].y)*y_scale3);//3.氮浓度
	}//结束for
}//结束子函数
void func_m1(double y1,double y2,double y3,double *m1)//中间变量1
{
	*m1=1.0*d7*y1*y2*y3/(y1*y1+d8*y2*y3);//
}//结束子函数
//*/
//--------------------------------------------------------------------------------------------------

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值