Danych Meteorologicznych Sylwester Arabas (ćwiczenia do wykładu dra Krzysztofa Markowicza) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 14. stycznia 2009 r.
Zadanie 10.2D odpowiedzi na pytania i przykłady symulacji dla różnej liczby punktów pomiarowych > zad13 2D, frac=.005 wymiary macierzy to: Q : n x n x R : n o n o H : n o n x K : n x n o rozmiar stały, wartości stałe rozmiar zmienny, wartości: σ 2 na diagonali rozmiar zmienny rozmiar zmienny rozmiary zmienne bo n o = n o(t) > zad13 2D, frac=.05 > zad13 2D, frac=.5
Zadanie 12.1 : polecenie Znalezienie rozkładu pola anomalii wybranego parametru meteorologicznego na empiryczne funkcje ortogonalne (na przykładzie średnich miesięcznych z reanalizy NASA MERRA 1 - zestawy danych tavgm 2d slv Nx,szkic kodu zakłada umieszczenie plików z conajmniej kilkunastu miesięcy w katalogu data ). Search DISC + Advanced Search ATMOS COMPOSITION HYDROLOGY A-TRAIN AIRS MODELING MAIRS PRECIPITATION You are here: GES DISC Home Modeling Data Holdings MERRA Products MERRA Products MERRA Products Analysis Files History Files Chemistry Forcing Files Legend 1 MERRA, or the Modern Era Retrospective-analysis for Research and Application, is a NASA reanalysis for the satellite era (30 years 1979-current) using the Goddard Earth Observing System Data Assimilation System Version 5 (GEOS-5 DAS), dane dostępne np. poprzez stronę NASA DISC i system Mirador
Zadanie 12.1 : polecenie Rozszerzenie szkicu kodu (rozszerzone rozwiązanie zadania 10.1 + wskazówki) o następujący schemat procedury rozkładu pola anomalii parametru meteorologicznego na empiryczne funkcje ortogonalne: odjęcie od wczytanych danych wartości średnich dla danej stacji (wyliczenie anomalii) wyznaczenie macierzy kowariancji anomalii wyznaczenie wektorów i wartości własnych macierzy kowariancji wykreślenie map poszczególnych empirycznych funkcji ortogonalnych (wektorów własnych macierzy kowariancji) wypisanie wkładu poszczególnych e.f.o. do całkowitej wariancji (stosunki poszczególnych wartości własnych do sumy wszystkich) wykreślenie serii czasowej wag poszczególnych e.f.o. w rozkładach map z poszczeg. lat (iloczyny skalarne e.f.o z mapą z danego roku)
Zadanie 11.1 przykładowy wynik obliczeń
Zadanie 11.1 szkic kodu zad11 1.pro 1 pro zad11_1 2 3 ; ustawienia 4 listahdf = 'data/merra*.prod.assim.tavgm_2d_slv_nx.*01.hdf' 5 maplimit = [45, 10, 60, 30]; lat_min, lon_min, lat_max, lon_max 6 loadct, 1 7 8 ; pobranie z plików HDF danych ograniczonych do obszaru okolic Polski 9 pliki = file_search(listahdf, count=cnt) 10 if cnt eq 0 then message, 'Brak plikow pasujacych do: ' + listahdf 11 for i = 0, n_elements(pliki) -1 do begin 12 id_hdf = hdf_sd_start(pliki[i], /read) 13 id_sds = hdf_sd_select(id_hdf, hdf_sd_nametoindex(id_hdf, 'SLP')) 14 if i eq 0 then begin 15 hdf_sd_dimget, hdf_sd_dimgetid(id_sds, 0), scale=data_lon 16 hdf_sd_dimget, hdf_sd_dimgetid(id_sds, 1), scale=data_lat 17 lons = where(data_lon ge maplimit[1] and data_lon le maplimit[3]) 18 lats = where(data_lat ge maplimit[0] and data_lat le maplimit[2]) 19 data = fltarr(n_elements(lats) * n_elements(lons), n_elements(pliki), /nozero) 20 endif 21 hdf_sd_getdata, id_sds, tmp, $ 22 start=[lons[0], lats[0], 0], count=[n_elements(lons), n_elements(lats), 1] 23 hdf_sd_end, id_hdf 24 data[*, i] = temporary(tmp) 25 endfor 26 data_lon = data_lon(lons) 27 data_lat = data_lat(lats) 28 29 ; wyznaczanie empirycznych funkcji ortogonalnych 30 31 ; 2. wyznaczenie macierzy kowariancji anomalii: dwie emtody 32 ; a) funkcja z flagą /covariance 33 ; b) dla każdego z punktów pomiarowych odjęcie średniej ze wszystkich lat obserwacji 34 ; i przemnozenie przez macierz transponowaną, może się przydać: 35 ; - drugi argument do f-cji total() 36 ; - funkcja z flagą /sample 37
Zadanie 11.1 szkic kodu zad11 1.pro 38 ; 2. wyznaczenie wektorów i wartości własnych cov 39 ; może się przydać: 40 ; - funkcja z flagą eigenvec 41 42 ; 3. wypisanie kilku pierwszych wartości własnych (stosunki wartości do sumy wszyskich) 43 44 ; 4. wyznaczenie współczynników rozkładu dla wszystkich lat obserwacji 45 ; może się przydać: 46 ; - odwołanie do eigvec[*, eof], gdzie eigvec to wartość przekazana przez 47 ; - odwołanie do data[*, plik] 48 49 ; 5. wykreślenie pól / eofów / etc 50 ; może się przydać: 51 ; - reform(eigvec[*, eof], n_elements(lons), n_elements(lats)) 52 ; - set_plot, 'svg' 53 ; - map_set,.5*(maplimit[0] + maplimit[2]),.5*(maplimit[1] + maplimit[3]), $ 54 ; /gnomic, limit=maplimit 55 ; - contour, reform(data[*, plik], n_elements(data_lon), n_elements(data_lat), /o), $ 56 ; data_lon, data_lat, /overplot, /fill 57 ; - contour, reform(eigvec[*, eof], n_elements(lons), n_elements(lats)), $ 58 ; data_lon, data_lat, /overplot, /fill 59 ; - map_continents, /countries, /coasts, color=!p.background 60 ; - map_grid, /label, glinestyle=0, latlab=maplimit[3], lonlab=maplimit[2] 61 62 end 63 ; EOF :)
Zadanie 11.1 rozwiązanie zad11 1.pro neof = 3 nlev = 20 ; wyznaczanie empirycznych funkcji ortogonalnych ; 1. dla każdego z punktów pomiarowych odjęcie średniej ze wszystkich lat obserwacji data -= rebin(total(data, 2)/n_elements(pliki), n_elements(lats) * n_elements(lons), n_elements(pliki), /sample) ; 2. wyznaczenie macierzy kowariancji anomalii cov = correlate(data, /covariance) ; 3. wyznaczenie wektorów i wartości własnych cov eigval = eigenql(cov, eigenvec=eigvec) ; wektory są już unormowane ; 4. wypisanie kilku pierwszych wartości własnych (stosunki wartości do sumy wszyskich, w procentach) print, eigval[indgen(5)]/total(eigval) ; 5. wyznaczenie współczynników rozkładu dla wszystkich lat obserwacji rzut = fltarr(n_elements(pliki), neof) for i=0, n_elements(pliki) - 1 do for j=0, 2 do rzut[i, j] = total(eigvec[*, j] * data[*, i]) eofs = ptrarr(neof, /nozero) eofs[0] = ptr_new(reform(eigvec[*, 0], n_elements(lons), n_elements(lats))) eofs[1] = ptr_new(reform(eigvec[*, 1], n_elements(lons), n_elements(lats))) eofs[2] = ptr_new(reform(eigvec[*, 2], n_elements(lons), n_elements(lats))) wklad = fltarr(neof) for i=0, neof -1 do wklad[i] = 100 * eigval[i]/total(eigval) print, 'eof1', rzut[*, 0] print, 'eof2', rzut[*, 1] print, 'eof3', rzut[*, 2] ; rysowanie mapy
Zadanie 11.1 rozwiązanie zad11 1.pro set_plot, 'svg' device, filename='zad12_2d.svg'!p.multi=[0,3,2] for p=0, 5 do begin map_set,.5*(maplimit[0] + maplimit[2]),.5*(maplimit[1] + maplimit[3]), $ limit=maplimit, /gnomic, /noborder, advance=p, charsize=2, $ title=p lt 3? 'NASA MERRA SLP anom. [Pa] ' + strtrim(string(1979) + p, 2) + $ '.01' : 'EOF ' + strtrim(string(p - 2), 2) + ' (' + string(wklad[p-3], format='(i3)') + ' %)' if p lt 3 then begin contour, reform(data[*, p], n_elements(data_lon), n_elements(data_lat), /o), $ data_lon, data_lat, /overplot, nlev=nlev, /fill contour, reform(data[*, p], n_elements(data_lon), n_elements(data_lat), /o), $ data_lon, data_lat, /overplot, nlev=nlev, /follow endif else begin contour, *(eofs[p-3]), data_lon, data_lat, /overplot, nlev=nlev, /fill contour, *(eofs[p-3]), data_lon, data_lat, /overplot, nlev=nlev, /follow endelse map_continents, /countries, /coasts, color=!p.background map_grid, /label, glinestyle=0, latlab=maplimit[3], lonlab=maplimit[2], charsize=.5 endfor device, /close end ; EOF :)
: rozwiązywanie zagadnienia własnego dla macierzy symetrycznych (np. macierz kowariancji) zwraca N wartości własnych przekazanej w argumencie tablicy N N (oraz ew. jej wektory własne) warotści własne = eigenql(tablica symetryczna) warotści własne = eigenql(tablica symetryczna, $ eigenvectors=wektory własne) przykład użycia > a = correlate(randomu(seed, 3, 3), /covariance) > eigval = eigenql(a, eigenvectors=eigvec) > help, a, eigval, eigvec A FLOAT = Array[3, 3] EIGVAL FLOAT = Array[3] EIGVEC FLOAT = Array[3, 3]
: funkcja skaluje rozmiary tablicy o czynnik całkowity (interpolując wartości) tablica wynikowa A = rebin(tablica wejściowa N, A) tablica wynikowa AxB = rebin(tablica wejściowa NxM, A, B) Przy zwiększaniu, wymiar tablicy wynikowej musi być całkowitą wielokrotnością wymiaru tablicy wejściowej. przykład użycia Przy zmniejszaniu, wymiar tablicy wejściowej musi być wielokrotnością wymiaru tablicy wynikowej. Domyślnie aproksymacja poprzez interpolację dwuliniową (przy zwiększaniu rozmiaru) lub poprzez uśrednianie sąsiednich wartości (przy zmniejszaniu rozmiaru). Wywołanie funkcji z flagą /sample powoduje aproksymowanie wartością najbliższego sąsiada (niższa jakość wyniku, krótszy czas obliczeń). Uwaga na ostatni element tablicy wynikowej rebin nigdy nie ekstrapoluje! (patrz przykład poniżej) > a = findgen(2) & print, a 0.00000 1.00000 > print, rebin(a, 4) 0.00000 0.50000 1.00000 1.00000 > print, rebin(a, 4, /sample) 0.00000 0.00000 1.00000 1.00000 > print, rebin(a, 1) 0.50000 > print, rebin(a, 1, /sample) 0.00000 zasada działania
: funkcja rearanżuje tablice bez zmiany zawartości (również in-situ) tablica wynikowa = reform(tablica wejściowa, wymiar 1, wymiar 2,... ) tablica = reform(tablica, wymiar 1, wymiar 2,..., /overwrite) przykład użycia > a = indgen(4) > print, a 0 1 2 3 > a = reform(a, 2, 2, /overwrite) > print, a 0 1 2 3
: funkcja zwraca współczynnik korelacji (kowariancję) dwóch wektorów lub macierz korelacji (kowariancji) macierzy współczynnik korelacji = correlate(wektor1, wektor2) kowariancja = correlate(wektor1, wektor2, /covariance) macierz korelacji = correlate(macierz) macierz kowariancji = correlate(macierz, /covariance) przykład użycia > x = [1,2,3] > y = [1,2,3] > print, correlate(x, y), correlate(x, -y) 1.00000-1.00000
Wesołych Świąt!