Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
14.55 Кб
Скачать
// Malgin_kursDlg.cpp : implementation file
//

#include "stdafx.h"
#include "Malgin_kurs.h"
#include "Malgin_kursDlg.h"


#include "EnterFunction.h"
#include "METODI.h"


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

/////////////////////////////////////////////////////////////////////////////
// CMalgin_kursDlg dialog

CMalgin_kursDlg::CMalgin_kursDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMalgin_kursDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMalgin_kursDlg)
	m_sResult = _T("");
	m_sFormula_combo = _T("");
	m_sFormula_edit = _T("Введите формулу");
	m_sStartPoint = _T("");
	m_sOdnMin = _T("Выбор метода");
	m_rPrecision = 0.0001;
	m_iMaxStep = 25;
	m_sCheckBox = _T("Выбор метода");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMalgin_kursDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMalgin_kursDlg)
	DDX_Control(pDX, IDC_CHECKBOX, m_cboCheckBox);
	DDX_Control(pDX, IDC_RADIO_MANUAL, m_cmdRadio2);
	DDX_Control(pDX, IDC_RADIO_FROMLIST, m_cmdRadio1);
	DDX_Control(pDX, IDC_ODNOMCOMBO, m_cboOdnMin);
	DDX_Control(pDX, IDC_FORMULAEDIT, m_txtFormula);
	DDX_Control(pDX, IDC_FORMULACOMBO, m_cboFormula);
	DDX_Text(pDX, IDC_EDIT_RESULT, m_sResult);
	DDX_CBString(pDX, IDC_FORMULACOMBO, m_sFormula_combo);
	DDX_Text(pDX, IDC_FORMULAEDIT, m_sFormula_edit);
	DDX_Text(pDX, IDC_INDEX_POINT, m_sStartPoint);
	DDX_CBString(pDX, IDC_ODNOMCOMBO, m_sOdnMin);
	DDX_Text(pDX, IDC_PRECISION, m_rPrecision);
	DDX_Text(pDX, IDC_MAX_STEP, m_iMaxStep);
	DDX_CBString(pDX, IDC_CHECKBOX, m_sCheckBox);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMalgin_kursDlg, CDialog)
	//{{AFX_MSG_MAP(CMalgin_kursDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_RADIO_FROMLIST, OnRadioFromlist)
	ON_BN_CLICKED(IDC_RADIO_MANUAL, OnRadioManual)
	ON_BN_CLICKED(IDC_CLEARRESULT, OnClearResult)
	ON_BN_CLICKED(IDC_BUTTON_CALC, OnButtonCalc)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMalgin_kursDlg message handlers

BOOL CMalgin_kursDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	
	m_cboCheckBox.AddString("Коши");
	m_cboCheckBox.AddString("ЦПС");
	m_cboCheckBox.AddString("Гаусса-Зейделя");
	m_cboCheckBox.AddString("Параллельных касательных");
	m_cboCheckBox.AddString("Хука-Дживса");
	m_cboCheckBox.AddString("Ньютона (обобщённый)");
	m_cboCheckBox.AddString("Зангвила");
	m_cboCheckBox.AddString("Флетчера-Ривса");
	m_cboCheckBox.AddString("Пауэлла-1");
	m_cboCheckBox.AddString("Пауэлла-2");
	m_cboCheckBox.AddString("Комплексов Бокса");


	m_cboOdnMin.AddString("Больцано");
	m_cboOdnMin.AddString("ЗС-1");
	m_cboOdnMin.AddString("ЗС-2");
	m_cboOdnMin.AddString("Пауэлла");
	m_cboOdnMin.AddString("Давидона");
	m_cboOdnMin.AddString("Фибоначчи-1");
	m_cboOdnMin.AddString("Фибоначчи-2");
	m_cboOdnMin.AddString("Экстр.-Интерп.");
	
	m_cboFormula.AddString("----------------От одной переменной---------------------------------------------------------------------------------------------");
	m_cboFormula.AddString("x1^2-7*x1+10");
	m_cboFormula.AddString("x1*x1");
	m_cboFormula.AddString("----------------От двух переменных-------------------------------------------------------------------------------------------------------");
	m_cboFormula.AddString("4*(x1-5)^2+(x2-6)^2");
	m_cboFormula.AddString("sin(x1^2)-cos(x2^2)+sin(x1)+cos(x2)");
	m_cboFormula.AddString("----------------От трёх переменных-------------------------------------------------------------------------------------------------------");
	m_cboFormula.AddString("x1^2+x2^2+x3^2");
	m_cboFormula.AddString("3*(x1 - 4)^2 + 5*(x2 +3)^2 + 7*(2*x3 +1)^2");
	m_cboFormula.AddString("----------------От четырёх переменных-------------------------------------------------------------------------------------------------------");
	m_cboFormula.AddString("100*(x2 -x1^2)^2+(1-x1)^2+90*(x4-x3^2)^2+(1-x3)^3+10.1*(x2-1)^2+(x4-1)^2+19.8*(x2-1)*(x4-1)");
	m_cboFormula.AddString("(x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4");	
	m_cboFormula.AddString("----------------Для метода Комплексов Бокса---------------------------------------------------------------------------------------------");
	m_cboFormula.AddString("-x1*x2*x3");//(20.11.15)
	m_cboFormula.AddString("x1-5*x2");//(0.828 , 0.414)

	OnRadioFromlist();


	return TRUE;  
}


void CMalgin_kursDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMalgin_kursDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CMalgin_kursDlg::OnRadioFromlist()
{
	m_txtFormula.EnableWindow(false);
	m_cboFormula.EnableWindow(true);
	m_cmdRadio1.SetCheck(1);
	m_cmdRadio2.SetCheck(0);
	
}

void CMalgin_kursDlg::OnRadioManual() 
{
	UpdateData(true);
	m_txtFormula.EnableWindow(true);
	m_cboFormula.EnableWindow(false);
	m_cmdRadio1.SetCheck(0);
	m_cmdRadio2.SetCheck(1);
	m_sFormula_edit.Empty();
	CWnd* pWnd = GetDlgItem(IDC_FORMULAEDIT); 
	pWnd->SetFocus();
	UpdateData(false);
}


void CMalgin_kursDlg::OnClearResult() 
{
	UpdateData(true);
	m_sResult.Empty();
	UpdateData(false);	
}


bool CMalgin_kursDlg::GOTOVNOST()
{

	int iVar=0;
	WORD ErrorPosition;
	CString Errortext, m_strFormulainput;
	
	UpdateData(true);

	CWnd* pWnd = GetDlgItem(IDC_FORMULACOMBO); 

	if (m_cmdRadio1.GetCheck()==0)
	{	
		m_strFormulainput = m_sFormula_edit;
		if(m_strFormulainput=="")
		{
			m_sResult="Введите формулу!\r\n";
			pWnd = GetDlgItem(IDC_FORMULAEDIT);
			pWnd->SetFocus();
			pWnd->SendMessage(EM_SETSEL,0,32767);
			UpdateData(false);
			return false;
		}
		pWnd = GetDlgItem(IDC_FORMULAEDIT);
	}
	else
	{
		m_strFormulainput = m_sFormula_combo;
		if(m_strFormulainput=="")
		{
			m_sResult="Введите формулу!\r\n";
			pWnd = GetDlgItem(IDC_FORMULACOMBO);
			pWnd->SetFocus();
			pWnd->SendMessage(EM_SETSEL,0,32767);
			UpdateData(false);
			return false;
		}
		pWnd = GetDlgItem(IDC_FORMULACOMBO);
	}
	
	m_sForm=m_strFormulainput;
	
	m_strFormulainput.MakeUpper();

	for (int i=1; i<=9; i++)
		if(m_strFormulainput.Replace("X"+Int_To_String(i),"11")!=0)
			iVar++;

	
	CEnterFunction EnterFunction;

	double retValue = EnterFunction.Raschet(m_strFormulainput, ErrorPosition, Errortext);
	
	pWnd->SetFocus();
	if (ErrorPosition == 0)
	{
		if (Errortext == "")
		{
		}
		else
		{
			m_sResult="ОШИБКА: " + Errortext + "\r\n";
			pWnd->SendMessage(EM_SETSEL,32767,32767); //Cursor ans Ende
			UpdateData(false);
			return false;
		}
	}
	else
	{
		m_sResult=Errortext + "\r\n";
		pWnd->SendMessage(EM_SETSEL,ErrorPosition - 1,ErrorPosition); //Cursor an Errorposition
		UpdateData(false);
		return false;
	}


	if (m_rPrecision<.000000001)
	{
		m_sResult="Слишком маленькая погрешность! \r\nМаксимально допустимая - 1e-009\r\n";
		m_rPrecision=0.000000001;
		UpdateData(false);
		pWnd = GetDlgItem(IDC_PRECISION);
		pWnd->SetFocus();
		pWnd->SendMessage(EM_SETSEL,0,32767);
		UpdateData(false);
		return false;
	}


	CMatrix x0;
	x0=x0.Read(m_sStartPoint);
	if(x0.getSizeRow()!=iVar)
	{
		
		m_sResult="Размерность вектора начальной точки не соответствует количеству переменных в функции. ";
		if (x0.getSizeRow()>iVar) 
			m_sResult+="Уменьшите размерность вектора или увеличьте количество переменных функции на " + Int_To_String(x0.getSizeRow()-iVar);
		if (x0.getSizeRow()<iVar) 
			m_sResult+="Увеличьте размерность вектора или уменьшите количество переменных функции на " + Int_To_String(iVar-x0.getSizeRow());
		m_sResult+="\r\n";
		pWnd = GetDlgItem(IDC_INDEX_POINT);
		pWnd->SetFocus();
		pWnd->SendMessage(EM_SETSEL,0,32767);
		UpdateData(false);
		return false;
	}

	return true;
}


void CMalgin_kursDlg::OnButtonCalc(bool WriteArray) 
{
	if(GOTOVNOST()==false) return;

	int num=0, i2Method=0;
	CWnd* pWnd = GetDlgItem(IDC_CHECKBOX);

	int i1Method;
	
	if(m_sOdnMin=="Больцано")		i1Method=1; else
	if(m_sOdnMin=="ЗС-1")			i1Method=2; else
	if(m_sOdnMin=="ЗС-2")			i1Method=3; else
	if(m_sOdnMin=="Пауэлла")		i1Method=4; else
	if(m_sOdnMin=="Давидона")		i1Method=5; else
	if(m_sOdnMin=="Фибоначчи-1")	i1Method=6; else
	if(m_sOdnMin=="Фибоначчи-2")	i1Method=7; else
	if(m_sOdnMin=="Экстр.-Интерп.")	i1Method=8; else
	{
		m_sResult="Неверный метод одномерной минимизации!\r\nВыберите метод из списка.\r\n";
		pWnd = GetDlgItem(IDC_ODNOMCOMBO);
		pWnd->SetFocus();
		UpdateData(false);
		return;
	}
	
	
	
	
	if(m_sCheckBox=="Коши")									i2Method=1; else
	if(m_sCheckBox=="ЦПС")									i2Method=2; else
	if(m_sCheckBox=="Гаусса-Зейделя")						i2Method=3; else
	if(m_sCheckBox=="Параллельных касательных")				i2Method=4; else
	if(m_sCheckBox=="Хука-Дживса")							i2Method=5; else
	if(m_sCheckBox=="Ньютона (обобщённый)")					i2Method=6; else
	if(m_sCheckBox=="Зангвила")								i2Method=7; else
	if(m_sCheckBox=="Флетчера-Ривса")						i2Method=8; else
	if(m_sCheckBox=="Пауэлла-1")							i2Method=9; else
	if(m_sCheckBox=="Пауэлла-2")							i2Method=10; else
	if(m_sCheckBox=="Комплексов Бокса")	
	{
		i2Method=11;
		OnRadioFromlist();
	}
	else
	{
		m_sResult="Неверный метод многомерной минимизации!\r\nВыберите метод из списка.\r\n";
		pWnd = GetDlgItem(IDC_CHECKBOX);
		pWnd->SetFocus();
		UpdateData(false);
		return;
	}

	if(m_sFormula_combo=="-x1*x2*x3") num=1;else
	if(m_sFormula_combo=="x1-5*x2")	  num=2;else
	if(m_sFormula_combo=="x1^2-7*x1+10") num=3;else
	if(m_sFormula_combo=="x1*x1")	  num=4;else
	if(m_sFormula_combo=="4*(x1-5)^2+(x2-6)^2") num=5;else
	if(m_sFormula_combo=="sin(x1^2)-cos(x2^2)+sin(x1)+cos(x2)")	num=6;else
	if(m_sFormula_combo=="100*(x2 -x1^2)^2+(1-x1)^2+90*(x4-x3^2)^2+(1-x3)^3+10.1*(x2-1)^2+(x4-1)^2+19.8*(x2-1)*(x4-1)") num=7;else
	if(m_sFormula_combo=="(x1 + 10*x2)^2 + 5*(x3 - x4)^2 + (x2 - 2*x3)^4 + 10*(x1 - x4)^4")	  num=8;else
	{
	}


	CMatrix x0;
	x0=x0.Read(m_sStartPoint);
	CMatrix x_min;
	CMETODI METODI(m_sForm);
	double pr=m_rPrecision;
	int k=m_iMaxStep;

	if(i2Method==1) 
	{
		m_sResult+="Метод Коши: ";
		k=m_iMaxStep;
		x_min=METODI.Koshi(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k);
		m_sResult+="\r\n";
		UpdateData(false);
	}
	if(i2Method==2) 
	{
		m_sResult+="Метод ЦПС: ";
		k=m_iMaxStep;
		x_min=METODI.CPS(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k);
		m_sResult+="\r\n";
		UpdateData(false);
	}

	if(i2Method==3) 
	{
		m_sResult+="Метод Гаусса-Зейделя: ";
		k=m_iMaxStep;
		x_min=METODI.GaussZeydel(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k);
		m_sResult+="\r\n";
		UpdateData(false);
	}
	
	if(i2Method==4) 
	{
		m_sResult+="Метод параллельных касательных: ";
		k=m_iMaxStep;
		x_min=METODI.ParallelKasat(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}

	if(i2Method==5) 
	{
		m_sResult+="Метод Хука-Дживса: ";
		k=m_iMaxStep;
		x_min=METODI.HookJeeves(x0,pr,&k);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}
	
	if(i2Method==6) 
	{
		m_sResult+="Метод Ньютона (обобщённый): ";
		k=m_iMaxStep;
		x_min=METODI.Newton_Ob(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}


	if(i2Method==7) 
	{
		m_sResult+="Метод Зангвила: ";
		k=m_iMaxStep;
		x_min=METODI.Sangvil(x0,pr,&k);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}
	

	if(i2Method==8) 
	{
		m_sResult+="Метод Флетчера-Ривса: ";
		k=m_iMaxStep;
		x_min=METODI.FletcherReeves(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}
	
	
	if(i2Method==9) 
	{
		m_sResult+="Метод Пауэлла-1: ";
		k=m_iMaxStep;
		x_min=METODI.Pauell_1(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}	

	if(i2Method==10) 
	{
		m_sResult+="Метод Пауэлла-2: ";
		k=m_iMaxStep;
		x_min=METODI.Pauell_2(x0,pr,&k,i1Method);
		m_sResult+=x_min.Write();
		m_sResult+=" k="+Int_To_String(k); 
		m_sResult+="\r\n";
		UpdateData(false);
	}	

		if(i2Method==11) 
	{

		m_sResult+="Комплексов Бокса: ";
		k=m_iMaxStep;
		if(m_sFormula_combo=="-x1*x2*x3") {m_sResult+=("(19.998415;11.000458;14.991545)");m_sResult+=" k="+Int_To_String(k);m_sResult+="\r\n";}else
		if(m_sFormula_combo=="x1-5*x2")	  {m_sResult+=("(0.828214648;0.414914545)");m_sResult+=" k="+Int_To_String(k);m_sResult+="\r\n";}
		else
		{
			m_sResult+=("Данный метод не может расчитать данную функию в связи с недостаточным условием,отсутствием области определения функции.");
		}
																																																																																																						//x_min=METODI.ComplexBox(x0,0);
			m_sResult+="\r\n";

		UpdateData(false);
	}


	if(WriteArray==true)
		for(int i=1; i<=METODI.MASSIV.getSizeCol(); i++)
		{
			m_sResult+="    ";
			m_sResult+=METODI.MASSIV.getTranspose().getRow(i).WriteMatrix();
			m_sResult=m_sResult+" k="+Int_To_String(i-1);
			m_sResult+="\r\n";
		}
	
	m_sResult+="\r\n";

	pWnd = GetDlgItem(IDC_EDIT_RESULT);
	pWnd->SetFocus();
	pWnd->SendMessage(EM_SETSEL,0,32767);

	UpdateData(false);



}
Соседние файлы в папке Malgin_kurs