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
n
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++) {
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.