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);

Podobne dokumenty