Давно учил С++, уже его подзабыл, но сейчас необходимо решить задание. Буду благодарен любой помощи!
Задание:
Есть нелинейное уравнение 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
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Создаю на плюсах нестандартное окно по png рисунку через UpdateLayeredWindowКак на этом окне отобразить стандартные контролы? В частности меня интересуют...