====== Różnice ====== Różnice między wybraną wersją a wersją aktualną.
cw-6-rekurencja [2013/10/28 17:11] 127.0.0.1 edycja zewnętrzna |
cw-6-rekurencja [2018/10/26 12:54] (aktualna) miller [Funkcja obliczająca dwie wartości - przykład 2.] |
||
---|---|---|---|
Linia 1: | Linia 1: | ||
- | ==== Całka oznaczona ==== | + | ==== Wskaźniki: definiowanie, operator & i dereferencji * ==== |
+ | 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''. | ||
- | Numeryczne obliczanie (prymitywnymi metodami) całki oznaczonej - (dla osób, które z tym pojęciem się nie spotkały: pola pod wykresem funkcji). | + | ==== Funkcja obliczająca dwie wartości ==== |
- | + | ||
- | === Wersja podstawowa === | + | |
+ | 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. | ||
- | Algorytm obliczania wartości funkcji całkowanej (dowolnej) zapisujemy w osobnym segmencie (funkcji w znaczeniu fragmentu programu). | + | ==== Funkcja obliczająca dwie wartości - przykład 2. ==== |
- | W segmencie głównym program wczytuje przedział całkowania (dolną //a// i górną //b// granicę pola pod wykresem) oraz | + | 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''. |
- | 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: | + | ==== Rekurencja - obliczanie silni ==== |
- | * 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ą z metod. | + | Proszę napisać 2 wersje programu obliczającego wartość silni zadanej liczby: |
+ | * z wykorzystaniem iteracji w pętli, | ||
+ | * z użyciem funkcji wywoływanej rekurencyjnie. | ||
- | Przybliżenie całki jest sumą wszystkich pól //p<sub>i</sub>//. | ||
- | === Wersja rozszerzona: === | + | ==== Rekurencja - adaptacyjny algorytm obliczania całki oznaczonej metodą Simpsona ==== |
- | Zadajemy wielkość "dopuszczalnego" błędu. Program powtarza obliczenia dla kroku //h///2 i porównuje wyniki dla //h// i //h///2. Jeżeli różnica wyników jest większa niż błąd dopuszczalny, to ponawia połowienie kroku. | + | **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). |
- | **UWAGA:** | + | **Metoda Simpsona** pozwala obliczyć przybliżoną wartość ww. pola. |
+ | Przepis: | ||
+ | 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. | ||
- | Takich algorytmów obliczania całki oznaczonej nie należy stosować w praktyce obliczeniowej - są metody znacznie lepsze, które tyle samo licząc osiągają zdecydowanie lepszą dokładność (np. Gaussa, Newtona-Cotesa wyższych rzędów, Romberga itp.). | + | **Algorytm adaptacyjny** ma na celu osiągnięcie wyniku (pola) z błędem nie większym niż zadany = ''Delta''. |
+ | |||
+ | * 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 z 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'')! | ||
+ | |||
+ | |||
+ | === Do napisania: Wersja podstawowa === | ||
+ | |||
+ | 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 i maksymalny błąd, | ||
+ | * wywołuje funkcję, która rekurencyjnie oblicza pole, | ||
+ | * wyprowadza na ekran powierzchnię obliczonego pola. | ||
+ | |||
+ | === Wersje rozszerzone === | ||
+ | |||
+ | * Należy tak napisać program, aby 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. | ||