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