Zadanie zostało opisane tak:
- Mamy funkcję
ciągłą, monotoniczną i taką, że dla zadanych dwu punktów i (funkcja zmienia znak w tym przedziale, a więc ma tam miejsce zerowe). - Mamy znaleźć jej miejsce zerowe.
- Nie potrafimy analitycznie rozwiązać równanie
.
Proponuję iteracyjną metodę (czyli krokową) szukania punktu najbliższego rozwiązaniu tego równania metodą połowienia.
- Znajdźmy środek przedziału
: . - Jeżeli funkcja zmienia znak w przedziale
— odrzucamy przedział , w przeciwnym razie1 odrzucamy przedział . - Powyższą procedurę powtarzamy tak długo, aż długość przedziału
będzie krótsza niż zadana wartość , lub gdy wartość funkcji będzie bliska zeru ( ).
Dalsze założenia
Do dalszych obliczeń wybierzemy funkcję, której miejsca zerowego będziemy szukali. Będzie to funkcja
Kompletny program może wyglądać tak:
int main(int argc, char **argv)
{
double A, B, C;
A = 2.;
B = 5.;
delta = 0.00001;
epsilon = 0.0001;
delta
to stała definiująca dostateczną „bliskość” epislon
to stałą określająca graniczną długość przedziału poszukiwań.
pocz:
C = ( A + B ) / 2.;
if ( fabs( sin(C) ) < delta ) // czy wartość funkcji blisko zera?
{
printf("C=%.16f\\n", C);
return 0;
}
else if ( sin(A) * sin(C) > 0 )
A = C;
else
B = C;
if ( fabs(A - B) > epsilon ) // czy przedział nie jest wystarczająco krótki?
goto pocz;
printf("!C=%.16f\\n", ( A + B ) / 2.);
return 0;
}
Właściwie nie ma o czym więcej pisać.
Teoretycznie możliwe jest, że
będzie równe zero; warto to uwzględnić, ale szanse są niewielkie. ↩︎