Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:22_VichMat_lab1 / VjchMatLab1
.cpp// 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