Zadanie
Wyobraźmy sobie że mamy zestaw danych (pochodzących z jakichś pomarów). Są one lekko zaszumione. Naszym zadaniem jest zastosowane metody ruchomej średniej aby je wygładzić.
Na potrzby tego zadania trzeba będzie:
na podstawie zadanej liczby
N(długość seri danych);wygenerować
Nwartości zmiennoprzecinkowych;a następnie „wygładzić dane" stosując metodę ruchomej średniej o
mskładnikach ($m<N$).
Trzeba też zadać w odpowiedni sposób wartość m. (m to zazwyczaj nieparzysta liczba całkowita: 3, 5, 7,…)
Następnie program dokonuje odpowiednich przeliczeń i wyprowadza na ekran obok siebie dwie kolumny liczb: dane oryginalne i dane przetworzone1.
Ruchoma średnia
Niech $w_i,\quad i=0, 1,\ldots, N-1$2. Ruchoma średnia to metoda wygładzania danych polegająca na wyliczeniu na podstawie danych z tablicy $w$ nowej tablicy $t$ w sposób następujący:
$$t_i = \dfrac{1}{m}\sum_{j=-(m-1)/2}^{j=(m-1)/2} w_{i+j}$$
Wartość $m$ przyjmowana jest jako liczba nieparzysta (3, 5, 7,…)3.
Zdecydować trzeba, co robimy z elementami tablicy, dla których nie można4 wyliczyć pełnej średniej. Można wybrać jeden z dwu wariantów:
Przepisujemy je bez zmian;
Wyliczamy taką średnią jaką się da wyliczyć.
To znaczy gdy $m = 5$, $j$ zmienia się w zakresie od -2 do 2 (włącznie), zatem niedostępne są elementy $w_{-1}$ i $w_{-2}$ potrzebne do wyliczenia $t_0$. Czyli albo:
przepisujemy bez zmian $t_0\leftarrow w_0$ i $t_1\leftarrow w_1$, kolejne elementy liczymy zgodnie z wzorem. Podobnie na drugim końcu tablicy.
Wyliczamy to „co się da":
$$t_0=\frac{1}{3} (w_0 + w_1 + w_2)$$
$$t_1=\frac{1}{4} (w_0 + w_1 + w_2 +w_3)$$
(a $t_2$ już „normalnie": $t_2=\frac{1}{5}(w_0+w_1+w_2+w_3+w_4)$). I podobnie na końcu tablicy.
Generacja losowych danych zmiennoprzecinkowych
Funkcja rand() generuje pseudolosoway liczby całkowite z zakresu od zera do wartości RAND_MAX (to, najprawdopodobniej wartość 2 147 483 647).
x = rand() / RAND_MAX może dać wyniku liczbę z zakresu od 0 do 1. (o ile tylko dzielenie wykonan się poprawnie5).
x - 0.5 będzie to wartość (pseudolosowa) z zakresu $(-0.5, 0.5)$, a 2 * (x - 0.5) to wartość pseudolosowa z zakresu $(-1.,1.)$.
I proszę nie epatować cyframi po przeciunku, jedna lub dwie powinny wystarczyć; specyfikacja formatu
%fdaje 6 cyfr po przecinku natomiast specyfikacja%.2f— da tylko dwie. ↩︎Zwracam uwagę, że w opisie dane numerowane są od 0, podobnie jak w przypadku języka C (gdzie indeksy tablicy rozpoczynają się od zera). ↩︎
Czemu? ↩︎
Pierwsze i ostatnie elemanty tablicy. ↩︎
Zarówno
rand()jak iRAND_MAXto wartości całkowite, więc trzeba dokonąc jakiegoś rzutowania. ↩︎