Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №11 / Operations
.cpp// Operations.cpp : implementation file
//
#include "stdafx.h"
#include "Lab 1.h"
#include "Lab 1Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// Function //////////////////////////////////////////////////////////////////////
double CLab1Dlg::Function(double X)
{
return (fabs(X) + exp(10*X));
}
double CLab1Dlg::Derivative(double X)
{
if (X < 0) return (-1 + 10 * exp(10*X));
if (X > 0) return (1 + 10 * exp(10*X));
if (X == 0)
{
if ((A < 0) && (B == 0)) return (-1 + 10 * exp(10*X));
if ((B > 0) && (A == 0)) return (1 + 10 * exp(10*X));
}
}
// DIP ///////////////////////////////////////////////////////////////////////////
void CLab1Dlg::DIPErrorCheck()
{
BOOL flag = TRUE;
if (A == B)
{
MessageBox("Нуливой интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (A > B)
{
MessageBox("Неверно заданный интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps <= 0)
{
MessageBox("Точность не может быть отрицательной или равной нулю",
"Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps > (B - A) / 2) MessageBox("Слишком низкая тосность", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
else
if ((Eps < 1e-15) && (Eps > 0))
{
if ((MessageBox("Слишком высокая точность. Вы хотите продолжить вычисления?",
"Предупрежение", MB_YESNO | MB_ICONQUESTION) == IDYES) && flag) CLab1Dlg::DIP();
}
else
{
if (flag) CLab1Dlg::DIP();
}
}
void CLab1Dlg::DIP()
{
double Xmin, Ymin;
int j;
double X[5];
double Y[5];
// Step 1
X[2] = (A + B) / 2;
Y[2] = Function(X[2]);
// Step 2
X[0] = A;
X[4] = B;
dipNN = 0;
while((X[4] - X[0]) > (2 * Eps))
{
X[1] = (X[0] + X[2]) / 2;
Y[1] = Function(X[1]);
X[3] = (X[2] + X[4]) /2;
Y[3] = Function(X[3]);
// Search MIN of Y[i]
Xmin = X[1];
Ymin = Y[1];
j = 1;
for (int i = 1; i < 3; i++)
{
if (Y[i] > Y[i+1])
{
Xmin = X[i+1];
Ymin = Y[i+1];
j = i + 1;
}
}
// Step 3
X[0] = X[j-1];
X[4] = X[j+1];
X[2] = Xmin;
Y[2] = Ymin;
dipNN++;
}
dipX = X[2];
dipY = Y[2];
}
// RBP ///////////////////////////////////////////////////////////////////////////
void CLab1Dlg::RBPErrorCheck()
{
BOOL flag = TRUE;
if (rbpN <= 0)
{
MessageBox("Число элементов в блоке не может быть отрицательным или равным нулю",
"Ошибк", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if ((rbpN % 2) == 0)
{
MessageBox("Число элементов в блоке не может быть четным по условию",
"Ошибк", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (A == B)
{
MessageBox("Нуливой интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (A > B)
{
MessageBox("Неверно заданный интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps <= 0)
{
MessageBox("Точность не может быть отрицательной или равной нулю",
"Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps > (B - A) / 2) MessageBox("Слишком низкая тосность", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
else
if ((Eps < 1e-15) && (Eps > 0)) // ! Check !
{
if ((MessageBox("Слишком высокая точность. Вы хотите продолжить вычисления?",
"Предупрежение", MB_YESNO | MB_ICONQUESTION) == IDYES) && flag) CLab1Dlg::RBP();
}
else
{
if (flag) CLab1Dlg::RBP();
}
}
void CLab1Dlg::RBP()
{
double Xmin, Ymin;
double Xi, Yi, Xa, Xb;
int j;
// Step 1
Xa = A;
Xb = B;
// Step 2
Xmin = (Xa + Xb) / 2;
Ymin = Function(Xmin);
rbpNN = 0;
j = (rbpN + 1) / 2;
while ((Xb - Xa) > (2 * Eps))
{
for (int i=1; i <= rbpN; i++)
{
Xi = Xa + (Xb - Xa) / (rbpN + 1) * i;
Yi = Function(Xi);
if (Yi < Ymin)
{
Xmin = Xi;
Ymin = Yi;
j = i;
}
}
Xa = Xa + (Xb - Xa) / (rbpN + 1) * (j - 1);
Xb = Xa + (Xb - Xa) / (rbpN + 1) * (j + 1);
rbpNN++;
}
rbpX = Xmin;
rbpY = Ymin;
}
// MK ////////////////////////////////////////////////////////////////////////////
void CLab1Dlg::MKErrorCheck()
{
BOOL flag = TRUE;
if ((A < 0) && (B > 0))
{
MessageBox("В точке X = 0 производная данной функции не существует",
"Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (A == B)
{
MessageBox("Нуливой интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (A > B)
{
MessageBox("Неверно заданный интервал", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps <= 0)
{
MessageBox("Точность не может быть отрицательной или равной нулю",
"Ошибка", MB_OK | MB_ICONEXCLAMATION);
flag = FALSE;
}
if (Eps > (B - A) / 2) MessageBox("Слишком низкая тосность", "Ошибка", MB_OK | MB_ICONEXCLAMATION);
else
if ((Eps < 1e-9) && (Eps > 0))
{
if ((MessageBox("Слишком высокая точность. Вы хотите продолжить вычисления?",
"Предупрежение", MB_YESNO | MB_ICONQUESTION) == IDYES) && flag) CLab1Dlg::MK();
}
else
{
if (flag) CLab1Dlg::MK();
}
}
void CLab1Dlg::MK()
{
double Xa, Ya, Xb, Yb, Da, Db;
double Xmin, Ymin, Dmin;
Xa = A;
Ya = Function(Xa);
Da = Derivative(Xa);
Xb = B;
Yb = Function(Xb);
Db = Derivative(Xb);
Xmin = (Xa + Xb) / 2;
Ymin = Function(Xmin);
mkNN = 0;
while ((Xb - Xa) > (2 * Eps))
{
Xmin = ((Xb * Db - Xa * Da) - (Yb - Ya)) / (Db - Da);
Ymin = Function(Xmin);
Dmin = Derivative(Xmin);
if (Dmin == 0) break;
else
{
if (Dmin > 0)
{
Xb = Xmin;
Yb = Ymin;
Db = Dmin;
}
if (Dmin < 0)
{
Xa = Xmin;
Ya = Ymin;
Da = Dmin;
}
}
mkNN++;
}
mkX = Xmin;
mkY = Ymin;
}
Соседние файлы в папке Лабораторная работа №11