Давно учил С++, уже его подзабыл, но сейчас необходимо решить задание. Буду благодарен любой помощи!
Задание:
Есть нелинейное уравнение cos(2/x) - 2sin(1/x) + 1/x = 0 , необходимо посчитать корень х на неком участке (а,b) с точностью eps (методом деления отрезка пополам). a,b,eps - вводит пользователь (консольный интерфейс)
Алгоритм расчета:
1) x = (a+b)/2;
2) Если f(a) * f(x) > 0 , в в следующей итерации a = x , иначе b = x;
3) Продолжать пока длина отрезка не станет меньше чем eps.
Есть такие наброски:
#include <stdio.h>
#include <Windows.h>
#include <cmath>
double f(double x)
{
return cos(2.0 / x) - 2 * sin(1.0 / x) + 1.0 / x;
}
int main()
{
double a, b, eps,fx,fa,x;
printf("\n a = ");
scanf("%f", &a);
printf("\n b = ");
scanf("%f", &b);
printf("\n eps = ");
scanf("%f", &eps);
do
{
x = (a + b) / 2;
if (f(x)*f(a) > 0) a = x;
else b = x;
} while (fabs(b - a) >= eps);
printf("\n x = %-10.3f", x);
system("PAUSE");
return 0;
}
В принципе, вы же все сделали правильно. Можно добавить кое-что по мелочи...
Во-первых, надо убедиться, что a<b - это упрощает жизнь.
if (a > b) { int t = a; a = b; b = t; }
Затем для начала проверим, есть ли решение:
double fa = f(a), fb = f(b);
if (fa*fb > 0)
{
puts("Метод неприменим");
exit(1);
}
Теперь вам не нужно вычислять на каждом шаге функцию лишний раз:
while( b - a > eps )
{
x = (a+b)/2.0;
if (fa*f(x) > 0)
a = x;
else
b = x;
}
В принципе, можно отдельно проверять, не равно ли f(x) == 0.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники