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);
}
Unless otherwise stated, the content of this page is licensed under GNU Free Documentation License.