Piraci Na karaibskiej wyspie Santo Domingo piraci poszukują
Transkrypt
Piraci Na karaibskiej wyspie Santo Domingo piraci poszukują
Piraci Na karaibskiej wyspie Santo Domingo piraci poszukują skarbu, który niegdyś ukrył tam zbuntowany hiszpański wicekról. Przeszukiwany teren podzielili na jednostkowe kwadratowe obszary o boku jednej mili. Każdemu obszarowi przypisali współrzędne: odciętą i rzędną, przy czym odcięta rośnie w kierunku wschodnim, a rzędna w kierunku północnym, tak jak przedstawiono na poniższym rysunku: W niedzielę 1 października 1902 roku piraci lądują na wyspie, na obszarze (0,0), i postępują według następującej, znalezionej w tajemniczych okolicznościach, instrukcji: „Każdego dnia przejdź 8 mil prosto na północ, a potem skręć w prawo i przejdź 11 mil na wschód. Policz, ile w sumie mil na północ przeszedłeś od zejścia ze statku — kopiąc w tym miejscu, znajdziesz tyle złotych dublonów, ile cyfr ma ta łączna odległość. Ponadto każdego trzeciego dnia miesiąca znajdziesz dodatkowo dwa dublony. Po zebraniu złota zawróć i przejdź na zachód tyle mil, ile dublonów właśnie zebrałeś. Tam rozbij obóz na noc, a następnego dnia możesz kontynuować swoją wędrówkę. Nie bądź zbyt chciwy Michał, aby nie spadła na Ciebie klątwa! Kamil ogarnij się bo na Ciebie też może spaść…” Wiedząc, że piraci spędzili na wyspie 150 dni, każdego dnia (łącznie z dniem lądowania) wypełniając dokładnie te polecenia. Jeżeli piraci znajdują się w kwadracie o współrzędnych (i,j), to po przejściu 1 mili na północ znajdą się w obszarze o współrzędnych (i,j+1). Z kolei w obszarze o współrzędnych (i+1,j) znajdą się, gdy pójdą na wschód, (i,j-1) — gdy pójdą na południe, (i-1,j) — gdy pójdą na zachód. Używając dostępnych narzędzi informatycznych, znajdź odpowiedzi na poniższe pytania. Odpowiedzi zapisz w pliku o nazwie wyniki.txt, każdą z nich umieszczając w osobnym wierszu i poprzedzając numerem odpowiedniego zadania. Jeśli ktoś nie lubi Excela jak Grzegorz to niech popełni program. 1. Codziennie wieczorem piraci obozują w miejscu, gdzie znaleźli się po wykopaniu dublonów i przejściu odpowiedniej liczby mil na zachód. Podaj współrzędne obozu piratów, w którym spędzają noc wigilijną 24/25 grudnia 1902. 2. Oblicz, ile mil łącznie przejdą piraci przez cały okres poszukiwań. Uwzględnij mile przebyte na północ, wschód, a także na zachód, w czasie cofania się. 3. W każdą sobotę część piratów wymyka się z obozu, aby popłynąć łódką na sąsiednią wyspę Tortuga, gdzie na różne niecne rozrywki tracą 10% (zaokrąglone w dół do liczby całkowitej) majątku posiadanego przez całą bandę. Oblicz, ile łącznie dublonów piraci zostawią na Tortudze przez cały okres swojej wyprawy. Załóż, że na wyspę przybyli, nie mając ani jednego dublona. 4. Klątwa uaktywnia się (o czym piraci nie wiedzą) każdego dnia, w którym piraci znajdują 4 lub więcej dublonów. Klątwa ta skutkuje nieprzyjemną niespodzianką: po powrocie na statek piraci będą musieli zmierzyć się z oddziałem wojska miejscowego gubernatora, składającym się z tylu żołnierzy, ile piraci zebrali łącznie dublonów w feralne dni. Oblicz, ilu przeciwników spotkają piraci. 5. Przez Santo Domingo płynie rzeka, pod kątem 45 stopni do brzegów wyspy, wpadająca do morza w pobliżu punktu lądowania piratów. Odległość obozu piratów (będącego w danym dniu na polu (x,y) od rzeki można opisać wzorem odległość = |x - y|, czyli jako wartość bezwzględną z różnicy współrzędnych obozu1. 1 W rzeczywistości odległość ta wynosi uproszczonej formuły. (licząc od środka obszaru do rzeki), użyjemy jednak Znajdź średnią odległość wieczornego obozu piratów od rzeki przez cały okres poszukiwań (150 dni) w zaokrągleniu do dwóch miejsc po przecinku, a następnie sporządź wykres kolumnowy przedstawiający tę odległość w kolejnych dniach. Wskazówki do zadania Utwórzmy arkusz, którego każdy wiersz będzie przechowywał następujące informacje: 1. nr dnia i data — kolejny dzień symulacji (1,2,3,…) oraz aktualna data (począwszy od 1 października 1902), 2. odcięta i rzędna — współrzędne pola, z którego piraci rano rozpoczynają wędrówkę (na początku (0,0)), 3. ile na wschód, ile na północ — ile mil przeszli tego dnia na wschód oraz na północ, 4. łącznie na północ — całkowita liczba mil, jakie piraci pokonali w kierunku północnym 5. znalezione — ile dublonów znaleźli kopiąc (zarazem: ile mil cofnęli się potem na zachód). Wartości w wierszu k obliczamy na podstawie wartości z poprzedniego wiersza w następujący sposób: kolejny nr dnia i data obliczą się automatycznie po rozszerzeniu pierwszych komórek na całą kolumnę, ile na wschód oraz ile na północ to zawsze odpowiednio 11 i 8, łącznie na północ obliczamy z analogicznej wartości poprzedniego wiersza, dodając do niej ile na północ, znalezione obliczamy zgodnie z piracką instrukcją, stosując do wartości łącznie na północ funkcję DŁ w MS Excel, która podaje długość napisu w komórce. Musimy dodać jeszcze 2 dublony, jeśli jest to trzeci dzień miesiąca — odzyskujemy go z daty funkcją DZIEŃ. odciętą oraz rzędną obliczamy z ich wartości z poprzedniego wiersza wartości, dodając do rzędnej mile przebyte na północ (ile na północ), a do odciętej — mile przebyte na wschód (ile na wschód), pomniejszone o mile przebyte na zachód (znalezione). Do 2. Sumujemy wartości ile na północ, ile na wschód oraz znalezione w całym zakresie. Do 3. Konieczne jest dopisanie dwóch kolumn: łącznego majątku piratów oraz dublonów zostawionych na Tortudze. Łączny majątek w dniu k to majątek w dniu k-1 powiększony o dublony znalezione w dniu k, a pomniejszony o złoto stracone na rozrywki. Dublony stracone w dniu k obliczamy za pomocą instrukcji warunkowej: jeśli dniem tygodnia (funkcja DZIEN.TYG) jest sobota, liczbą straconych dublonów jest aktualny majątek piratów podzielony przez 10 i zaokrąglony w dół. jeśli dzień tygodnia jest inny niż sobota, straconych dublonów jest 0. Pozostało jeszcze zsumować stracone dublony za pomocą instrukcji SUMA. Do 4. Zadanie można rozwiązać bardzo szybko instrukcją warunkowej sumy, czyli SUMA.JEŻELI. Chcemy zsumować w pewnym zakresie tylko te komórki, które mają odpowiednio duże wartości (większe niż 3). Używamy więc następującej formuły: SUMA.JEŻELI(zakres;">3"; zakres) Do 5. Odległość liczymy, używając funkcji ŚREDNIA. Ważne jest, aby do średniej nie wliczyć punktu położenia obozu rankiem pierwszego dnia (czyli punktu lądowania (0,0)), za to uwzględnić położenie obozu wieczorem ostatniego dnia. odpowiedzi: 1. (687, 680) 2. 3323 kroki 3. 260 dublonów 4. 125 żołnierzy 5. Odległość piratów od rzeki 25 Odległość 20 15 10 5 1 8 15 22 29 36 43 50 57 64 71 78 85 92 99 106 113 120 127 134 141 148 0 Numer dnia Średnia odległość: 8,13. Wilki i zające Klasyczny model Lotki-Volterry opisuje interakcje między populacjami dwóch gatunków. Niech 𝑊𝑛 i 𝑍𝑛 oznaczają liczebność populacji odpowiednio wilków i zajęcy, gdzie 𝑛 jest numerem kolejnego miesiąca. Model definiują następujące dwa wzory: 𝑍𝑛+1 = 𝑍𝑛 + 𝑎 𝑍𝑛 − 𝑏 𝑍𝑛 𝑊𝑛 , 𝑊𝑛+1 = 𝑊𝑛 + 𝑏 𝑍𝑛 𝑊𝑛 − 𝑐 𝑊𝑛 , gdzie 𝑎, 𝑏, 𝑐 są parametrami modelu i mają następujące znaczenie: 𝑎 — współczynnik przyrostu liczby zajęcy, 𝑏 — współczynnik umierania zajęcy na skutek polowań wilków, 𝑐 — współczynnik umierania wilków. Przyjmujemy następujące początkowe wartości populacji: 𝑍0 = 100, 𝑊0 = 30. Rozważamy model Lotki-Volterry z parametrami: 𝑎 = 0,02, 𝑏 = 0,0005, 𝑐 = 0,05. Dla potrzeb matematycznych modeli symulacyjnych przyjmujemy, że wartości 𝑍𝑛 i 𝑊𝑛 mogą być liczbami niecałkowitymi. Poniżej podano wartości populacji wilków i zajęcy w pierwszych 5 miesiącach symulacji (wartości zaokrąglono do 2 miejsc po przecinku): 𝑛 0 1 2 Zające (𝑍𝑛 ) 100,00 100,50 101,00 Wilki (𝑊𝑛 ) 30,00 30,00 30,01 3 4 5 101,51 30,02 102,01 30,05 102,52 30,08 Wykorzystując dostępne narzędzia informatyczne, wykonaj poniższe zadania. Odpowiedzi (z wyjątkiem wykresu do zadania 3) zapisz w pliku o nazwie wyniki_wilki.txt. Wyniki do każdego zadania poprzedź numerem oznaczającym to zadanie. Wykres do zadania 3 umieść w pliku wykres_wilki.xxx, gdzie xxx oznacza rozszerzenie odpowiednie dla formatu pliku. 1. Podaj liczebność populacji wilków i zajęcy po upływie 5 lat (60 miesięcy). Wynik podaj z dokładnością do 2 miejsc po przecinku. 2. Dla podanych powyżej wartości a, b, c i wartości początkowych 𝑍0 , 𝑊0 przebieg symulacji jest następujący: na początku następuje przyrost obu populacji; gdy wilków przybędzie odpowiednio dużo, to populacja zajęcy zaczyna maleć; gdy liczebność populacji zajęcy zaczyna spadać, to zaczyna też spadać liczebność populacji wilków. Podaj, kiedy zacznie maleć populacja zajęcy, tzn. podaj najmniejszą wartość 𝑛, dla której 𝑍𝑛 < 𝑍𝑛−1 . Podaj też, kiedy nastąpi spadek populacji wilków, tzn. podaj najmniejszą wartość 𝑚, dla której 𝑊𝑚 < 𝑊𝑚−1 . 3. Utwórz wykres liniowy przedstawiający liczebność populacji wilków i zajęcy w kolejnych miesiącach w ciągu pierwszych 20 lat symulacji. Pamiętaj o czytelnym opisie wykresu. 4. Rozważ symulację liczebności populacji wilków i zajęcy w okresie 40 lat. Podaj najmniejszą i największą liczebność wilków i zajęcy, jaka może być wskazana w rozważanym modelu. Odpowiedzi podaj z dokładnością do 2 miejsc po przecinku. Zające Wilki Najmniejsza populacji liczebność Największa populacji liczebność Wskazówki do zadania W zadaniu rozważany jest pewien model symulacji liczebności populacji wilków i zajęcy w pewnym środowisku. Do realizacji tej symulacji można wykorzystać arkusz kalkulacyjny lub napisać odpowiedni program. Na potrzeby rozwiązania zadań 1, 2 i 4 napiszemy programy w języku C++. Zadanie 3 zostanie rozwiązane z wykorzystaniem zarówno programu, jak i arkusza kalkulacyjnego. Ten ostatni wykorzystamy jedynie do sporządzenia wykresu. Podkreślmy, że w języku C++ wszelkie obliczenia numeryczne warto wykonywać na zmiennych typu double. Wówczas wypisywanie wyniku, np. z dokładnością do dwóch miejsc po przecinku, można zrealizować za pomocą funkcji printf w następujący sposób: printf("%.2f", x); // wypisywanie liczby x // z dokł. do 2 miejsc We wszystkich poniższych programach wykorzystujemy stałe globalne: const double a = 0.02, b = 0.0005, c = 0.05; 1. Rozważaną w zadaniu symulację można dość łatwo zaprogramować w języku C++. Wystarczy bowiem napisać pętlę, która realizuje obliczanie liczności populacji wilków i zajęcy wprost z podanych w treści wzorów: double Z = 100.0, W = 30.0; for (int n=1; n<=5*12; n++) { double nZ = Z + a*Z - b*Z*W; double nW = W + b*Z*W - c*W; Z = nZ; W = nW; } Istotne jest, aby w każdej iteracji pętli nie zastąpić liczebności populacji wilków i zajęcy przy obliczaniu nowych wartości, gdyż w obu wzorach potrzebujemy starych wartości Z i W. Dlatego w powyższym programie dodano dwie nowe zmienne nZ i nW. Ponieważ liczba n zmienia się od 1 do 5*12, więc po wykonaniu powyższej pętli w zmiennych Z i W znajdą się wyniki do zadania. 2. Aby rozwiązać zadanie ponownie utworzymy pętlę, w której obliczać będziemy liczby wilków i zajęcy w kolejnych iteracjach symulacji. W każdej iteracji będziemy po obliczeniu nowej liczby wilków i zajęcy sprawdzać, czy jest ona mniejsza od liczby z poprzedniej iteracji. Musimy zapamiętać pierwszy taki moment zarówno dla populacji wilków, jak i zajęcy. Pętlę przerwiemy dopiero wtedy, gdy zostanie stwierdzony co najmniej raz spadek populacji wilków i co najmniej raz spadek populacji zajęcy. Wykrycie numerów iteracji, w których występują te zdarzenia, oraz końcowa organizacja całej symulacji będą wówczas wyglądać następująco: double Z = 100.0, W = 30.0; int k=1, odpZ=0, odpW=0; while (odpZ==0 || odpW==0) { double nZ = Z + a*Z - b*Z*W; double nW = W + b*Z*W - c*W; if ( nZ < Z && odpZ == 0 ) odpZ = k; if ( nW < W && odpW == 0 ) odpW = k; Z = nZ; W = nW; k++; } W powyższym fragmencie programu zapamiętujemy numer iteracji, dla której nastąpił pierwszy spadek liczby zajęcy, w zmiennej odpZ, a w wypadku wilków — w zmiennej odpW. Zmienne te inicjujemy wartością 0, która wskazuje, że moment spadku liczebności nie został jeszcze zaobserwowany. Jeśli w zmiennych Z i nZ pamiętamy liczbę zajęcy w bieżącej i w poprzedniej iteracji, pierwszy spadek liczby zajęcy wystąpi wówczas, gdy spełniony zostanie warunek ( nZ < Z && odpZ == 0 ). Gdy warunek ten jest spełniony, zapamiętujemy numer bieżącej iteracji w zmiennej odpZ. Zagwarantujemy w ten sposób, że w dalszym przebiegu symulacji zajdzie warunek odpZ>0, co wskaże, że wystąpił już spadek liczby zajęcy, i przy kolejnych spadkach (jeśli wystąpią) wartość odpZ nie będzie zmieniana. Analogicznie postępujemy w przypadku populacji wilków, aktualizując odpowiednio wartość zmiennej odpW. Pętlę przebiegającą kolejne kroki symulacji przerywamy po zaobserwowaniu zarówno spadku liczby zajęcy, jak i spadku liczby wilków. Sytuacja taka ma miejsce, gdy odpZ!=0 i odpW!=0. A zatem pętlę będziemy kontynuować, dopóki choć jedna ze zmiennych odpZ, odpW będzie równa zeru. Do rozwiązania zadania pozostaje (po zakończeniu pętli) tylko wypisanie wartości zmiennych odpZ i odpW. 3. Aby rozwiązać zadanie za pomocą arkusza kalkulacyjnego, należy najpierw przygotować odpowiednie dane do wykresu. Można to zrobić wykorzystując poprzednie rozwiązania, tj. program do symulacji liczby wilków i zajęcy, lub zrealizować całą symulację w arkuszu kalkulacyjnym. Skupimy się na pierwszym sposobie. Przygotowanie danych realizujemy zatem za pomocą następującego programu: double Z = 100.0, W = 30.0; printf("0 %f %f\n", Z, W); for (int n=1; n<=20*12; n++) { double nZ = Z + a*Z - b*Z*W; double nW = W + b*Z*W - c*W; Z = nZ; W = nW; printf("%d %f %f\n", n, Z, W); } którego wynik możemy zapisać w pliku tekstowym, powiedzmy dane.txt. Jego początkowe wiersze będą wówczas wyglądały następująco: 0 100.000000 30.000000 1 100.500000 30.000000 2 101.002500 30.007500 3 101.507134 30.022541 4 102.013525 30.045165 5 102.521289 30.075414 W każdym wierszu znajdują się trzy liczby: numer iteracji, liczba zajęcy, liczba wilków. Warto podkreślić, że dwie ostatnie liczby podane są w formacie zmiennoprzecinkowym, z wykorzystaniem symbolu kropki do oddzielenia części całkowitej od ułamkowej. Jest to istotne przy importowaniu danych do arkusza kalkulacyjnego. Można to bowiem zaznaczyć w zaawansowanych opcjach podczas dokonywania importu. Podobnie należy pamiętać, aby przy imporcie zaznaczyć, że dane liczby są oddzielone pojedynczym odstępem (w tym celu należy wybrać separator „spacja”). Dalej zakładamy, że dysponujemy arkuszem, w którym: w komórkach o adresach A1:A241 znajdują się kolejne numery iteracji, a więc liczby całkowite od 0 do 240, w komórkach o adresach B1:B241 znajdują się liczby rzeczywiste określające populację wilków w kolejnych iteracjach, w komórkach o adresach C1:C241 znajdują się liczby rzeczywiste określające populację zajęcy w kolejnych iteracjach. Sporządzenie wykresu można zrealizować kalkulacyjnego Excel w następujący sposób: za pomocą arkusza 1. Wybieramy Wstaw → Wykres liniowy. 2. Dodajemy dwie serie danych: B1:B241 oraz C1:C241, nadając im odpowiednie nazwy. 3. Dla czytelności wykresu zmieniamy również etykiety na osi Ox, wybierając dane A1:A241. 4. Nadajemy wykresowi odpowiedni tytuł. 4. Aby rozwiązać zadanie, wystarczy zmodyfikować program napisany do poprzednich zadań. Mianowicie długość symulacji należy ustawić na 40 lat. Aby wyznaczyć minimalną i maksymalną liczbę wilków i zajęcy, wprowadzamy pomocniczo cztery zmienne: minW, maxW, minZ i maxZ. W każdej iteracji symulacji próbujemy poprawić te wartości w następujący sposób (skorzystano w nim z funkcji min i max): double Z = 100.0, W = 30.0; double minZ, maxZ, minW, maxW; minZ = maxZ = Z; minW = maxW = W; for (int n=1; n<=40*12; n++) { double nZ = Z + a*Z - b*Z*W; double nW = W + b*Z*W - c*W; Z = nZ; W = nW; minZ = min( minZ, Z ); maxZ = max( maxZ, Z ); minW = min( minW, W ); maxW = max( maxW, W ); } Po zakończeniu powyższej pętli wypisujemy wyniki z dokładnością do dwóch miejsc po przecinku za pomocą instrukcji: printf("MIN : %.2f | %.2f\n", minZ, minW); printf("MAX : %.2f | %.2f\n", maxZ, maxW);