#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ą "false position". 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 przedziału w którym szukać będziemy pierwiastka, oraz proponowany punkt podziału. */ 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-x1)*a/(a-b); 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; }