Рекурсивная функция 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
Листинг программы
#include<stdio.h>
#include<math.h>
double roof(double (*f)(double x),double a,double b,double eps);
double sinx(double x)
{
    return sin(x)-0.5;
}
int main(void)
{
    double a=0.0,b=3.0,eps;
    printf("Enter eps: ");
    scanf("%lf",&eps);
    printf("x=%lf\n",roof(sinx,a,b,eps));
    return 0;
}
double roof(double (*f)(double x),double a,double b,double eps)
{
    double c=(a+b)/2;
    if(fabs(b-a)<eps)
    return c;
    if(f(a)*f(c)<0)
    return roof(f,a,c,eps);
    return roof(f,c,b,eps);
    
}

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

  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
Похожие ответы