#include<stdio.h>
#include<stdlib.h>
#include<float.h>
#include<math.h>
/* Ten program będzie szukał pierwiastka równania f(x)=0. Będzie szukał metodą
bisekcji. Trzeba mu podać dwa punkty, x1 i x2, takie, że f ma w nich wartości
różnych znaków. Miedzy nimi musi więc być pierwiastek. Procedura go znajdzie
na pewno. Jeżeli pierwiastków będzie więcej, znaleziony będzie któryś, nie wiadomo
który.
*/
double funkcja(double x)
{
return x-2*sin(x);
}
int main(void)
{
double x1,x2,x; /* Zawierają końce oraz środek przedziału w którym
szukać będziemy pierwiastka. */
double a,b,c; /* Tu przechowane zostaną wartości funkcji w punktach x1,x2,x. */
double eps=DBL_EPSILON*100; /* To będzie nasza dokładność. */
printf("Ten program znajdzie pierwiastek zadanej funkcji.\n");
do
{
printf("Proszę podać dwa punkty, X_1 i X_2, w których wartość funkcji ma różne znaki.\n");
printf("\nX_1= ");
scanf("%lf",&x1);
a=funkcja(x1);
if (fabs(a)<eps)
{
printf("X_1 jest pierwiastkiem.\n");
return EXIT_SUCCESS;
}
printf("\nX_2= ");
scanf("%lf",&x2);
b=funkcja(x2);
if (fabs(b)<eps)
{
printf("X_2 jest pierwiastkiem.\n");
return EXIT_SUCCESS;
}
if (a*b>0)
printf("Funkcja nie zmienia znaku w podanych punktach.\n");
}
while (a*b>0);
/* Teraz szukanie iteracyjne. Kończymy, kiedy przedział ma długość nie większą niż
nasza dokładność.
*/
while (fabs(x1-x2)>eps)
{
x=(x1+x2)/2;
c=funkcja(x);
if (fabs(c)<eps)
{
printf("Znaleziony pierwiastek: %lf\n",x);
return EXIT_SUCCESS;
}
if (a*c<0)
{
x2=x;
b=c;
}
else
{
x1=x;
a=c;
}
}
printf("Znaleziony pierwiastek: %lf\n",x1);
return EXIT_SUCCESS;
}