Рекурсивная функция root: нахождение корня уравнения методом деления отрезка пополам - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста описать рекурсивную функцию root(f,a,b,eps), которая методом деления отрезка пополам находит с точностью eps корень уравнения f(x)=0 на отрезке [a,b]. (Считать, что eps>0, a>b, f(a)*f(b)<0). Найти с ее помощью один корень уравнения sin(x)=0.5

Решение задачи: «Рекурсивная функция root: нахождение корня уравнения методом деления отрезка пополам»

textual
Листинг программы
  1. #include<stdio.h>
  2. #include<math.h>
  3. double roof(double (*f)(double x),double a,double b,double eps);
  4. double sinx(double x)
  5. {
  6.     return sin(x)-0.5;
  7. }
  8. int main(void)
  9. {
  10.     double a=0.0,b=3.0,eps;
  11.     printf("Enter eps: ");
  12.     scanf("%lf",&eps);
  13.     printf("x=%lf\n",roof(sinx,a,b,eps));
  14.     return 0;
  15. }
  16. double roof(double (*f)(double x),double a,double b,double eps)
  17. {
  18.     double c=(a+b)/2;
  19.     if(fabs(b-a)<eps)
  20.     return c;
  21.     if(f(a)*f(c)<0)
  22.     return roof(f,a,c,eps);
  23.     return roof(f,c,b,eps);
  24.    
  25. }

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы
    • <stdio.h> - для ввода и вывода данных
    • <math.h> - для использования математических функций
  2. Определяем функцию roof, которая принимает аргументы:
    • double (*f)(double x) - указатель на функцию, которую мы будем использовать для поиска корня
    • double a - интервал поиска корня, в котором левая граница является началом интервала, а правая - концом интервала
    • double b - интервал поиска корня
    • double eps - требуемая точность
  3. Определяем вспомогательную функцию sinx, которая принимает аргумент double x и возвращает значение sin(x)-0.5
  4. В функции main мы:
    • Задаем начальные значения интервала поиска корня
    • Запрашиваем у пользователя значение требуемой точности eps
    • Вызываем функцию roof с передачей аргументов sinx, a, b, eps
    • Выводим результат на экран
  5. В функции roof мы:
    • Вычисляем средний элемент интервала c
    • Проверяем условие для завершения рекурсии: если разница между b и a меньше заданной точности eps, то возвращаем значение c
    • Проверяем знак значения функции f в точке a и c, если они имеют разный знак, то рекурсивно вызываем функцию roof с передачей аргументов f, a, c, eps
    • Если функция f в точке a и c имеет одинаковый знак, то рекурсивно вызываем функцию roof с передачей аргументов f, c, b, eps
  6. Значения переменных при входе в функцию roof с аргументами sinx, a=0.0, b=3.0, eps=0.0001:
    • double (*f)(double x) - указывает на функцию sinx
    • double a - равно 0.0
    • double b - равно 3.0
    • double eps - равно 0.0001
  7. Значения переменных в цикле рекурсии функции roof:
    • double c - в каждой итерации рекурсии вычисляется новое значение среднего элемента интервала c
    • Условие для завершения рекурсии if(fabs(b-a)<eps) может быть истинным только в случае, когда интервал поиска корня будет достаточно мал, чтобы его можно было считать элементарным
    • В каждой итерации рекурсии вызывается функция f с аргументами a и c, и проверяется знак возвращаемого значения
    • Значение переменной c передается в качестве нового аргумента для вызова функции roof в случае рекурсивного вызова
  8. Возвращаемое значение функции roof при входе с аргументами sinx, a=0.0, b=3.0, eps=0.0001 будет равно корню уравнения sin(x)=0.5, которое находится в интервале [0.0, 3.0].

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы