Files
ARPZ_s1_pr1.1/main.cpp
2024-10-12 10:45:18 +03:00

102 lines
3.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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;
}