📄 emulator.cpp
字号:
// Emulator.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "Emulator.h"
#include "fstream.h"
#include <string.h>
#include "math.h"
void WINAPI EmulatorMain()
{
int i,j;
int h_save_change=1;
//将文件句柄以全局变量形式出现,使得main和SaveData
ofstream ofMyOutputFile("Output.txt",ios::out);
//函数可以不用调用句柄参数即可实现文件的输入输出
ifstream ifMyinputFile("Input.txt",ios::in);
DataInput *m_DataInput=new DataInput;
InputData(ifMyinputFile,m_DataInput);
i=1;
j=1;
ofMyOutputFile<<"序号 "<<"时间(天)"<<"兔子 "<<"狐狸 "<<endl;
RK(m_DataInput);
do{
if((h_save_change=h_save_change%m_DataInput->h_save)==0)
{
ofMyOutputFile<<j<<" ";//存入序号
ofMyOutputFile<<i*m_DataInput->h<<" ";//存入自变量t
DataSave(ofMyOutputFile,m_DataInput);
h_save_change++;
j++;
}
else
{
h_save_change++;
}
i++;
RK(m_DataInput);
}
//采集的数据点数j
//while(j<366);
while(m_DataInput->Yn[1]!=0 && m_DataInput->Yn[0]!=0);
delete m_DataInput;
ifMyinputFile.close();
ofMyOutputFile.close();
AfxMessageBox("Finished!");
}
/*************************************************************************
*
* 函数名称:
* RK()
*
* 参数:
* DataInput m_DataInput - 传递步长以及积分初始值
* GlobalValue m_GlobalValue - 仅用来传递给右函数
* 返回值:
* 无 - 创建成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
* 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
* 可以用最好的颜色来显示DIB图像。
*
************************************************************************/
void WINAPI RK(DataInput *m_DataInput)
{
int i,j;
//此变量用来存放右函数计算结果
double *RightFunValue=new double[NUM];
//此变量用来存放前一个方程组左函数中的应变量值
double *Old_Yn=new double[NUM];
//此变量用来存放计算k2、k3、k4时需用到的应变量值
double *Yn_temp=new double[NUM];
double a[4];
a[0]=a[1]=m_DataInput->h/2;
a[2]=a[3]=m_DataInput->h;
for(i=0;i<NUM;i++)
Old_Yn[i]=m_DataInput->Yn[i];
//调用右函数,计算得到K1=fun(xn,yn)
RgtFun(RightFunValue,m_DataInput->Yn,m_DataInput);
for(j=0;j<3;j++)
{
for(i=0;i<NUM;i++)
{
Yn_temp[i]=Old_Yn[i]+a[j]*RightFunValue[i];
//根据公式yn+1= yn+h(k1+ 2k2+2 k3)/6计算yn+1
m_DataInput->Yn[i]=m_DataInput->Yn[i]+a[j+1]*RightFunValue[i]/3;
}
//计算k2、k3、k4
//ki= fun(xn',yn')
//yn'=Yn_temp
//注意此处m_DataInput只是为了传递参数用,用到Yn的地方必须用Yn_temp
RgtFun(RightFunValue,Yn_temp,m_DataInput);
}
//根据公式 yn+1= yn + h*k4/6 计算yn+1
for(i=0;i<NUM;i++)
m_DataInput->Yn[i]=m_DataInput->Yn[i]+a[0]*RightFunValue[i]/3;
delete[] Old_Yn;
delete[] RightFunValue;
delete[] Yn_temp;
}
/*************************************************************************
*
* 函数名称:
* RgtFun()
*
* 参数:
* DataInput m_DataInput - 传递步长以及积分初始值
* 返回值:
* 无 - 创建成功返回TRUE,否则返回FALSE。
*
* 说明:
* 该函数按照DIB创建一个逻辑调色板,从DIB中读取颜色表并存到调色板中,
* 最后按照该逻辑调色板创建一个新的调色板,并返回该调色板的句柄。这样
* 可以用最好的颜色来显示DIB图像。
*
************************************************************************/
void WINAPI RgtFun(double *RgtFunValue,double *Yn_temp,DataInput *m_DataInput)
{
//在此处为方程组右函数准备数据:
//在此处扩展方程组数量
RgtFunValue[0]=m_DataInput->opt[1]*m_DataInput->opt[0]*Yn_temp[0]
-m_DataInput->opt[2]*Yn_temp[0]*Yn_temp[1];
RgtFunValue[1]=m_DataInput->opt[2]*Yn_temp[0]*Yn_temp[1]
-m_DataInput->opt[3]*Yn_temp[1];
}
void WINAPI DataSave(ofstream ofMyOutputFile,DataInput *m_DataInput)
{
int i;
for(i=0;i<NUM;i++)
{
//以TAB键作分隔符,以利于查看输出文件
ofMyOutputFile<<(int)m_DataInput->Yn[i]<<" ";
if((int)m_DataInput->Yn[i]==0)
m_DataInput->Yn[i]=0;
}
ofMyOutputFile<<endl;
}
//从文件中读入数据
void WINAPI InputData(ifstream ifMyinputFile,DataInput *m_DataInput)
{
int i;
#define iCOLUMNS 1200
char cOneLine[iCOLUMNS];
///////////////////////////////////////////////////////////////////////////
//读取积分步长
ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
if(!strncmp(cOneLine,"积分步长",8))
{
ifMyinputFile.getline(cOneLine,1);
ifMyinputFile>>m_DataInput->h;//读取语句
}
///////////////////////////////////////////////////////////////////////////
//读取存储步长
ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
if(!strncmp(cOneLine,"存储步长",8))
{
ifMyinputFile.getline(cOneLine,1);
ifMyinputFile>>m_DataInput->h_save;//读取语句
}
///////////////////////////////////////////////////////////////////////////
//读取积分初始值
ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
if(!strncmp(cOneLine,"兔子、狐狸",10))
{
ifMyinputFile.getline(cOneLine,1);
//读取语句
for(i=0;i<NUM;i++)
ifMyinputFile>>m_DataInput->Yn[i];
}
///////////////////////////////////////////////////////////////////////////
//读取阻力系数
ifMyinputFile.getline(cOneLine,iCOLUMNS,'[');
ifMyinputFile.getline(cOneLine,iCOLUMNS,']');
if(!strncmp(cOneLine,"草原、兔子吃草速率、狐狸吃兔速率、猎人猎杀狐狸速率",50))
{
ifMyinputFile.getline(cOneLine,1);
//读取语句
for(i=0;i<4;i++)
ifMyinputFile>>m_DataInput->opt[i];
}
}
/*
//将改变后的初始数据输入文件
void WINAPI InputChangedData(ofstream ifMyinputFile,DataInput *m_DataInput)
{
int i,j;
///////////////////////////////////////////////////////////////////////////
//输入积分步长
ifMyinputFile<<"弹道仿真程序初始数据\n[积分步长]\n";
{
ifMyinputFile<<m_DataInput->h;//输入语句
}
///////////////////////////////////////////////////////////////////////////
//输入存储步长
ifMyinputFile<<"\n[存储步长]\n";
{
ifMyinputFile<<m_DataInput->h_save;//输入语句
}
///////////////////////////////////////////////////////////////////////////
//输入积分初始值
ifMyinputFile<<"\n[积分初始值]\n";
{
//输入语句
for(i=0;i<NUM;i++)
{
ifMyinputFile<<m_DataInput->Yn[i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入阻力系数
ifMyinputFile<<"\n[阻力系数]\n";
{
//输入语句
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
ifMyinputFile<<m_DataInput->CX[i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入升力系数
ifMyinputFile<<"\n[升力系数]\n";
{
//输入语句
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
ifMyinputFile<< m_DataInput->CY [i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入静稳定性导数
ifMyinputFile<<"\n[静稳定性导数]\n";
{
//输入语句
for(i=0;i<5;i++)
{
for(j=0;j<6;j++)
{
ifMyinputFile<< m_DataInput->MZA [i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入阻尼力矩系数导数
ifMyinputFile<<"\n[阻尼力矩系数导数]\n";
{
//输入语句
for(i=0;i<5;i++)
{
for(j=0;j<2;j++)
{
ifMyinputFile<< m_DataInput->MZWZ [i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入质心位置变化规律
ifMyinputFile<<"\n[质心位置变化规律]\n";
{
//输入语句
for(i=0;i<11;i++)
{
for(j=0;j<2;j++)
{
ifMyinputFile<< m_DataInput->XG [i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入转动惯量
ifMyinputFile<<"\n[转动惯量]\n";
{
//输入语句
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
{
ifMyinputFile<< m_DataInput->JZ [i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入推力
ifMyinputFile<<"\n[推力]\n";
{
//输入语句
for(i=0;i<2;i++)
{
ifMyinputFile<< m_DataInput->P [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//起飞发动机推力
ifMyinputFile<<"\n[起飞发动机推力]\n";
{
//输入语句
for(i=0;i<16;i++)
{
for(j=0;j<2;j++)
{
ifMyinputFile<< m_DataInput->PBEGIN[i][j];
ifMyinputFile<<" ";
}
ifMyinputFile<<"\n";
}
}
///////////////////////////////////////////////////////////////////////////
//输入质变率
ifMyinputFile<<"\n[质变率]\n";
{
//输入语句
for(i=0;i<2;i++)
{
ifMyinputFile<< m_DataInput->MC [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入质心始末位置
ifMyinputFile<<"\n[质心始末位置]\n";
{
//输入语句
for(i=0;i<2;i++)
{
ifMyinputFile<< m_DataInput->GC [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入最大、小马赫
ifMyinputFile<<"\n[最大、小马赫]\n";
{
//输入语句
for(i=0;i<2;i++)
{
ifMyinputFile<< m_DataInput->MA [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入最大、小攻角
ifMyinputFile<<"\n[最大、小攻角]\n";
{
//输入语句
for(i=0;i<2;i++)
{
ifMyinputFile<< m_DataInput->ALPHA [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入时间
ifMyinputFile<<"\n[时间]\n";
{
//输入语句
for(i=0;i<3;i++)
{
ifMyinputFile<< m_DataInput->T [i];
ifMyinputFile<<" ";
}
}
///////////////////////////////////////////////////////////////////////////
//输入特征长度
ifMyinputFile<<"\n[特征长度]\n";
{
//输入语句
ifMyinputFile<< m_DataInput->LONG;
}
///////////////////////////////////////////////////////////////////////////
//输入特征面积
ifMyinputFile<<"\n[特征面积]\n";
{
//输入语句
ifMyinputFile<< m_DataInput->S_AREA;
}
///////////////////////////////////////////////////////////////////////////
//输入声速
ifMyinputFile<<"\n[声速]\n";
{
//输入语句
ifMyinputFile<< m_DataInput->V_SONIC;
}
///////////////////////////////////////////////////////////////////////////
//输入大气密度
ifMyinputFile<<"\n[大气密度]\n";
{
//输入语句
ifMyinputFile<< m_DataInput->RHO;
}
///////////////////////////////////////////////////////////////////////////
//输入重力加速度
ifMyinputFile<<"\n[重力加速度]\n";
{
//输入语句
ifMyinputFile<< m_DataInput->G;
}
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -