Narzędzia użytkownika

Narzędzia witryny


cw-6-rekurencja

====== Różnice ====== Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

cw-6-rekurencja [2014/11/03 14:29]
miller
cw-6-rekurencja [2018/10/26 12:54] (aktualna)
miller [Funkcja obliczająca dwie wartości - przykład 2.]
Linia 3: Linia 3:
 Należy w programie zdefiniować zmienne ''a'', ''b'' i ''x'' oraz dwie zmienne typu wskaźnikowego. Zmiennym ''a'' i ''b'' należy nadać przykładowe wartości początkowe. Do zmiennych wskaźnikowych należy podstawić adresy zmiennych ''a'' i ''b''.  Należy w programie zdefiniować zmienne ''a'', ''b'' i ''x'' oraz dwie zmienne typu wskaźnikowego. Zmiennym ''a'' i ''b'' należy nadać przykładowe wartości początkowe. Do zmiennych wskaźnikowych należy podstawić adresy zmiennych ''a'' i ''b''. 
 Do zmiennej ''x'' należy podstawić sumę wartości pamiętanych w ''a'' i ''b'', ale przy obliczaniu tej sumy nie należy używać nazw  ''a'' i ''b''. Do zmiennej ''x'' należy podstawić sumę wartości pamiętanych w ''a'' i ''b'', ale przy obliczaniu tej sumy nie należy używać nazw  ''a'' i ''b''.
 +
 +==== Funkcja obliczająca dwie wartości ====
 +
 +W funkcji ''main'' definiujemy cztery zmienne typu ''double''. W dwóch z nich zapisujemy część rzeczywistą i urojoną liczby zespolonej. Wywołujemy funkcję, która oblicza moduł i argument tej liczby. Te wyniki zapisuje do pozostałych dwóch zmiennych zdefiniowanych w funkcji głównej. Po powrocie do ''main'' obliczone wartości są wyprowadzone na ekran. 
 +
 +==== Funkcja obliczająca dwie wartości - przykład 2. ====
 +
 +Każdy dzień w roku można wskazać podając jego numer w roku albo jego numer w miesiącu i numer tego miesiąca, np. 35 albo 4,2. Dla uproszczenia można przyjąć, że rok nie jest przestępny. Program w funkcji ''main'' wczytuje numer dnia w roku, a następnie wywołuje funkcję, która oblicza odpowiadający mu numer miesiąca i numer dnia tego miesiąca. Obliczoną datę wyprowadza na ekran funkcja ''main''.
  
 ==== Rekurencja - obliczanie silni ==== ==== Rekurencja - obliczanie silni ====
Linia 13: Linia 21:
 ==== Rekurencja - adaptacyjny algorytm obliczania całki oznaczonej metodą Simpsona ====  ==== Rekurencja - adaptacyjny algorytm obliczania całki oznaczonej metodą Simpsona ==== 
  
 +**Pojęcie całki oznaczonej** funkcji w przedziale od ''a'' do ''b'' zastąpimy - dla uproszczenia - polem powierzchni ograniczonej osią odciętych, wykresem ''x=a'', wykresem ''x=b'' oraz wykresem funkcji (załóżmy, że funkcja przyjmuje wartości dodatnie).
  
-Numeryczne obliczanie (prymitywnymi metodami) całki oznaczonej - (dla osób, które z tym pojęciem się nie spotkały: pola pod wykresem funkcji)+**Metoda Simpsona** pozwala obliczyć przybliżoną wartość ww. pola.  
-      +Przepis: 
- === Wersja podstawowa === +   S h*(f(a+ 4*f(a/2+b/2+ f(b))/6,   h - długość przedziału całkowania = b-a   
- +Obliczone ''S'' nie jest dokładną wartością pola - tylko jej przybliżeniem - ale błąd przybliżenia jest mały jeżeli ''h'' jest małe.
- +
-Algorytm obliczania wartości funkcji całkowanej (dowolnej) zapisujemy w osobnym segmencie (funkcji w znaczeniu fragmentu programu)+
- +
-W segmencie głównym program wczytuje przedział całkowania (dolną //a// i górną //b// granicę pola pod wykresemoraz +
-na ile podprzedziałów dzielimy cały przedział (długość tego podprzedziału oznaczmy przez //h//).+
  
-W każdym podprzedziale (od //x<sub>i</sub>// do// x<sub>i+1</sub>//)  obliczamy pole "elementarne" wg jednego z wzorów: +**Algorytm adaptacyjny** ma na celu osiągnięcie wyniku (polaz błędem nie większym niż zadany ''Delta''
-  prostokątów w przód: //p<sub>i</sub> = h f(x<sub>i</sub>)//, +
-  prostokątów w tył: //p<sub>i</sub> = h f(x<sub>i+1</sub>)//, +
-  prostokątów punktu środkowego: //p<sub>i</sub> = h f(x<sub>i</sub>/2+x<sub>i+1</sub>/2//, +
-  * trapezów: //p<sub>i</sub> h (f(x<sub>i</sub>)+f(x<sub>i+1</sub>))/2 //, +
-  * Simpsona: //p<sub>i</sub> = h (f(x<sub>i</sub>) + 4f(x<sub>i</sub>/2+x<sub>i+1</sub>/2) + f(x<sub>i+1</sub>))/6 //.+
  
-Należy wybrać jedną metod.+  * W tym celu stosujemy przepis Simpsona dla całego przedziału od ''a'' do ''b''.  
 +  * Następnie dzielimy ten przedział na 2 połowy. Oznaczmy punkt w połowie przedziału jako ''c''.  
 +  * Wzór Simpsona stosujemy teraz osobno dla lewej połówki (od ''a'' do ''c'') i dla prawej (od ''c'' do ''b''). 
 +  * Otrzymujemy przybliżone wartości dwóch części obliczanego pola np. ''S1'' i ''S2''. 
 +  *  Jeżeli suma ''S1'' i ''S2'' różni się od ''S'' nie więcej niż o ''Delta'', to uznajemy, że otrzymany wynik jest dostatecznie dokładny i kończymy algorytm.  
 +  * W przeciwnym przypadku stajemy przed dwoma zadaniami - obliczyć pole każdej połówki (lewej, a później prawej), każdej błędem nie większym niż ''Delta/2'' 
 +  * Zauważmy, że są to jakościowo dokładnie dwa takie same zadania, jak zadanie pierwotne (obliczyć pole z błędem nie większym niż ''Delta'')!  
  
-Przybliżenie całki jest sumą wszystkich pól //p<sub>i</sub>//. 
  
-=== Wersja rozszerzona: ===+ === Do napisaniaWersja podstawowa ===
  
-Zadajemy wielkość "dopuszczalnego" błęduProgram powtarza obliczenia dla kroku //h///2 porównuje wyniki dla //h// i //h///2. Jeżeli różnica wyników jest większa niż błąd dopuszczalnyto ponawia połowienie kroku.+W programie jest funkcja, która oblicza wartości funkcji podcałkowej (funkcji określającej wykres ograniczający pole, którego powierzchnia będzie obliczana) 
 +W funkcji ''main'' program: 
 +  * wczytuje granice przedziału całkowania maksymalny błąd, 
 +  * wywołuje funkcję, która rekurencyjnie oblicza pole, 
 +  * wyprowadza na ekran powierzchnię obliczonego pola
  
-**UWAGA:**+=== Wersje rozszerzone ===
  
-Takich algorytmów obliczania całki oznaczonej nie należy stosować w praktyce obliczeniowej - są metody znacznie lepszektóre tyle samo licząc osiągają zdecydowanie lepszą dokładność (np. Gaussa, Newtona-Cotesa wyższych rzędówRomberga itp.).+  * Należy tak napisać programaby liczba obliczeń wartości zadanej funkcji była jak najmniejsza.  
 +  * Program wyprowadza wartości zmiennej niezależnej ''x'' (od najmniejszej do największej)w których obliczana była zadana funkcja.
  
  
cw-6-rekurencja.1415021355.txt.gz · ostatnio zmienione: 2014/11/03 14:29 przez miller