Metoda równego podziału
/* Author: Kamil Sukiennik Date: 2011-06-05 License: Public Domain */ #include<stdio.h> #include<stdlib.h> #include<math.h> float x2, fa, fb, x1w, fx1; // Ustawienia //float a=-2, b=2; float a=0, b=M_PI; float eps=0.001; // Funkcja f(x) float f(float x) { // return(powf(x, 3.0)-x+1.0); return(2*sin(x)-x+0.5); } // Dzielenie przedziałów float x1(float a, float b) { return((a+b)/2); } int main() { puts("Obliczamy wartości funkcji na końcach przedziałów..."); fa = f(a); fb = f(b); printf("f(%f) = %f, f(%f) = %f\n\n", a, fa, b, fb); // Sprawdzamy przedział funkcji w poszukiwaniu wartości różnych znaków if(fa*fb < 0) { puts("Dzielimy przedział na połowy..."); x1w = x1(a, b); printf("x1 = (%f + %f)/2 = %f\n\n", a, b, x1w); puts("Obliczamy wartość funkcji f(x1)..."); fx1 = f(x1w); printf("f(x1) = %f\n\n", fx1); if(fx1==0) { puts("Funkcja posiada miejsce zerowe"); exit(0); }; // Jeżeli funkcja ciągła f(x) ma na końcach przedziału // domkniętego wartości różnych znaków, to wewnątrz tego przedziału, // istnieje co najmniej jeden pierwiastek równania f(x)=0. puts("Dzielimy przedziały..."); while(fabs(fx1) >= eps) { x1w = x1(a, b); fx1 = f(x1w); if(fa*fx1 < 0) b = x1w; else { a = x1w; fa = fx1; } printf("a = %f, b = %f, x1 = %f, f(x1) = %f, f(a) = %f, f(b) = %f\n", a, b, x1w, fx1, fa, fb); } puts("\nKoniec wyszukiwania, poszukiwanym pierwiastkiem jest:"); printf("x1 = %f\n", x1w); } else puts("Funkcja nie przyjmuje różnych znaków na końcach przedziałów"); return(0); }
wersja strony: 4, ostatnia edycja: 11 Nov 2013 20:02