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