[ Pobierz całość w formacie PDF ] .��52 Turbo Pascal programowanieRozwiązujemydowolne równanieProblem rozwiązania dowolnego równania nie należy bynajmniej do zadań typukamienia filozoficznego czy uniwersalnego rozpuszczalnika.Chociaż dla pewnych klasrównań istnieją dawno opracowane wzory i metody, spora grupa równań nieliniowychnie daje się rozwiązać na papierze w sposób dokładny.Nie oznacza to jednak, że niemożna ich w ogóle rozwiązać: kwestii przybliżonego rozwiązywania równań nielinio-wych poświęcono z niezłym skutkiem spory dział matematyki znany jako metodynumeryczne.W niniejszym rozdziale spróbujemy zademonstrować jedną z najprost-szych metod rozwiązywania równań nieliniowych tak zwaną metodę bisekcji.Jestona na tyle prosta, że praktycznie nie wymaga znajomości skomplikowanej matematyki(a jedynie logicznego myślenia), a jednocześnie całkiem skuteczna.f(x)c4 c3 c1 bxa c2cRysunek 9.Zasada działania metody bisekcjiZałóżmy, że chcemy znalezć miejsce zerowe funkcji f(x) przedstawionej powyżej.Szukamy więc takiego punktu c na osi x, dla którego f(c) = 0.Wybierając na osi x dwapunkty a i b takie, by wartości f(a) i f(b) miały przeciwne znaki, możemy z pewnościąstwierdzić, że funkcja ma pomiędzy a i b co najmniej jedno miejsce zerowe (gdyż musigdzieś przeciąć oś x).Podzielmy przedział pomiędzy a i b na dwie równe części.War-tość funkcji w nowo uzyskanym punkcie c1 ma nadal znak przeciwny do f(a), a zatemmiejsce zerowe leży gdzieś pomiędzy a i c1.Podzielmy nowo uzyskany przedział napołowy: tym razem okazuje się, że wartość funkcji w punkcie c2 ma znak przeciwny do Rozwiązujemy dowolne równanie 53f(c1), a więc miejsce zerowe leży pomiędzy c1 a c2.Wykonując kolejne podziałydojdziemy w końcu do punktu.no, właśnie.Zauważ, że z każdym kolejnym podziałemzbliżamy się do miejsca zerowego coraz wolniej: za każdym razem przedział poszuki-wania zawężany jest dwukrotnie, tak więc (teoretycznie) dokładne położenie miejscazerowego (odpowiadające przedziałowi o zerowej szerokości, czyli pojedynczemupunktowi) osiągniemy po nieskończonej liczbie podziałów.Chyba nie masz zamiaruczekać aż tak długo!Rozwiązaniem tego problemu jest właściwe sformułowanie tzw.kryterium zakończeniaobliczeń lub kryterium stopu.W naszym przypadku kolejne cykle podziałów (zwanefachowo iteracjami) będziemy prowadzili tak długo, aż bezwzględna wartość funkcjiw punkcie cn zmaleje poniżej zadanego progu.Spróbujmy zapisać w bardziej formalny sposób pojedynczy podział:początekwyznacz punkt c w połowie odległości pomiędzy a i bjeżeli f(a) ma znak różny od f(c), to przenieś punkt b do punktu cw przeciwnym przypadku przenieś punkt a do punktu ckoniecAle jak zabrać się za wykonywanie kolejnych podziałów? Oczywiście nie będziesz mu-siał wielokrotnie wpisywać odpowiednich instrukcji: zamiast tego wykorzystasz do ichcyklicznego wykonywania instrukcję pętli.Spośród trzech dostępnych w Pascalu struktur pętli do realizacji naszego zadaniaodpowiednie są dwie while i repeat (trzecią pętlą, for, zajmiemy się niecopózniej).Należą one do grupy pętli sterowanych warunkiem, co oznacza, że wykonująsię tak długo, jak długo spełnione będzie odpowiednie kryterium (while powtarzaj,dopóki.) lub do momentu, kiedy zostanie ono spełnione (repeat powtarzaj, aż.).Nie trzeba chyba dodawać, że owym kryterium będzie właśnie nasze kryterium stopu:zakończ iteracje, jeśli wartość bezwzględna f(c) jest mniejsza od zadanego progu.Której instrukcji użyć? W zasadzie w naszym przypadku jest to obojętne.Działaniepętli while i repeat jest bardzo zbliżone, zaś różnica sprowadza się do faktu, żew pierwszej z nich warunek przerwania pętli sprawdzany jest na początku:while warunekdo instrukcjazaś w drugiej na końcu pętli:repeat instrukcjauntil warunekW konsekwencji instrukcje tworzące zawartość pętli repeat muszą wykonać się conajmniej raz, zaś w przypadku pętli while mogą nie wykonać się ani razu (jeśli waru-nek będzie od razu spełniony).Ponadto musisz pamiętać, że sformułowanie warunkujest dla obu pętli dokładnie przeciwne (pętla while wykonuje się tak długo, jak długo54 Turbo Pascal programowaniewarunek jest spełniony, repeat tak długo, jak długo jest niespełniony).Zapamiętajrównież, że umieszczając kilka instrukcji w pętli while musisz połączyć je w instrukcjęzłożoną słowami begin i end, zaś w przypadku pętli repeat konieczność ta niewystępuje (ogranicznikami instrukcji złożonej są tu słowa repeat i until).Spróbujmy zapisać nasz algorytm z wykorzystaniem pętli repeat.Będzie on wyglądałmniej więcej tak:początekwprowadz wartości krańców przedziału i dokładnościpowtarzajwyznacz punkt c w połowie odległości pomiędzy a i bjeżeli f(a) ma znak różny od f(c), to przenieś punkt b do punktu cw przeciwnym przypadku przenieś punkt a do punktu caż do momentu, gdy wartość bezwzględna f(c) jest mniejsza od zadanego proguwypisz znalezione miejsce zerowekoniecZałóżmy, że chcemy rozwiązać równanie1 - esin x�"cos x = 0posiadające (jak nietrudno obliczyć na kartce) pierwiastek w punkcie x = 0.Tłumaczącpowyższy schemat na angielski (i Pascal) otrzymamy następujący program:program Bisekcja;varbeginwriteln('Program znajduje miejsce zerowe funkcji')writeln('w przedziale [a;b]');readln(a);write('Podaj wartosc b: ');readln(b);write('Podaj dokladnosc: ');readln(eps);repeatif (1 - exp(sin(a)*cos(a)))*(1 - exp(sin(c)*cos(c)))
[ Pobierz całość w formacie PDF ]
zanotowane.pldoc.pisz.plpdf.pisz.plmikr.xlx.pl
|