Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

22_VichMat_lab1 / VjchMatLab1

.cpp
Скачиваний:
9
Добавлен:
14.03.2016
Размер:
3.16 Кб
Скачать
// VjchMatLab1.cpp : Нахождение корня уравнения вида f(x)=0 (в том числе трансцендентного), 
//                   на любом интервале [a;b], на котором функция монотонна, методом дихотомии (последовательное
//                   деление на две части, не связанные между собой).
//                   Подробнее о дихотомии можно узнать тут - http://ru.wikipedia.org/wiki/Дихотомия
// 13.09.2008  Version 1.0  © Сова Александр

#include "stdafx.h"
#include <cmath>
#include <ctime>
#include <iostream>


// **PARAMETRS **************************

#define F(x) 0.1 * x * x - x * log(x)    // Функция f(x)

#define delay 0.2        		     	 // Задержка между тактами посчёта
										 // (В секундах)   0 ~ ВЫкл

typedef double floatNumber;              // Тип используемых переменных

#define isFunctionInfo true              // Включить отображение функции f(x) в программе

#define Ftext "0.1 * x * x - x * log(x)" // Если опция isFunctionInfo включена, 
										 // сюда необходимо скопировать функцию f(x)
// **************************************



// Найти значение функции в точке "x"
inline float f( float x ) { return F(x); }






void main( )
{
	using std::cout;
	using std::endl;
	using std::cin;

	// '''''''''''''''''''''''''
	floatNumber a,b;          // Граничные точки на [a;b]
	floatNumber E;            // Требуемая точность (Погрешность < E)
	floatNumber x;            // Середина [a;b]

	int N = 0;                // Номер такта

	clock_t delayOfStep = delay * CLOCKS_PER_SEC;   // Для подсчёта времени задержки
	// '''''''''''''''''''''''''


	// ВВОД ДОПОЛНИТЕЛЬНЫХ ПАРАМЕТРОВ
	cout << "Parametrs:\n" << endl;
	cout << "Input a & b: ";
	cin >> a >> b;
	cout << "\nInput allowable error: ";
	cin >> E;
	
	// Очистка экрана
	system("cls");


	// Отображение заданных параметров на экране
	if ( isFunctionInfo )
	{
		cout << "\n   f(x) = " << Ftext << endl;
	}
	cout << "\n   Interval: [" << a << ";" << b << "]" << "\n\n";
	cout << "   Allowable error: " << E << "\n\n\n\n\n\n";


	// ПОИСК КОРНЯ
	// Если значения функций на концах отрезка имеют одинаковый
	// знак или введена отрицательная максимальная погрешность
	if ( f(a) * f(b) > 0 || E <= 0 )
	{
		printf("Error! Either there's no decision on [a,b], or function not monotonous on [a,b], or allowable error is wrong!");
	}
	else
	{
		// РАСЧЁТ КОРНЯ МЕТОДОМ ДИХОТОМИИ
		printf("      Calculation... Step #  0");
		clock_t start = clock();

		do // Сделать один шаг расчёта
		{
			N++;

			x = ( a + b ) / 2;

			if ( f(a) * f (x) > 0 )
			{
				a = x;
			}
			else
			{
				b = x;
			}

		for ( int i = N; i > 0; i /= 10 )
				printf( "\b" );
			printf( "%d", N );

			clock_t start = clock();
			while( clock() - start < delayOfStep );
		}
		// Пока не достигнута требуемая точность корня
		while ( abs( b - a ) > E );


		// ВЫВОД РЕЗУЛЬТАТА
		cout << endl << endl;
		cout.precision(16);
		cout << "      x = " << x << "  +- ";
		cout.precision(8);
		cout << E/2 << endl << endl;
		cout << "      f(x) = f(" << x << ") = " << f(x);
	}

	cin.get(); cin.get();
}
Соседние файлы в папке 22_VichMat_lab1