home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 08 / ami011.txt < prev    next >
Text File  |  1997-04-07  |  12KB  |  239 lines

  1. ************* tu 3 krótkie listingi i 7 ilustracji *********
  2.  
  3. CAÎECZKI
  4.  
  5. <lead>Utarî sië poglâd, ûe do obliczeï, komputerowej symulacji
  6. zjawisk fizycznych czy innych zastosowaï zwiâzanych z matematykâ
  7. lub fizykâ jedynym sîusznym komputerem jest pecet. No cóû,
  8. dyskusje nad tym, jaki komputer jest lepszy, nie prowadzâ z
  9. reguîy do niczego. Faktem jest, ûe pecet w tych zastosowaniach
  10. jest popularniejszy. Ale maluch teû jest najpopularniejszym
  11. samochodem w Polsce, choê na pewno nie najlepszym.
  12.  
  13. <a>Bolesîaw Szczerba
  14.  
  15. <txt>Ûeby jasno wyraziê swoje zdanie, powiem tylko, ûe jestem
  16. studentem cholernie pecetycznej fizyki jâdrowej i jakoô ûyjë bez
  17. peceta w domu. Snobizm? Nie, wygoda. Do skomplikowanych obliczeï,
  18. wymagajâcych duûej mocy obliczeniowej, mam na uczelni RISC-a czy
  19. od biedy 486 DX2 66 MHz. Do napisania i skompilowania programu w
  20. C czy zaîadowania programu do niewielkiej obróbki danych
  21. wystarczy mi w zupeînoôci amigowy PC-Task 2.03, a raczej
  22. uruchomione pod nim odpowiednie programy. Do wiëkszej obróbki
  23. danych i 486 w domu na nic by mi sië nie przydaî, bo po pierwsze,
  24. przez duûâ obróbkë rozumiem pliki z danymi rzëdu 20 MB, a takich
  25. plików mogâ byê dziesiâtki i setki, wiëc nie przeniósîbym ich do
  26. domu; po drugie, nawet gdybym je przeniósî, to po co mam traciê
  27. na nie miejsce na twardym dysku; po trzecie, za pracë po
  28. godzinach nikt mi nie pîaci.
  29.  
  30. Zostawmy jednak të dyskusjë na kiedy indziej i przejdúmy do
  31. rzeczy. Pokaûë, jak w prosty sposób uûywaê naszej Amy do obliczeï
  32. przydatnych w matematyce i fizyce. Zacznë od rzeczy najprostszej,
  33. choê bardzo czësto stosowanej w fizyce -- od liczenia caîek
  34. oznaczonych. Wbrew pozorom to nie jest taka banalna sprawa, gdyû
  35. wiele caîek nie da sië policzyê analitycznie. Takie wypadki sâ
  36. najczëstsze i liczy sië je numerycznie. Poniewaû nie wszyscy
  37. Czytelnicy zetknëli sië z caîkami w liceum, a jest to
  38. niesîychanie fajna sprawa i absolutnie dla ludzi, przypomnë
  39. pokrótce, o co chodzi w tej zabawie. Osoby znajâce rachunek
  40. caîkowy mogâ pominâê poniûszy akapit.
  41.  
  42. <sr>Trochë teorii
  43.  
  44. <txt>Bodajûe w trzeciej klasie liceum uczy sië o pochodnych. I
  45. ten poziom wiedzy zakîadam u Czytelnika. W razie czego moûna sië
  46. douczyê z podrëcznika do matematyki dla tejûe klasy. Caîki
  47. przychodzâ chyba w czwartej klasie, ale, o ile wiem, tylko w
  48. klasach o profilu matematyczno-fizycznym.
  49.  
  50. W ogromnym uproszczeniu: caîka to taka odwrotna pochodnej.
  51. Funkcja, z której dana nam funkcja jest pochodnâ, nosi nazwë
  52. funkcji pierwotnej wzglëdem danej. Podawanie funkcji pierwotnych
  53. do danych to wîaônie caîkowanie nie oznaczone. I tak np. pochodnâ
  54. funkcji sinus jest cosinus. Oznacza to, ûe funkcjâ pierwotnâ do
  55. cosinusa jest wîaônie sinus, bo tenûe musimy zróûniczkowaê, aby
  56. otrzymaê cosinus. Mówimy, ûe caîkâ nie oznaczonâ funkcji cosinus
  57. jest funkcja sinus, ale z dokîadnoôciâ do staîej. Z dokîadnoôciâ
  58. do staîej, bo caîkâ z cosinusa moûe byê zarówno sin(x)+3,
  59. sin(x)-3.14, jak i sin(x) (=sin(x)+0). Dlaczego tak? Policz
  60. pochodne podanych trzech funkcji: wszystkie one sâ równe cos(x).
  61. Zapisujemy to tak, jak pokazano na rysunku 1. Zapis dx oznacza,
  62. ûe caîkowanie przebiega po zmiennej x. Caîkowanie oznaczone
  63. polega na liczeniu caîki nie oznaczonej w pewnych granicach.
  64. Popatrzmy na rysunek 2. To caîka nie oznaczona. Na rysunku 3. ta
  65. sama caîka, tylko w granicach od 2 do 3. Co robimy? Odgadujemy
  66. postaê funkcji pierwotnej do danej funkcji (tu chodzi o pierwotnâ
  67. do x^2, czyli x^3/3), obliczamy wartoôê funkcji pierwotnej w
  68. górnej granicy caîkowania (liczba nad znakiem caîki -- tu 3),
  69. obliczamy jej wartoôê w dolnej granicy (liczba pod znakiem caîki
  70. -- tu 2) i odejmujemy pierwsze od drugiego. Warto zaznaczyê, ûe
  71. caîka nie oznaczona jest funkcjâ, podczas gdy caîka oznaczona
  72. liczbâ.
  73.  
  74. Teraz dopiero, dla tych, którzy przeûyli powyûsze proste wywody,
  75. zaczyna sië zabawa. Skâdinâd wiadomo (tego juû nie bëdë dowodziî
  76. -- jest to w kaûdej ksiâûce do analizy matematycznej), ûe caîka
  77. oznaczona z jakiejô funkcji to dokîadnie fragment pola pod
  78. krzywâ, wyznaczonâ przez të funkcjë. A to juû nie byle co.
  79. Przedstawia to rysunek 4. Czy wyobraûacie sobie, ûe w ten sposób
  80. moûna liczyê pola pod dowolnymi (no, caîkowalnymi, tzn.
  81. majâcymi funkcjë pierwotnâ) krzywymi? Moûemy policzyê, ile
  82. np. wynosi pole jednego "garbu" funkcji sinus czy cosinus --
  83. wystarczy caîkë, podanâ na rysunku 1., policzyê w granicach -pi/2
  84. do pi/2, i gotowe. Moûna teû wyprowadziê wzór na pole koîa (czy
  85. ktokolwiek z Was sië zastanawiaî, skâd sië wziâî wzór na pole
  86. koîa?). Co ciekawsze, granice caîek mogâ byê nieskoïczone, tzn.
  87. moûemy liczyê caîki np. od zera do plus nieskoïczonoôci. I
  88. okazuje sië, ûe pola pod niektórymi krzywymi, mimo ûe
  89. przedstawiajâ geometrycznie nieograniczone figury, majâ SKOÏCZONE
  90. pola.
  91.  
  92. <sr>Trochë praktyki
  93.  
  94. <txt>Podany sposób liczenia caîek oznaczonych to tzw. sposób
  95. analityczny. Wymyôlamy funkcjë pierwotnâ, liczymy jej wartoôci w
  96. granicach i mamy pole. Jednak co zrobiê, gdy dana funkcja NIE MA
  97. funkcji pierwotnej? A takich wypadków jest sporo -- przykîadem
  98. moûe byê funkcja exp(-x^2). Albo co zrobiê, gdy mamy BARDZO
  99. skomplikowanâ funkcjë i nawet nie wiemy, czy funkcja pierwotna
  100. istnieje (nie mówiâc o jej policzeniu)? Jak na zîoôê akurat z
  101. takimi caîkami mamy najczëôciej do czynienia w fizyce. I tu z
  102. pomocâ przychodzâ komputery. Pokaûë, w jaki sposób liczyê caîki
  103. oznaczone (i tym samym odpowiednie pola) numerycznie. Tu juû nie
  104. ma najmniejszego znaczenia, czy funkcja pierwotna istnieje, czy
  105. nie. Nie musimy jej W OGÓLE szukaê. Przy liczeniu numerycznym
  106. caîek oznaczonych skorzystamy z omówionego przed chwilâ zwiâzku
  107. jej wartoôci z polem pod krzywâ (rysunek 4.). Sprawa jest
  108. banalna: znamy dokîadnâ postaê funkcji, znamy a i b, cóû nam
  109. wiëcej trzeba?
  110.  
  111. <sr>Metoda prostokâtów
  112.  
  113. <txt>Spójrzmy na rysunek 5. Caîe pole dzielimy na N prostokâtów o
  114. równych podstawach. Pole prostokâta to chyba kaûdy umie policzyê
  115. (jak nie umie, to raczej nie doszedî do tego fragmentu...)
  116. Zakîadamy sobie jakieô N, znamy a oraz b (przy zaîoûeniu, ûe b>a
  117. -- patrz rysunek). Dîugoôê podstawy kaûdego z prostokâtów wynosi
  118. (b-a)/N, to chyba oczywiste. Natomiast wysokoôê danego
  119. prostokâta to po prostu wartoôê funkcji f(x) w dowolnym punkcie
  120. naleûâcym do jego podstawy -- dla porzâdku umówmy sië, ûe
  121. bierzemy skrajny prawy punkt. Wspóîrzëdna x pierwszego takiego
  122. punktu to a+(b-a)/N, drugiego a+2(b-a)/N, trzeciego a+3(b-a)/N
  123. itd. Przedostatni z nich ma wspóîrzëdnâ x równâ a+(N-1)(b-a)/N, a
  124. ostatni a+N(b-a)/N, czyli b. Bierze sië to z dodawania do
  125. pierwszego punktu przedziaîu, czyli punktu (a,0), kolejnych
  126. wielokrotnoôci dîugoôci podstawy prostokâta. Jedyne, co trzeba
  127. zrobiê, to policzyê wartoôci funkcji w podanych powyûej punktach.
  128. Teraz trzeba policzyê pola wszystkich prostokâtów (to juû
  129. îatwizna) i dodaê do siebie. Otrzymana liczba to wartoôê caîki
  130. oznaczonej w granicach od a do b. Jasne jak drut i proste jak
  131. sîoïce.
  132.  
  133. <sr>Metoda trapezów
  134.  
  135. <txt>Podana powyûej metoda prostokâtów ma jednak pewnâ wadë.
  136. Popatrzcie na rysunek. Ile wolnego miejsca zostaje miëdzy krzywâ
  137. a prostokâtami? Oszustwo to widaê tym bardziej, im bardziej
  138. stroma jest krzywa. Jest to nieekonomiczne. Po prostu
  139. mamy sakramencko wielki niedomiar lub nadmiar, który 
  140. moûe nam zepsuê caîe obliczenia przy niedostatecznie gëstym
  141. podziale, gdyû moûe je obarczyê duûym bîëdem. W praktyce stosuje
  142. sië raczej innâ metodë -- metodë trapezów. Jak nietrudno sië
  143. domyôliê, polega ona na tym, ûe pole pod krzywâ jest przybliûane
  144. trapezami (patrz rysunek 6.). Wysokoôê trapezu przejmuje rolë
  145. podstawy prostokâta i równieû wynosi (b-a)/N, gdzie N jest liczbâ
  146. trapezów, na jakie dzielimy pole. Róûnica polega jedynie na tym,
  147. ûe do policzenia pola trapezu musimy znaê trzy liczby: obie
  148. podstawy i wysokoôê. Wysokoôê juû znamy, a podstawy? Teû!
  149. Pierwsza to wartoôê funkcji w skrajnym lewym punkcie podstawy
  150. trapezu, a druga to wartoôê funkcji w jej skrajnym prawym
  151. punkcie. Wspóîrzëdne punktów pozostajâ bez zmian, z tym ûe
  152. startujemy tym razem od punktu (a,0), a nie jak poprzednio od
  153. (a+(b-a)/N,0). Po zsumowaniu pól wszystkich trapezów mamy o wiele
  154. dokîadniejszâ wartoôê caîki. Daje to o wiele lepsze rezultaty i
  155. nie zaleûy juû tak silnie od stromoôci funkcji, jak metoda
  156. prostokâtów. Poza tym jest to metoda szybsza -- aby obliczyê
  157. wartoôê caîki z tâ samâ dokîadnoôciâ metodâ prostokâtów,
  158. musielibyômy zaîoûyê gëstszy podziaî (tzn. dzieliê pole na wiëcej
  159. czëôci), w zwiâzku z tym obliczenia trwaîyby dîuûej. A fizycy
  160. potrafiâ doceniê nawet niewielki przyrost prëdkoôci algorytmu,
  161. zwîaszcza gdy obliczenia idâ w dni, tygodnie, miesiâce...
  162.  
  163. <sr>W praniu
  164.  
  165. <txt>Pora pokazaê, co z tym wszystkim moûna zrobiê --
  166. przedstawiam trzy listingi programów do samodzielnego wklepania.
  167. Jak zwykle zakîadam ôladowâ znajomoôê C oraz chëê programowania,
  168. poîâczonâ z podstawowymi pojëciami w tym zakresie. A wiëc
  169. przyjmujë, ûe Czytelnik wie, co to pëtle czy instrukcje
  170. warunkowe.  Nie bëdë teû wyjaôniaî, po co przy instrukcji 'if' sâ
  171. nawiasy ani co robiâ dwa plusy koîo siebie. Podane listingi
  172. powinny sië daê skompilowaê dowolnym kompilatorem C, ja uûywaîem
  173. SAS/C 6.5. Dla porzâdku podajë teû zawartoôê pliku SCOptions
  174. (jednakowâ dla kaûdego listingu, choê przypominam, ûe kaûdy z
  175. nich to ODDZIELNY projekt):
  176.  
  177. <l>MATH=STANDARD
  178.  
  179. ERRORREXX
  180.  
  181. OPTIMIZE
  182.  
  183. LINK
  184.  
  185. OPTIMIZERTIME
  186.  
  187. <txt>Jeôli masz lepszy procesor, moûesz przyspieszyê program,
  188. dopisujâc np. linië:
  189.  
  190. <l>CPU=68020
  191.  
  192. <txt>lub przy innym procesorze odpowiednio innâ. Pierwsze dwa
  193. programy pokazujâ, jak policzyê liczbë PI. Na rysunku 7. widzimy
  194. wykres funkcji 1/(1+x^2). Caîka oznaczona z tej funkcji w
  195. granicach od zera do jeden to dokîadnie PI/4 -- jest to policzone
  196. analitycznie. Funkcjâ pierwotnâ do danej jest tu funkcja odwrotna
  197. do tangensa -- arcus tangens. Jej wartoôê w zerze to zero, jej
  198. wartoôê w jedynce to PI/4, bo tg(PI/4) to jeden. Korzystamy z
  199. faktu, ûe pole pod krzywâ jest równe odpowiedniej caîce
  200. oznaczonej; wiemy, ûe ta caîka ma wartoôê PI/4, wiëc co nam
  201. szkodzi policzyê jâ niezaleûnie w sposób numeryczny? Wystarczy
  202. policzone numerycznie pole pomnoûyê przez 4 i mamy wartoôê PI!
  203. Na listingu 1.  moûna zobaczyê, jak policzyê to pole metodâ
  204. prostokâtów, a na listingu 2. metodâ trapezów. Moûna samemu
  205. stwierdziê, która metoda jest lepsza, porównujâc czas obliczeï i
  206. ich dokîadnoôê.  Programiki po skompilowaniu trzeba uruchamiaê z
  207. CLI lub Shella, podajâc jako argument gëstoôê podziaîu, czyli N.
  208. Na tyle czëôci program podzieli pole pod krzywâ przedstawionâ na
  209. rysunku 7. Na poczâtku nie radzë przekraczaê miliona, bo to moûe
  210. potrwaê. I jeszcze jedno: uwaûni Czytelnicy nie bëdâ czekaê ze
  211. stoperem w rëku na koniec obliczeï...
  212.  
  213. Jak policzyê np. caîkë oznaczonâ z funkcji f(x)=x^2 w DOWOLNYM
  214. przedziale <a;b>, pokazaîem na listingu 3. Przy uruchomieniu
  215. programu z CLI lub Shella trzeba pamiëtaê o podaniu trzech
  216. argumentów: podziaîu oraz granic. Specjalnie wybraîem takâ prostâ
  217. funkcjë, ûeby kaûdy mógî "sprawdziê", czy program nie oszukuje --
  218. caîkë z podanej funkcji moûna policzyê analitycznie (patrz
  219. rysunek 3.). Funkcja f(x) jest zadeklarowana poza funkcjâ main();
  220. nic nie stoi na przeszkodzie, aby w to miejsce wpisaê innâ
  221. funkcjë -- choêby wspomnianâ przedtem exp(-x^2). Z jej pomocâ
  222. równieû moûna policzyê liczbë PI (pytanie do studentów: jak?). W
  223. jakiej postaci podawaê funkcje, aby byîy zrozumiane przez
  224. kompilator, pokazano w pliku math.h. Moûna sië pobawiê, ale to
  225. nie jest rozwiâzanie uniwersalne. Fajnie byîoby napisaê program,
  226. który liczy caîkë z dowolnej podanej przez uûytkownika funkcji w
  227. zadanym obszarze. Teoretycznie jest to bardzo proste. Diabeî jak
  228. zwykle siedzi w szczegóîach. Przede wszystkim trzeba zaûâdaê od
  229. uûytkownika czterech argumentów: funkcji, obu granic oraz
  230. gëstoôci podziaîu. W tym wypadku mamy funkcjë jako tekst pod
  231. argv[1]. Trzeba tylko napisaê procedurkë dekodujâcâ lub, jak kto
  232. woli, "wyîawiajâcâ" funkcje ze zmiennej tekstowej. Jako lekturë
  233. uzupeîniajâcâ polecam plik "string.h". Moûna to traktowaê jako
  234. zadanie domowe.
  235.  
  236. <przyp> Ps. Chciaîbym w tym miejscu, korzystajâc z okazji,
  237. pozdrowiê mojego kolegë ze studiów -- Arka Wâsiïskiego, który
  238. nadal jeszcze uûywa Amigi.
  239.