Analiza Matematyczna - laboratorium. Maxima.
9. Funkcje potęgowe, wykładnicze i logarytmiczne – nieśmiało
zaglądamy do świata finansów.
O funkcjach potęgowych mówiliśmy już trochę przy okazji omawiania funkcji kwadra-
towej – wspominaliśmy tam o liczeniu pierwiastków oraz o wpływie dziedziny (domain)
na sposób obliczania takich funkcji. Teraz przyjrzyjmy się funkcjom potęgowym od tro-
chę innej strony. Popatrzmy jak Maxima radzi sobie z upraszczaniem pewnych wyrażeń:
(%i)
ratsimp( x^(-3/2)+x^(4/5) );
(%i)
factor( x^(-3/2)+x^(4/5) );
Jak widać znane nam polecenia działają i w takich sytuacjach.
Sprawdźmy jak Maxima radzi sobie z rozwiązywaniem równań zawierających pier-
wiastki kwadratowe.
(%i)
solve( 1 = sqrt(x^2+x+3), x);
Tu radzi sobie bardzo dobrze. Ale:
(%i)
solve( x = sqrt(x^2+x+3), x);
jest już za trudne... W zasadzie przykład jest łatwy - wiadomo jak sobie z nim poradzić.
Ale jak zmusić do tego Maximę? Standardowo dostępne metody z przykładem tym nie
dadzą sobie rady. Może wydawać się to dosyć zaskakujące - w końcu wystarczy podnieść
rówanie stronami do kwadratu i już jest OK... ale to przecież nie takie proste! Dla tego
typu równań nie ma reguły – spróbujmy bowiem rozwiązać równanie
√
2x
2
+ x = x
Po podniesieniu obu stron do kwadratu mamy
2x
2
+ x = x
2
czyli x = −1 lub x = 0. Jednak to pierwsze rozwiązanie nie może być poprawne – przecież
po lewej stronie równania jest pierwiastek, a po prawej liczba ujemna. Wydaje nam się,
że ten przykład usprawiedliwia Maximę – samo rozwiązanie nie wystarcza, trzeba jeszcze
sprawdzać czy ma sens – pamiętajmy również, że jeśli rozwiązujemy równanie w sposób
przybliżony, to wszystkie wyniki obarczone są błędem i wszystko robi się strrrasznie
skomplikowane...
Mamy jednak do dyspozycji pakiet topoly solver – a w nim polecenie to poly solve,
które z takimi równaniami sobie radzi:
load( "topoly solver" )
to poly solve(sqrt( 2*x^2 + x) = x, x)
1
Jest super, prawda?
No dobrze – pora jednak przejść do funkcji wykładniczych. Zatrzymamy się tu na
chwilę. W pierwszej kolejności warto przypomnieć sobie jak wyglądają ich wykresy.
Zadanie 9.1 Naszkicować, we wspólnym układzie wsółrzędnych, wykresy funkcji f, g, h :
[−6, 6] → R danych wzorami f (x) = 2
x
, g(x) = 3
x
, f (x) = e
x
. Liczbę Eulera e zapisu-
jemy w Maximie jako %e.
Zobaczmy jeszcze jak Maxima radzi sobie z pewnymi prostymi równaniami wykład-
niczymi.
Zadanie 9.2 Przy pomocy polecenia solve rozwiązać równania
a) 2
x
2
−3x+2
= 4;
b) 4 ∗ 2
x
− 2
x
= 3;
c) 4
x
− 2
x
= 0.
Równania są rzeczywiście bardzo proste. Pierwsze z nich rozwiązuje się bez najmniej-
szego problemu. Następne jednak... hmm... jakoś nie. W ostatnim przykładzie proble-
mem jest to, że Maxima nie wykonuje odpowiedniego podstawienia – myślę, że tego
można było się spodziewać. Ale skąd problemy w przykładzie drugim? Dlaczego nie wy-
konuje tu odpowiedniej redukcji? Przecież każde polecenie uproaszczające (np. ratsimp)
przerobi wyrażenie 4 · 2
x
− 2
x
na 3 · 2
x
... No cóż – tak po prostu jest.
Popatrzmy na trudniejszy przykład:
(%i)
solve(2^x = 4*x+2)
Tutaj Maxima nic nie zdziała – co więcej sami też raczej nic nie wymyślimy... Tego
równania nie da się po prostu rozwiązać symbolicznie. Nie ma wzoru z którego mogliby-
śmy skorzystać, czy podstawienia które nam to równanie istotnie uprości. Nic. Bieda.
Skoro jednak nie możemy rozwiązać tego dokładnie, to może znajdą się jakieś metody
przybliżone? Jak zwykle Maxima przychodzi z pomocą – gdy niknie nadzieja na powo-
dzenie, gdy rozwiązanie problemu zdaje się oddalać z coraz większą prędkością, okazuje
się, że jednak można! Mamy do dyspozycji bardzo ogólną metodę find root, która szu-
ka miejsc zerowych dowolnej funkcji. Jasne, ze nie jest to tak piękne jak wygląda na
pierwszy rzut oka, ale w sumie jest OK. Popatrzmy:
(%i)
find root( 2^x - 4*x-2, x, 0, 10 )
Podaje nam rozwiązanie równania. No dobrze – dwa pierwsze argumenty podanej tu
procedury są jasne – ale co oznaczają dwa następne? Dwa ostatnie argumenty to począ-
tek i koniec przedziału, w którym procedura ma szukać miejsca zerowego funkcji. Tak,
tak... niestety to my sami musimy wiedzieć! A skąd? No, to zależy – można zgadywać,
można narysować wykresy, można zbadać własności funkcji... Zwykle wiele powie nam
wykres:
2
oraz znajomość własności funkcji (np. monotoniczności czy zbioru wartości) – w ten spo-
sób często możemy uzasadniać, że rozwiązania zidentyfikowane graficznie są jedynymi.
Popatrzmy na przykład:
(%i)
find root( 2^x - 4*x-2, x, -10, 10 )
Otrzymujemy następującą odpowiedź:
function has same sign at endpoints [f(-10.0)=38.0009765625,f(10.0)=982.0]
To sytuacja, z którą często możemy się spotkać. Otóż wskazany przez nas przedział
musi spełniać jeden podstawowy warunek: jeżeli szukamy miejsc zerowych funkcji f ,
to na krańcach tego przedziału funkcja ta musi przyjmować wartości różnych znaków.
Jeżeli funkcja f jest ciągła na podanym przedziale, to daje nam to gwarancję istnienia
miejsca zerowego (na mocy tzw. własności Darboux) – i na tym opiera się pomysł na
metodę find root. Ciągłość funkcji, której miejsc zerowych szukamy jest konieczna dla
powodzenia metody – popatrzmy na przykład:
(%i)
find root(1/x,x,-10,10);
Jeszcze jedna ważna uwaga: procedura find root zwraca nam zawsze jedno miejsce
zerowe – niezależnie od tego ile miejsc zerowych rzeczywiście znajduje sie w podanym
przedziale. Niech potwierdzeniem będzie przykład:
(%i)
find root((x+1)*x*(x-2),x,-10,10);
Uzbrojeni w powyższe informacje możemy zająć się kolejnymi zadaniami:
Zadanie 9.3 Znaleźć wszystkie rozwiązania równania 2
x
= x
2
− x − 3.
Zadanie 9.4 Znaleźć wszystkie rozwiązania równania 2
x
= x
3
− 4x
2
.
3
Przejdźmy teraz do funkcji logarytmicznych. Przede wszystkim musimy wspomnieć,
że Maxima oferuje nam tylko jedną funkcję logarytmiczną log. Jest to logarytm natu-
ralny – sprawdźmy:
(%i)
log(%e)
Innych predefiniowanych funkcji nie ma – ale w razie potrzeby można je podefiniować.
Zadanie 9.5 Zdefiniować funkcję log10(x) zwracającą log
10
x.
Zadanie 9.6 Zdefiniować funkcję logab(a,b) zwracającą log
a
b.
Warto powiedzieć kilka słów o upraszczaniu wyrażeń z logarytmami. Otóż Maxima
może traktować wyrażenia log(xy), log(x/y) czy log(x
y
) w różny sposób – przekształcać
je zgodnie ze znanymi wzorami – lub nie. Steruje tym zmienna globalna logexpand.
Sprawdźmy jak Maxima zachowa się po wprowadzeniu podanych niżej wzorów dla
ustawień logexpand:true (to jest ustawienie domyślne), false oraz all.
(%i)
log(x*y)
(%i)
log(x/y)
(%i)
log(x^y)
Możemy teraz przyjrzeć się ważnym zastosowaniom logarytmów. Przede wszystkim
warto wiedzieć, że w świecie finansów logarytmy są czymś bardzo ważnym i naturalnym
– jeżeli interesują nas zmiany wartości ekonomicznych, to zwykle patrzymy nie tyle na
zmiany bezwzględne (np. ceny w złotych) ile na zmiany względne (procentowe). ”Wzrost
cen akcji o 10%” jest dużo bardziej istotną (precyzyjną) informacją niż ”Wzrost cen
akcji o 2,50 złotych”. I tutaj okazuje się, że wygodnie jest patrzeć nie tyle na wartości
bezwzględne (np. cenę, wartość obrotu, wartość indeksu giełdowego) ile na ich logarytmy.
Mam nadzieję, że o sensowności takiego spojrzenia przekona nas następujący przykład:
Zadanie 9.7 Wygenerujmy listę 100 początkowych wyrazów ciągu geometrycznego o
ilorazie 1.1 oraz pierwszym wyrazie a
1
= 10. Następnie wygenerujmy listę logarytmów
dziesiętnych tych wartości. Uzasadnić, że wygenerowany ciąg jest ciągiem arytmetycz-
nym.
Cóż możemy zauważyć? Tak, tak – pierwszy ciąg pokazuje nam stały wzrost o 10%
– każda następna liczba jest większa od poprzedniej o 10%. Z kolei drugi ciąg pokazuje
nam stały wzrost o wartość log
10
11 − 1.
I podobnie – jeżeli funkcja jest postaci y = b · a
x
, to złożenie tej funkcji z funkcją
logarytmiczną jest już funkcją liniową.
Stały procentowy wzrost (spadek) jest zjawiskiem występującym w bardzo wielu mo-
delach ekonomicznych. Ze względu na to, że takie modele prowadzą do wykładniczego
wzrostu (spadku) analizowanych wartości okazuje się, że dosyć trudno jest tego typu
dane analizować i przedstawiać na wykresie w dłuższym okresie czasu (na długich prze-
działach). Wykresy stają się nieczytelne ze względu na olbrzymią rozpiętość wartości
4
na osi OY. Dlatego bardzo często stosuje się tzw. skalę logarytmiczną – odpowiada to
temu, że oś OY na wykresie nie jest pokazana w zwykly sposób tylko tak, jakby war-
tości pokazywanej funkcji były dodatkowo złożone z funkcją logarytmiczną (o ustalonej
podstawie). Niech za przykład posłużą nam wykresy:
(%i)
plot2d( [2^x,3^x,%e^(-x)], [x,-6,6] );
(%i)
plot2d( [%e^(x^2)], [x,-6,6] );
(%i)
plot2d( [2^x,3^x,%e^(-x)], [x,-6,6], [logy] );
(%i)
plot2d( [%e^(x^2)], [x,-6,6], [logy] );
Dwa pierwsze wykresy pokazane są w tradycyjny sposób, dwa kolejne z uwzględnie-
niem na osi OY skali logarytmicznej.
A co świat finansów ma jeszcze wspólnego z funkcjami wykładniczymi i logaryt-
mami? Oj dużo, dużo! Przede wszystkim ze względu na składanie procentów. Co to
znaczy? Załóżmy, że na rachunek bankowy wpłacono jednorazowo kwotę A złotych oraz
po upływie każdego roku od chwili wpłaty dopisuje się p% odsetek. Załóżmy dodatkowo,
że z konta nie wypłaca się żadnych pieniędzy. W tej sytuacji kwota znajdująca się na
rachunku po upływie n lat dana jest wzorem
a
n
= A ·
1 +
p
100
n
.
Zadanie 9.8 Wygenerować listę ze stanem rachunku bankowego oprocentowanego na
6, 78% w skali roku w pierwszych 10 latach przy założeniu, że
a) pieniądze nie są wypłacane;
b) całość odsetek jest wypłacana od razu po naliczeniu.
Ciekawe wyniki osiągniemy, kiedy zastanowmy się nad tym, jak sytuacja wyglądać
będzie kiedy odsetki kapitalizowane będą częściej niż raz do roku. Popatrzmy – jeżeli
odsetki dopisywane będą co 6 miesięcy, to po pół roku na koncie pojawi się połowa odse-
tek należnych za cały rok. Czyli stan rachunku bankowego po roku (czyli po dwukrotnej
kapitalizacji) wyglądać będzie następująco:
a
1
= A ·
1 +
p/2
100
2
.
I ogólnie, jeżeli założymy, że kapitalizacja ma miejsce k razy w ciągu roku, to stan
rachunku po roku wygląda tak:
a
1
= A ·
1 +
p/k
100
k
.
Zadanie 9.9 Porównać kwoty zgromadzone po roku, jeżeli na rachunek wpłacono 100
złotych, rachunek oprocentowany jest na 10% w skali roku, dla kapitalizacji rocznej,
półrocznej, kwartalnej, miesięcznej oraz dziennej.
5
Uzyskane wyniki są bardzo interesujące, prawda? Kwota zdaje się rosnąć – im częściej
odsetki są kapitalizowane, tym więcej mamy na koncie po roku. Jednak ten wzrost jest
coraz wolniejszy... A co stanie się, jeżeli liczba kapitalizacji w roku (czyli k) będzie dążyła
do +∞? Zauważmy, że wówczas
a
1
= Ae
p
100
.
Oczywiście mamy tu do czynienia z procesem fizycznie niewykonalnym – nie da się
kapitalizować nieskończenie często. Jest to jednak dosyć wygodna abstrakcja – na tyle
wygodna, że powszechnie stosowana w przeróżnych modelach ekonomicznych. Nazywa
się to cudo kapitalizacją ciągłą i pozwala nam zakładać, że inwestowane pieniądze mogą
być wycofane w dowolnym momencie czasu przy wypłaceniu odpowiednich odsetek. Przy
takim podejściu nie musimy na osi czasu wyróżniać żadnych specjalnych punktów (w
których bank dopisuje odsetki) – wyróżnienie takich momentów bardzo mocno kompli-
kowałoby model matematyczny. A tak możemy każdą chwilę traktować tak samo. Któż
by się spodziewał, że liczba Eulera trafi do banków? A jednak – kolejny raz widzimy, że
życie jest pełne niespodzianek.
Na zakończenie policzmy sobie trochę finansowych zadanek:
Zadanie 9.10 Wpłacamy złotówkę do banku, który oferuje oprocentowanie w wysokości
100% w skali roku – i to kapitalizowane w sposób ciągły. Ile otrzymamy po roku?
Zadanie 9.11 Jeżeli do banku wpłacono 100 złotych zaś rachunek oprocentowany jest
na 8% w skali roku, to po ilu latach saldo na rachunku przekroczy 100000 złotych?
Zadanie 9.12 Bank A oferuje konto oprocentowane 4, 5% w skali roku z kapitaliza-
cją miesięczną. Bank B oferuje kapitalizację roczną. Jakie powinno być oprocentowanie
rachunku w banku B, aby ofety były jednakowo atrakcyjne (zakładamy, że nie są wy-
płacane żadne pieniądze)?
Zadanie 9.13 Bank A oferuje konto oprocentowane 4, 5% w skali roku z kapitalizacją
miesięczną. Bank B oferuje kapitalizację kwartalną. Jakie powinno być oprocentowa-
nie rachunku w banku B, aby ofety były jednakowo atrakcyjne (zakładamy, że nie są
wypłacane żadne pieniądze)?
6