Archiwum: December, 2016

Świątecznie zadanie dla studentów

Co roku z okazji zbliżających się świąt proponuję studentom wstępu do programowania w pythonie na 1 roku w ramach kartkówki zadanie odmóżdżające polegające na przygotowaniu wykresu o tematyce świątecznej. Święta zbiegają się mniej więcej z wprowadzeniem do biblioteki matplotlib, więc i zadanie nie jest mocno naciągane od strony merytorycznej. Gdy dawałem to zadnie pierwszy raz byłem przekonany, że jest to z mojej strony prezent w postaci darmowego punktu do zaliczenia. Niestety co roku zdarzają się osoby, dla których wymyślenie współrzędnych kolejnych wierzchołków łamanej w kształcie choinki jest zbyt trudne.

Zadanie to ma jeszcze jeden ukryty cel – bardzo ładnie pokazuje czy dany student jest dobrym materiałem na fizyka-programistę:

  • Są osoby, które każdy element “rysunku” tworzą oddzielnie – nawet elementy choinki bywają narysowane jako pojedyncze proste. Gwiazdki / bombki również są w takich przypadkach rysowane przez wielokrotne wywołanie plot(). Autorzy takich prac z reguły mają duży problem z zaliczeniem tego prostego i wprowadzającego kursu.
  • Standardem są rozwiązania odrobinę bardziej przemyślane, gdzie wierzchołki łamanych i dodatkowe elementy są definiowane jako listy. O ile sam sposób rysowania może być przemyślany, o tyle współrzędnej dalej są wpisane ręcznie w kod programu. Większość autorów takich rozwiązań nie ma problemu z zaliczeniem przedmiotu na czwórkę.
  • Najrzadsze i najlepsze rozwiązania uwzględniają różnego rodzaju reguły matematyczne: np. funkcja generująca współrzędne łamanej tworzącej choinkę przyjmująca ilość gałęzi i wysokość jako parametry. Taka rozwiązanie spotkałem nie częściej niż raz na rok. Autorzy zaliczają zawsze na piątkę i nie mają problemów z pozostałymi (trudniejszymi) przedmiotami.

Najważniejsze w tym zadaniu jest nie sugerowania ani efektu końcowego, ani sposobu rozwiązania. Dzięki temu uruchamiana jest kreatywność (lub jej całkowity brak) i podświadome umiejętności programistyczne: czy dana osoba traktuje komputer jak ślepego wykonawce poleceń, czy jako maszynę która potrafi postępować na podstawie algorytmu.

Myślę, że mogłoby to być bardzo sprytne zadanie rekrutacyjne. Moi studenci dostawali na rozwiązanie 15-20 minut. Oto kilka przykładów:

| Komentarze

Na jakiej wysokości latają samoloty?

Analizując przepisy odnośnie ograniczeń lotów bezzałogowców w obrębie lotnisk zacząłem się zastanawiać na jakich faktycznie wysokościach latają samoloty rejsowe podczas startów i lądowań.

Wybrałem sobie jeden dzień (zeszły poniedziałek) i zebrałem informacje o wszystkich lotach nad Polską z tego dnia. Plik z danymi z całego dnia zajmuje jakieś 370 mb i wygląda mniej więcej tak:

bbc8f8f,3C5432,55.0600,11.8611,356,34000,354,5412,F-EKEB2,A306,D-AEAR,1480291202,LEJ,OSL,QY3314,0,0,BCS3314,0
bbc663a,394A0B,54.5979,11.8800,52,32000,401,0652,F-EKKL1,B77W,F-GSQL,1480291202,CDG,HND,AF274,0,0,AFR274,0
bbc879c,738076,49.0065,11.9041,120,37000,512,4753,F-ETHF1,B772,4X-ECF,1480291203,LHR,TLV,LY318,0,0,ELY318,0
bbc95e8,40066A,53.9157,12.4301,5,24000,349,6450,F-EDDT2,B752,G-BMRH,1480291202,LEJ,CPH,QY178,0,0,BCS178,0
bbbe339,,50.2147,12.6663,292,40025,385,3253,F-LKPD1,CL60,,1480291203,,,,0,0,CL60,0
bbc715e,406F01,49.8304,12.6811,16,35975,413,1000,F-LKVO1,A320,G-EZOZ,1480291203,BCN,SXF,U24536,0,64,EZY81TC,0
bbc86f4,424293,48.7195,13.1555,114,38975,516,2223,F-LKVO1,B788,VP-BBR,1480291203,LHR,GYD,J28,0,-64,AHY8,0
bbc858c,894070,50.5559,13.2681,112,35000,491,2246,F-LKVO1,A320,A9C-AO,1480291203,LHR,BAH,GF6,0,-64,GFA6,0

Mamy kod lotu, współrzędne geograficzne, wysokość, czas, lotnisko z którego wystartował, lotnisko docelowe, model samolotu itp. Komplet danych załadowałem do Matlaba. W pierwszej kolejności wyrysowałem sobie wszystkie dane:

mapa0

Sam ogrom informacji na mapie robi wrażenie, wyraźnie widać duży ruch w okolicach Okęcia. Mieliśmy rozmawiać o wysokościach, więc zaznaczam na mapie pozycje kolorami w zależności od wysokości lotu. Zielone to wysokości od 3 do 2 km, żółte od 2 do 1 km, pomarańczowe od 1 km do 500 m i czerwone poniżej 500 m:

mapa1

Widać, że obszar wokół lotnisk gdzie samoloty latają nisko jest stosunkowo duży. Dla każdego lotniska należałoby przeprowadzić oddzielną analizę. Ja zainteresowałem się Warszawskim Okęciem. Na wykresie naniosłem wysokość lotu (nad poziom terenu) w zależności od odległości w km od lotniska (dla Okęcia liczyłem odległość od przecięcia pasów startowych). Zbiór danych jest bardzo duży, a ich dokładność różna, ale wyraźnie widać różnicą pomiędzy profilem starów (czerwone) i lądowań (niebieskie):

wykres1

Wyraźnie widać, że w zależności od długości lotu samoloty osiągają różne wysokości przelotowe.

I to co najbardziej interesujące – zbliżenie na samo lotnisko:

wykres2

Wyraźnie widać, że podczas lądowań samoloty znajdują się dłużej i dalej na małej wysokości. Wydaje się to być zgodne ze zdrowym rozsądkiem. Jakby ktoś był zainteresowany mogę zrobić wykres dla innego lotniska. Bardzo ciekawe jest to zagięcie podczas lądowań równo 15 km od lotniska – może jakiś znawca tematu wyjaśni, czemu to tak wygląda. Wydawało by się, że powinno być łagodne rozpoczęcie zniżania a tu wydaje się gwałtowne.

Dla lubiących kod dziś mam fragment Matlaba rysujący wykres pokazany powyżej:

clear;clc;
T = readtable('all2.txt');

%%
airport1 = table2array(T(:,13));
airport2 = table2array(T(:,14));

flight_lon = table2array(T(:,4));
flight_lat = table2array(T(:,3));
flight_elev = table2array(T(:,6));
flight_code = table2array(T(:,1));
flight_elev = flight_elev * 0.3048;

%%
D = distance(52.165802, 20.967240, flight_lat(idx), flight_lon(idx));
D = deg2km(D);

idxs = strcmp(airport1,'WAW');
idxl = strcmp(airport2,'WAW');

Ds = deg2km(distance(52.165802, 20.967240, flight_lat(idxs), flight_lon(idxs)));
Dl = deg2km(distance(52.165802, 20.967240, flight_lat(idxl), flight_lon(idxl)));

clf
hold on
subplot(2,1,1)
plot(Dl,flight_elev(idxl)/1000,'b.')
title('Planes landing @ WAW')
xlabel('Distance [km]')
ylabel('Elevation [km]')
subplot(2,1,2)
plot(Ds,flight_elev(idxs)/1000,'r.')
title('Planes taking off @ WAW')
xlabel('Distance [km]')
ylabel('Elevation [km]')

print(gcf, '-r360', '-dpng', 'wykres1.png');

| Komentarze (3)