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

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

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

здратвуйте у меня есть не большая проблемка с выполнением задания задание надо в какойто функции f(x) найти такое х при котором f(x)=0, и сделать это надо рекурсивно и методом половинного диления(тоесть мы в функцию отправляем координаты х1 и х2 в которых значение функции имеет разный знак) функция должна нам вернуть координату в которой функция равна 0 я вот написал но есть небольшая проблема ,программа работает только если я подгоню функцию так чтоб координата возврощаемой точки было целым числом помогите пожалуйста дороботать или исправить чтоб работало
Листинг программы
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #define EPC 0,001
  6. double funk(double x);
  7. double tochka(double x1,double x2);
  8. double tochka(double x1,double x2)
  9. {
  10. double x,g,y,y2,y1,k;
  11. x=(x1+x2)/2;
  12. y=funk(x);
  13. y1=funk(x1);
  14. y2=funk(x2);
  15. g=abs(y);
  16. k=x;
  17. if(g>EPC);
  18. {
  19. if(y>0)
  20. {
  21. if(y1>y2)
  22. k=tochka(x,x2);
  23. if(y1<y2)
  24. k=tochka(x1,x);
  25. }
  26. if(y<0)
  27. {
  28. if(y1>y2)
  29. k=tochka(x1,x);
  30. if(y1<y2)
  31. k=tochka(x,x2);
  32. }
  33. }
  34. return k;
  35. }
  36. double funk(double x)
  37. {
  38. double y;
  39. y=((x*x)-16);
  40. return y;
  41. }
  42.  
  43. void main()
  44. {
  45. double x1,x2,k;
  46. scanf("%lf",&x1);
  47. scanf("%lf",&x2);
  48. if(x1<x2)
  49. k=tochka(x1,x2);
  50. if(x1>x2)
  51. k=tochka(x2,x1);
  52. printf("%lf",k);
  53. system("pause");
  54. }
заранее спасибо

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. int Sign(double x)
  5. {
  6.     if (x < 0) return -1;
  7.     if (x > 0) return 1;
  8.     return 0;
  9. }
  10.  
  11.  
  12. double f(double x)
  13. {
  14.     return x*x-2;
  15. }
  16.  
  17. double bisect(double (*F) (double),double a, double b, double eps)
  18. {
  19.     double c,fa,fb,fc;
  20.     c=0.5*(a+b);
  21.  
  22.     if (fabs(a-b) <= eps)
  23.         return c;
  24.     else
  25.     {
  26.         fa=F(a);
  27.         fb=F(b);
  28.         fc=F(c);
  29.         if (Sign(fa)*Sign(fc)<0)
  30.             return bisect(F,a,c,eps);
  31.         else
  32.             return bisect(F,c,b,eps);
  33.     }
  34. }
  35.  
  36. int main(int argc, char* argv[])
  37. {
  38.     printf("%f\n",bisect(&f,0.0,2.0,0.0001));
  39.     return 0;
  40. }

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

  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

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

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

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