Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
02.05.2014
Размер:
5.82 Кб
Скачать
// 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