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

22_VichMat_lab1 / MetodNjutona

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

#define delay 0.01				     	 // Задержка между тактами посчёта
										 // (В секундах)   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)
inline float f1( float x ) { return F1(x); }






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

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

	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: [" << 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 = a;

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

			previousX = x;

			x = x - f(x)/f1(x);

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

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