background image

Politechnika Świętokrzyska 

Metody obliczeniowe

 

U15. 

Grupa: 312B 

Piotr Chebdowski 

 

1. Metody przybliżone rozwiązywania równań – metoda bisekcji.

 

Niech funkcja f(x) będzie funkcja ciągła w przedziale [a, b] i f(a)f(b) < 0. Oznacza 
to, że wartość funkcji f zmienia znak w tym przedziale. Ponadto równanie f(x) = 0 ma w 

przedziale [a, b] co najmniej jedno rozwiązanie. Idea metody polega na połowieniu przedziału 
poszukiwań, za każdym razem biorąc tę część przedziału, na której wartość funkcji 

zmienia znak. Połowienie takie jest kontynuowane tak długo, aż nie zostanie osiągnięta 
określona dokładność obliczeń (oznaczana zwykle   lub 

). Prowadzi to do następującego 

algorytmu, znanego jako metoda bisekcji lub metoda połowienia

1) c := ( a+b)/2 

2) jeśli b-c <= eps , to przyjmij , że pierwiastkiem równania f(x) = 0 jest wartość c, a więc f(c) = 0 
i zakończ program . 
3) jeśli znak (f(b)) * znak (f(c)) <= 0 to 

a := c 
w przeciwnym razie 

b := c 
4) skocz do punktu 1 . 

Funkcja znak(x) zwraca wartość 1 jeśli x > 0, -1 jeśli x < 0 oraz 0 dla x = 0. Szczególną 
zaletą metody bisekcji jest fakt, iż jest ona zawsze zbieżna do rozwiązania. Główną wadą 

tej metody jest wolna zbieżność do rozwiązania. 
 

Oszacowanie błędu: 

Niech a

n

, b

n

, c

oznaczają n-tą obliczoną wartość odpowiednio a, b i c. Ponadto niech 

 oznacza prawdziwą wartość pierwiastka równania f(x) = 0. Błąd popełniony w n-tym 

kroku w metodzie bisekcji 

 jest okreslony wzorem: 

 

 

2. Program. 

#include <stdio.h> 
#include <stdlib.h> 
 
void wys(float tab[3][4]); 
 
int main() 

    float tab[3][4] = { 
     {6.34, 11.75, 10.0, -41.40}, 
     {7.42, -19.03, 11.75, -49.49}, 
     {5.57, 7.48, 6.36, -27.67} 
    }; 
    float tmp[3][4], tmp2[3][4]; 
    int i, j, s, n, a, b; 
 
    for(i = 0; i < 3; i++) 
        for(j = 0; j < 4; j++) { 
            tmp[i][j] = tab[i][j]; 
            tmp2[i][j] = tab[i][j]; 
        } 
 
    wys(tab); 
 
    n = 3; 
    for (s = 0; s < (n - 1); s++) { 
        for (i = (s + 1); i < n; i++) { 

background image

            for (j = (s + 1); j <= n; j++) { 
                tmp[i][j] = tmp2[i][j] - (tmp2[i][s] / tmp2[s][s]) * tab[s][j]; 
            } 
            for(a = 0; a < 3; a++) 
                for(b = 0; b < 4; b++) { 
                    tmp2[a][b] = tmp[a][b]; 
                } 
        } 
    } 
 
    float x3 = tmp[2][3] / tmp[2][2]; 
    float x2 = (tmp[1][3] - tmp[1][2] * x3)/tmp[1][1]; 
    float x1 = (tmp[0][3] - tmp[0][1] * x2 - tmp[0][2] * x3)/tmp[0][0]; 
    printf("\nWYNIK: %.2f\t%.2f\t%.2f\n", x1, x2, x3); 
 
    return 0; 

 
void wys(float tab[3][4]) 

    int i, j; 
    for(i = 0; i < 3; i++) { 
        for(j = 0; j < 4; j++) { 
            printf("%.2f\t", tab[i][j]); 
        } 
        printf("\n"); 
    } 

 

3. Konsola.