Найти решение уравнения - C (СИ)
Формулировка задачи:
Нужно найти решение уравнения: 2 * x - ln(x) - 5 = 0 на отрезке [2;4] с точностью до 7 знака,методом деления пополам.Моя программа выдает результат чуть больше 2.7,но по графику видно,что решение чуть больше 3.Где она ошибается понять не могу,нужна помощь знатоков.
#include<stdio.h>
#include<math.h>
int F(double x)
{
double F;
int flag = 0;
F = 2 * x - log10(x) - 5;
if (F < 0) flag = 1;
else flag = 0;
return flag;
}
int main(void)
{
double A = 2.0, B = 4.0, x0;
int c, a, b;
x0 = (A + B) / 2;
while ((x0 - A) >= 1e-7)
{
c = F(x0);
a = F(A);
b = F(B);
if (c == a) A = x0;
else B = x0;
x0 = (A + B) / 2;
}
printf("x0=%.7f\n", x0);
system("PAUSE");
return 0;
}Решение задачи: «Найти решение уравнения»
textual
Листинг программы
double F(double x)
{
return 2 * x - log(x) - 5;
}
int main()
{
double a = 2.0, b = 4.0, c;
c = (a + b) / 2;
while (abs(b - a) >= 1e-7)
{
if (F(c) * F(a) > 0)
a = c;
else
b = c;
c = (a + b) / 2;
}
printf("x=%.7f\n", c);
printf("fx=%.10f\n", F(c));
system("PAUSE");
return 0;
}
Объяснение кода листинга программы
- В функции
F(double x)происходит вычисление значения функции2*x - log(x) - 5. - В функции
main()инициализируются переменныеa=2.0,b=4.0иc=(a+b)/2. - Задаётся условие цикла
while, которое проверяет, что разница междуaиbбольше 1e-7. - В цикле выполняется проверка: если произведение значений функции
F(c)иF(a)положительно, то значение переменнойaприсваивается значениеc. - Если условие в предыдущем шаге не выполняется, то значение переменной
bприсваивается значениеc. - Значение переменной
cобновляется как среднее арифметическоеaиb. - Цикл выполняется до тех пор, пока условие не будет выполнено.
- После выполнения цикла выводится значение переменной
cи значение функцииF(c). - В конце программы выводится сообщение
PAUSEи возвращается 0.