[ 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
|