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

22_VichMat_lab1 / MetodProstjxIteracii

.cpp
Скачиваний:
9
Добавлен:
14.03.2016
Размер:
2.84 Кб
Скачать
// VjchMatLab1.cpp : Нахождение корня уравнения вида f(x)=0 (в том числе трансцендентного), 
//                   на любом интервале [a;b], на котором |(f(x)+x)'| < 1, методом простых итераций
// 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)
// **************************************



// Найти значение f(x)
inline float f( float x ) { return F(x); }

// Найти значение f(x) + x
inline float fi( float x ) { return F(x) + 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: ";
	cin >> a;
	cout << "\nInput allowable error: ";
	cin >> E;
	
	// Очистка экрана
	system("cls");


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


	// ПОИСК КОРНЯ
	// Если значения функций на концах отрезка имеют одинаковый
	// знак или введена отрицательная максимальная погрешность
	if ( E <= 0 )
	{
		printf("Error! Allowable error is wrong!");
	}
	else
	{
		// РАСЧЁТ КОРНЯ МЕТОДОМ ИТЕРАЦИЙ
		printf("      Calculation... Step # 0");
		clock_t start = clock();

		x = fi(a);

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

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

			clock_t start = clock();
			while (clock() - start < delayOfStep );
		}
		// Пока не достигнута требуемая точность корня
		while ( abs( f(x) ) >= 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