background image

 

 

 

 

    

    

Metoda równego podziału

Metoda równego podziału

Metoda równego podziału

Metoda równego podziału

 (

 (

metoda połowienia

metoda połowienia

metoda bisekcji

metoda bisekcji

) -- jedna z metod 

) -- jedna z metod 

rozwiązywania równań nieliniowych. Opiera się 

rozwiązywania równań nieliniowych. Opiera się 

ona na twierdzeniu Bolzano-Cauchy`ego:

ona na twierdzeniu Bolzano-Cauchy`ego:

Jeżeli funkcja ciągła f(x) ma na końcach przedziału 

Jeżeli funkcja ciągła f(x) ma na końcach przedziału 

domkniętego wartości różnych znaków, to 

domkniętego wartości różnych znaków, to 

wewnątrz tego przedziału, istnieje co najmniej 

wewnątrz tego przedziału, istnieje co najmniej 

jeden pierwiastek równania f(x) = 0.

jeden pierwiastek równania f(x) = 0.

Aby można było zastosować metodę równego 

Aby można było zastosować metodę równego 

podziału, muszą być spełnione założenia:

podziału, muszą być spełnione założenia:

funkcja 

funkcja 

f

f

(

(

x

x

) jest ciągła w przedziale domkniętym 

) jest ciągła w przedziale domkniętym 

[

[

a

a

;

;

b

b

funkcja przyjmuje różne znaki na końcach 

funkcja przyjmuje różne znaki na końcach 

przedziału: 

przedziału: 

f

f

(

(

a

a

)

)

f

f

(

(

b

b

) < 0 

) < 0 

background image

 

 

 

 

         

         

Przebieg algorytmu :

Przebieg algorytmu :

Sprawdzamy, czy pierwiastkiem równania jest 

Sprawdzamy, czy pierwiastkiem równania jest 

punkt  , czyli czy 

punkt  , czyli czy 

f

f

(

(

x

x

1) = 0. 

1) = 0. 

Jeżeli tak jest, algorytm kończy się. W 

Jeżeli tak jest, algorytm kończy się. W 

przeciwnym razie 

przeciwnym razie 

x

x

1 dzieli przedział [

1 dzieli przedział [

a

a

,

,

b

b

] na 

] na 

dwa mniejsze przedziały [

dwa mniejsze przedziały [

a

a

,

,

x

x

1] i [

1] i [

x

x

1,

1,

b

b

]. 

]. 

Następnie wybierany jest ten przedział, dla 

Następnie wybierany jest ten przedział, dla 

którego spełnione jest drugie założenie, tzn. 

którego spełnione jest drugie założenie, tzn. 

albo 

albo 

f

f

(

(

x

x

1)

1)

f

f

(

(

a

a

) < 0 albo 

) < 0 albo 

f

f

(

(

x

x

1)

1)

f

f

(

(

b

b

) < 0. Cały 

) < 0. Cały 

proces powtarzany jest dla wybranego 

proces powtarzany jest dla wybranego 

przedziału. 

przedziału. 

Algorytm kończy się albo w punkcie 2, albo jest 

Algorytm kończy się albo w punkcie 2, albo jest 

przerywany, gdy przedział będzie dostatecznie 

przerywany, gdy przedział będzie dostatecznie 

wąski.

wąski.

background image

 

 

 

 

                

                

Przykład 

Przykład 

Wyznaczyć pierwiastek równania: 

Wyznaczyć pierwiastek równania: 

x

x

3 − 

3 − 

x

x

 + 1 = 0 

 + 1 = 0 

w przedziale [ − 2;2].

w przedziale [ − 2;2].

Rozwiązanie:

Rozwiązanie:

Obliczamy wartości funkcji na końcach przedziału: 

Obliczamy wartości funkcji na końcach przedziału: 

f

f

( − 2) = − 5, a 

( − 2) = − 5, a 

f

f

(2) = 7. 

(2) = 7. 

Dzielimy przedział na połowy:   i obliczamy 

Dzielimy przedział na połowy:   i obliczamy 

wartość 

wartość 

f

f

(

(

x

x

1) = 1. 

1) = 1. 

Ponieważ wartość funkcji dla 

Ponieważ wartość funkcji dla 

x

x

1 jest różna od 

1 jest różna od 

zera, algorytm jest kontynuowany. Mamy teraz 

zera, algorytm jest kontynuowany. Mamy teraz 

dwa przedziały [ − 2,0] i [0,2]. Wybieramy ten, na 

dwa przedziały [ − 2,0] i [0,2]. Wybieramy ten, na 

którego końcach znaki funkcji są różne:   (prawda) 

którego końcach znaki funkcji są różne:   (prawda) 

lub   (nieprawda). Zatem wybieramy przedział [ − 

lub   (nieprawda). Zatem wybieramy przedział [ − 

2,0] 

2,0] 

background image

 

 

 

 

              

              

Przykład c.d.

Przykład c.d.

Dzielimy przedział na połowy:   i obliczamy 

Dzielimy przedział na połowy:   i obliczamy 

wartość funkcji 

wartość funkcji 

f

f

( − 1) = 1 -- liczba 

( − 1) = 1 -- liczba 

x

x

2 nie jest 

2 nie jest 

zatem pierwiastkiem. 

zatem pierwiastkiem. 

Znowu dzielimy przedział na dwa podprzedziały, 

Znowu dzielimy przedział na dwa podprzedziały, 

wybieramy jeden z nich itd. 

wybieramy jeden z nich itd. 

UWAGA

UWAGA

: teoretycznie można uzyskać dokładne 

: teoretycznie można uzyskać dokładne 

rozwiązanie, jednak w praktycznych 

rozwiązanie, jednak w praktycznych 

zastosowaniach uzyskuje się tylko przybliżone 

zastosowaniach uzyskuje się tylko przybliżone 

rozwiazanie równania, a jego dokładność zależy 

rozwiazanie równania, a jego dokładność zależy 

od tego, ile razy zastosujemy powyższą metodę.

od tego, ile razy zastosujemy powyższą metodę.

background image

 

 

 

 

    

    

Metoda połowienia – kod              

Metoda połowienia – kod              

programu (1-1)

programu (1-1)

#include <stdio.h>

#include <stdio.h>

#include <math.h>

#include <math.h>

#include <conio.h>

#include <conio.h>

#include <stdlib.h>

#include <stdlib.h>

int main (void)

int main (void)

{

{

int i, j;

int i, j;

float a, f_a;

float a, f_a;

float b, f_b;

float b, f_b;

float x, y;

float x, y;

float epsilon;

float epsilon;

printf( "\na = ");

printf( "\na = ");

scanf( "%f", &a);

scanf( "%f", &a);

printf( "\nb = ");

printf( "\nb = ");

scanf( "%f", &b);

scanf( "%f", &b);

epsilon = 1e-5;

epsilon = 1e-5;

f_a = 3 * a * a * a + 2 * a * a - 40 * a + 10;

f_a = 3 * a * a * a + 2 * a * a - 40 * a + 10;

f_b = 3 * b * b * b + 2 * b * b - 40 * b + 10;

f_b = 3 * b * b * b + 2 * b * b - 40 * b + 10;

background image

 

 

 

 

    

    

Metoda połowienia – kod 

Metoda połowienia – kod 

programu (1-2)

programu (1-2)

if ( f_a * f_b < 0 )

if ( f_a * f_b < 0 )

{

{

i = 0;

i = 0;

x = a;

x = a;

y = f_a;

y = f_a;

while ( fabs( a-b ) > epsilon )

while ( fabs( a-b ) > epsilon )

{

{

x = (a+b) * 0.5;

x = (a+b) * 0.5;

y = 3 * x * x * x + 2 * x * x - 40 * x + 10;

y = 3 * x * x * x + 2 * x * x - 40 * x + 10;

if ( f_a * y > 0 )

if ( f_a * y > 0 )

{

{

background image

 

 

 

 

   

   

Metoda połowienia – kod 

Metoda połowienia – kod 

programu (1-2)  c.d.

programu (1-2)  c.d.

a = x;

a = x;

f_a = y;

f_a = y;

}

}

else

else

{

{

b = x;

b = x;

f_b = y;

f_b = y;

}

}

i = i + 1;

i = i + 1;

}

}

printf( "Wynik x = %f, y(x) = %f po %d krokach. \n", x, y, i );

printf( "Wynik x = %f, y(x) = %f po %d krokach. \n", x, y, i );

}

}

else

else

{

{

printf( "Nie ma miejsca zerowego w podanym przedziale.\n" );

printf( "Nie ma miejsca zerowego w podanym przedziale.\n" );

}

}

}

}

background image

 

 

 

 

        

        

Metoda połowienia - kod 

Metoda połowienia - kod 

programu (2-1)

programu (2-1)

#include <stdio.h>

#include <stdio.h>

#include <math.h>

#include <math.h>

#include <conio.h>

#include <conio.h>

#include <stdlib.h>

#include <stdlib.h>

float funkcja( float w_x )

float funkcja( float w_x )

{

{

float w_y;

float w_y;

w_y = 3 * w_x * w_x * w_x + 2 * w_x * w_x - 40 * w_x + 10;

w_y = 3 * w_x * w_x * w_x + 2 * w_x * w_x - 40 * w_x + 10;

return( w_y );

return( w_y );

}

}

int main (void)

int main (void)

{

{

background image

 

 

 

 

Metoda połowienia - kod 

Metoda połowienia - kod 

programu (2-1)  c.d

programu (2-1)  c.d

int i, j;

int i, j;

float a, f_a;

float a, f_a;

float b, f_b;

float b, f_b;

float x, y;

float x, y;

float epsilon;

float epsilon;

printf( "\na = ");

printf( "\na = ");

scanf( "%f", &a);

scanf( "%f", &a);

printf( "\nb = ");

printf( "\nb = ");

scanf( "%f", &b);

scanf( "%f", &b);

epsilon = 1e-5;

epsilon = 1e-5;

f_a = funkcja( a );

f_a = funkcja( a );

f_b = funkcja( b );

f_b = funkcja( b );

background image

 

 

 

 

    

    

Metoda połowienia - kod 

Metoda połowienia - kod 

programu (2-2)

programu (2-2)

if ( f_a * f_b < 0 )

if ( f_a * f_b < 0 )

{

{

i = 0;

i = 0;

x = a;

x = a;

y = f_a;

y = f_a;

while ( fabs( a-b ) > epsilon )

while ( fabs( a-b ) > epsilon )

{

{

x = (a + b )/2;

x = (a + b )/2;

y = funkcja( x );

y = funkcja( x );

if ( f_a * y > 0 )

if ( f_a * y > 0 )

{

{

background image

 

 

 

 

      

      

Metoda połowienia - kod 

Metoda połowienia - kod 

programu (2-2) c.d.

programu (2-2) c.d.

a = x;

a = x;

f_a = y;

f_a = y;

}

}

else

else

{

{

b = x;

b = x;

f_b = y;

f_b = y;

}

}

i = i + 1;

i = i + 1;

}

}

printf( "Wynik x = %f, y(x) = %f po %d krokach. \n", x, y, i );

printf( "Wynik x = %f, y(x) = %f po %d krokach. \n", x, y, i );

}

}

else

else

{

{

printf( "Nie ma miejsca zerowego w podanym przedziale.\n" );

printf( "Nie ma miejsca zerowego w podanym przedziale.\n" );

}

}

}

}


Document Outline