Initial commit

This commit is contained in:
2024-10-12 10:45:18 +03:00
parent e4abf0a77e
commit 3f225e51e6
3 changed files with 142 additions and 0 deletions

101
main.cpp Normal file
View File

@@ -0,0 +1,101 @@
#include <iostream>
#include <cmath>
#include "functions.cpp"
// left - левая часть интервала
// right - правая часть интервала
// error - желаемая погрешность
// f - функция из задания
bool doesRootExist(double left, double right, double (*f)(double x))
{
// Функция для проверки существования корня функции в интервале.
// left - левая граница
// right - правая граница
// f - функция
//
if (f(left) * f(right) > 0)
{
return false;
}
return true;
}
double bisectionMethod(double left, double right, double error, double (*f)(double x))
{
// Метод половинного деления для нахождения корня функции f
// в интервале [left, right] с погрешностью error.
//
// left - левая граница
// right - правая граница
// error - желаемая погрешность
// f - функция
double center;
// Повторяем сужение до тех пор, пока расстояние центра center
// от корня функции f не достигнет желаемой погрешности error
while (std::fabs(right - left) > error)
{
center = left + (right-left)/2;
if (f(left) * f(center) < 0)
{
// Если ушли слишком далеко влево, то установим центр
// на правую границу
right = center;
}
else
{
// Ушли слишком далеко вправо, устанавливаем центр
// на левой границе
left = center;
}
}
return center;
}
// Метод хорд
double chordMethod(double left, double right, double error, double (*f)(double x))
{
while (std::fabs(right - left) > error)
{
left = left - (right - left) * f(left) / (f(right) - f(left));
right = right - (left - right) * f(right) / (f(left) - f(right));
}
return right;
}
int main()
{
// Включим языковые настройки для корректного отображения русских символов
setlocale(LC_ALL, "Russian");
auto function = &function_1;
double L = 0;
double R = 1;
double E = 0.0000001;
// Проверим, что может ли существовать корень в данном интервале
if (!doesRootExist(L, R, function))
{
std::printf("Нет корня в данном интервале\n");
return 0;
}
// Рассчитаем результат для функции с помощью обоих методов
double chordMethodResult = chordMethod(L, R, E, function);
double bisectionMethodResult = bisectionMethod(L, R, E, function);
// Отобразим результат
std::printf("Решение методом половинного деления: %f\n", bisectionMethodResult);
std::printf("Решение методом хорд: %f\n", chordMethodResult);
// Выполним проверку
std::printf("(Bisection) При x=%f: f(x)=%f\n", bisectionMethodResult, function(bisectionMethodResult));
std::printf("(Chord) При x=%f: f(x)=%f\n", chordMethodResult, function(chordMethodResult));
return 0;
}