Рекурсивное вычисление функции - C (СИ)

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

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

здратвуйте у меня есть не большая проблемка с выполнением задания задание надо в какойто функции f(x) найти такое х при котором f(x)=0, и сделать это надо рекурсивно и методом половинного диления(тоесть мы в функцию отправляем координаты х1 и х2 в которых значение функции имеет разный знак) функция должна нам вернуть координату в которой функция равна 0 я вот написал но есть небольшая проблема ,программа работает только если я подгоню функцию так чтоб координата возврощаемой точки было целым числом помогите пожалуйста дороботать или исправить чтоб работало
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define EPC 0,001
double funk(double x);
double tochka(double x1,double x2);
double tochka(double x1,double x2)
{
    double x,g,y,y2,y1,k;
    x=(x1+x2)/2;
    y=funk(x);
    y1=funk(x1);
    y2=funk(x2);
    g=abs(y);
    k=x;
    if(g>EPC);
    {
        if(y>0)
        {
            if(y1>y2)
                k=tochka(x,x2);
            if(y1<y2)
                k=tochka(x1,x);
        }
        if(y<0)
        {
            if(y1>y2)
                k=tochka(x1,x);
            if(y1<y2)
                k=tochka(x,x2);
        
        }
    }
    return k;
}
 
double funk(double x)
{
    double y;
    y=((x*x)-16);
    return y;
}

void main()
{ 
    double x1,x2,k;
    scanf("%lf",&x1);
    scanf("%lf",&x2);   
    if(x1<x2)
        k=tochka(x1,x2);
    if(x1>x2)
        k=tochka(x2,x1);
    printf("%lf",k);
    system("pause");
}
заранее спасибо

Решение задачи: «Рекурсивное вычисление функции»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
 
int Sign(double x)
{
    if (x < 0) return -1;
    if (x > 0) return 1;
    return 0;
}
 
 
double f(double x)
{
    return x*x-2;
}
 
double bisect(double (*F) (double),double a, double b, double eps)
{
    double c,fa,fb,fc;
    c=0.5*(a+b);
 
    if (fabs(a-b) <= eps)
        return c;
    else
    {
        fa=F(a);
        fb=F(b);
        fc=F(c);
        if (Sign(fa)*Sign(fc)<0) 
            return bisect(F,a,c,eps);
        else
            return bisect(F,c,b,eps);
    }
}
 
int main(int argc, char* argv[])
{
    printf("%f\n",bisect(&f,0.0,2.0,0.0001));
    return 0;
}

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

  1. Подключение необходимых библиотек: iostream.h и math.h
  2. Определение функции Sign(double x), которая возвращает знак числа x (-1, если x < 0; 0, если x = 0; 1, если x > 0).
  3. Определение функции f(double x), которая возвращает значение функции (x^2 - 2).
  4. Определение функции bisect(double (*F) (double),double a, double b, double eps), которая использует метод бисекции для поиска корня функции F в заданном интервале [a, b] с заданной точностью eps. Функция использует рекурсию для этого.
  5. В функции main() происходит вызов функции bisect() с аргументами: адрес функции f, значения 0.0 и 2.0 для a и b соответственно и значение 0.0001 для eps. Результат вычисления корня выводится на экран.

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


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

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

6   голосов , оценка 3.833 из 5