⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imitateview.cpp

📁 主要实现了计算方法中的曲线拟合
💻 CPP
字号:
// IMITATEView.cpp : implementation of the CIMITATEView class
//

#include "stdafx.h"
#include "IMITATE.h"
#include "InPut.h"
#include "NUMBER.h"
#include "fstream.h"
#include "math.h"
#include "Mnum.h"


#include "IMITATEDoc.h"
#include "IMITATEView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView

IMPLEMENT_DYNCREATE(CIMITATEView, CView)

BEGIN_MESSAGE_MAP(CIMITATEView, CView)
	//{{AFX_MSG_MAP(CIMITATEView)
	ON_COMMAND(ID_Input, OnInput)
	ON_COMMAND(ID_DWrite, OnDWrite)
	ON_COMMAND(ID_DRead, OnDRead)
	ON_COMMAND(ID_Imitate, OnImitate)
	ON_COMMAND(ID_1_Imitate, On1Imitate)
	ON_COMMAND(ID_2_Imitate, On2Imitate)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView construction/destruction

CIMITATEView::CIMITATEView()
{
	// TODO: add construction code here
	NUM=0;
	for(int i=0;i<20;i++)
		Time[i]=0.0;
}

CIMITATEView::~CIMITATEView()
{
}

BOOL CIMITATEView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView drawing

void CIMITATEView::OnDraw(CDC* pDC)
{
	CIMITATEDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data her	

}

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView printing

BOOL CIMITATEView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CIMITATEView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CIMITATEView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView diagnostics

#ifdef _DEBUG
void CIMITATEView::AssertValid() const
{
	CView::AssertValid();
}

void CIMITATEView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CIMITATEDoc* CIMITATEView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CIMITATEDoc)));
	return (CIMITATEDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CIMITATEView message handlers

void CIMITATEView::OnInput() 
{
	// TODO: Add your command handler code here
	InPut input;
	NUMBER num;

	if(num.DoModal()==IDOK)
		NUM=num.m_Num;
    
	for(int i=0;i<num.m_Num;i++)
	{
		if(input.DoModal()==IDOK)//调用输入对话框
		{
			Time[i]=input.m_Time;//输入
		    C[i]=input.m_C;

		    input.m_Time=0.0;//清0
		    input.m_C=0.0;//清0
		}
	}
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::OnDWrite() 
{
	// TODO: Add your command handler code here

	CFileDialog dlg(FALSE,"*.txt","*.txt");
	CString path;
	
	if(dlg.DoModal()==IDOK)//调用文件保存对话框
	{
		path=dlg.GetFileName();
	}

	else
		exit(0);
	
	ofstream fout(path);
	fout<<NUM<<" ";//保存数据组数
	for(int i=0;i<NUM;i++)
	{
		
		if(!fout)//出错
		{
			MessageBox("文件不存在!");
			exit(0);
		}
		fout<<Time[i]<<" "<<C[i]<<" ";//依次保存时间和浓度
	

	}
		fout.close();//文件关闭
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::OnDRead() 
{
	// TODO: Add your command handler code here

	CFileDialog dlg(TRUE,"*.txt","*.txt");
	CString path;
	
	if(dlg.DoModal()==IDOK)//调用打开对话框
	{
		path=dlg.GetFileName();

	}
	else
		exit(1);

	ifstream fin(path);
	if(!fin)//文件不存在
	{
		MessageBox("文件不存在!");
		exit(0);
	}
	fin>>NUM;//读出组数
    
	for(int i=0;i<NUM;i++)
		fin>>Time[i]>>C[i];//依次读出时间和浓度

	fin.close();//文件关闭

	OutPut();//输出函数
    		

	
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::Gauss(double sz[][20],int n)
{
	int j, t;//t记录最大下标
    double s,c,p; //s交换中间变量
                                 
    for(int k=0;k<n;k++)                         
	{
		p=0;
        for(int i=k;i<n+1;i++)           
        {
			if(p<fabs(sz[i][k])) //找最大行
            {
			   p=fabs(sz[i][k]);
               t=i;//记录行标
             }
		}

		if(k!=t) //交换
        for( j=k;j<n+2;j++)
        {
			s=sz[k][j];
            sz[k][j]=sz[t][j];
            sz[t][j]=s;
         }
		
		j=k+1;
        while(j<n+1)             
		{ 
			c=sz[j][k]/sz[k][k];//变换系数
			for(i=k;i<n+1;i++)
			     sz[j][i]=sz[j][i]-c*sz[k][i];
		    j++;
		}
    }
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::OnImitate() 
{
	// TODO: Add your command handler code here
    if(IsEmpty()==0)
		MessageBox("请先读入数据!");
	else{

    Mnum nu;
	nu.DoModal();//调用次数对话框

	Nihe(Time,C,nu.m_mnum);//根据输入求解方程

	CString Result="拟合曲线方程为:\n";
	CString str;
	str.Format("y=%.6f",X[0]);
	Result+=str;
	for(int i=1;i<nu.m_mnum+1;i++)//定制输出
	{
		str.Format("+(%.4f)t^%d",X[i],i);
		Result+=str;
	}
	MessageBox(Result);
	}
}	
	
/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::Nihe(double t[],double y[],int m)
{
	int i,j,k=0;
	double sz[N][N+1]={0},S[N]={0},T[N]={0};
	
	for(i=0;i<NUM;i++)
	{
		for(k=0;k<=2*m;k++)
		{
			S[k]=S[k]+pow(t[i],k);
			T[k]=T[k]+y[i]*(pow(t[i],k));
		}
	}
	
	for(i=0;i<m+1;i++)//构造系数矩阵
	{
		for(j=0;j<m+1;j++)
		{
			sz[i][j]=S[i+j];
		}
	}
	
	for(i=0;i<m+1;i++)
	{
		sz[i][m+1]=T[i];
	}
	Gauss(sz,m+1);

	double s=0.0;
	X[m]=sz[m][m+1]/sz[m][m];          //先求得最后一个解
    for(i=m-1;i>=0;i--)
	{  
		for(j=i+1;j<m+1;j++)
			s+=(sz[i][j]*X[j]);         
            X[i]=(sz[i][m+1]-s)/sz[i][i];        //回代公式求解
	        s=0;
	}
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::On1Imitate() 
{
	// TODO: Add your command handler code here

	double Cc[20]={0.0};

	if(IsEmpty()==0)
		MessageBox("请先读入数据!");
	else{


	for(int i=0;i<NUM;i++)
	{
		Cc[i]=1.0/C[i];//浓度求倒数
	}
		
	Nihe(Time,Cc,1);//一次拟合

	CString Result="拟合曲线方程为:\n";
	CString str;
	str.Format("1/y=1/%.6f",1/X[0]);
	Result+=str;
    str.Format("-(%.6f/%.6f)*t",X[1]/X[0],1/X[0],1);
	Result+=str;

	MessageBox(Result);//输出

	}
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::On2Imitate() 
{
	// TODO: Add your command handler code here

	double time[20],c[20];

	if(IsEmpty()==0)
		MessageBox("请先读入数据!");
	else{

	for(int i=0;i<NUM;i++)
	{
	     time[i]=1.0/Time[i];//时间求倒数
		 c[i]=log(C[i]);//浓度取对数
	}

    Nihe(time,c,1);//一次线形拟合

	CString Result="拟合曲线方程为:\n\n";
	CString str;
	str.Format("y=%.6fe^",exp(X[0]));
	Result+=str;
    str.Format("((%.6f)/t)",X[1],1);
	Result+=str;
	
	MessageBox(Result);//输出
	}
}

/////////////////////////////////////////////////////////////////////////////

void CIMITATEView::OutPut()
{
	CDC*pDC=GetDC();
	CString str;//用于输出


	pDC->TextOut(10,0,"数据清单如下:");
	for(int i=0;i<NUM;i++)
	{
		str.Empty();
		str.Format("时间:%lf     浓度:%lf",Time[i],C[i]);//定制格式
		pDC->TextOut(10,(i+1)*20,str);
	}
}

/////////////////////////////////////////////////////////////////////////////

int CIMITATEView::IsEmpty()//判空
{
	if(Time[0]==0)
	     return 0;
	 else
		 return 1;

}
/////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -