Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Оптимизация в САПР / Malgin_kurs / Malgin_kursDlg
.cpp// 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