Politechnika Świętokrzyska
Metody obliczeniowe
Grupa: 312B
U15.
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 , b , c
n n 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
#include
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.
Wyszukiwarka
Podobne podstrony:
metobl 312B lab3 A143 Chebdowski
metobl 312B lab5 C121 Chebdowski
metobl 312B lab6 scilab Chebdowski
metobl 312B lab9 W27 Chebdowski
zadanie 7 p lab7
upII lab7
ucyf lab7 09 przyklad
lab7(1)
lab7 8
metobl lab 7 313B r Markiewicz Majka
Rafał Polak 12k2 lab7
Lab7 miejsce 0 ReadMe
lab7
lab7 lpc
Lab7
lab7 funkcje sklejane
u15 mod
metobl lab 4 313B u42 Markiewicz Majka
więcej podobnych podstron