Рекурсивное вычисление функции - 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. Результат вычисления корня выводится на экран.