piątek, 9 listopada 2012

Rozwiązywanie równań - aplet z grą

Wracam do tematu rozwiązywania prostych równań, o którym pisałem przy okazji zadania z cegłą. Poniżej przedstawiam prototyp pewnej gry matematycznej (właściwie to nie aplet, jak napisałem w tytule, a zwykły javascript). Pierwsze wrażenia są zachęcające - może ktoś to rozwinie, a może ja to zrobię, jeśli znajdę czas.

ROZWIĄŻ RÓWNANIE !

Zadaniem gracza jest rozwiązanie równania. Przycisk z symbolem losuje nowe równanie do rozwiązania. Kolejne przyciski służą do wykonywania operacji na równaniu (pamiętacie zadanie o cegle - dokładanie cegieł na obie szalki, itp). Należy doprowadzić do sytuacji, w której po jednej stronie równania zostanie pojedyncze "X", nie pomnożone przez żadną liczbę, a po drugiej liczbowa wartość (np. X = 4).

To prosta gra, pojedyncza partia odpowiada dokładnie rozwiązaniu równania. Gdyby rozwinąć ten temat (może ktoś to zrobi - jeśli znajdę kiedyś podobny program/aplet - postaram się zamieścić tutaj informację) - otrzymalibyśmy narzędzie dydaktyczne !

Osoby, które uczą matematyki, albo - jeszcze lepiej - udzielają korepetycji (korepetycje pozwalają z bliższej odległości obserwować zmagania niedoświadczonego umysłu z matematyczną materią) uznają ten pomysł na pewno za coś ciekawego.

Tego typu gry pozwalają w przyjemny sposób przyspieszyć moment, w którym osoba ucząca się przeżywa coś w rodzaju olśnienia (albo jak niektórzy mówią - coś jej w umyśle "przeskakuje") i nagle wie już, jak się to robi ! (W tym przypadku - jak się rozwiązuje równania z jedną niewiadomą. Rzeczywiście, zadanie to należy do prostych - łatwo je zautomatyzować.) Jest to coś takiego, jak odkrycie taktyki w prostej grze komputerowej - sposobu, który gwarantuje, że z każdego labiryntu znajdziemy wyjście w skończonej liczbie kroków.

Gra zawiera pewien haczyk: niektóre rozwiązania prowadzą do ułamkowych wartości, a przyciski pozwalają operować tylko na liczbach całkowitych. Mnożenie i dzielenie może doprowadzić do utraty precyzji - błędy zaokrągleń nakładają się, kumulują i w rezultacie możemy skończyć w sytuacji bez wyjścia. Trzeba zawsze starać się zachowywać całkowite współczynniki, zwykle jest to możliwe.

Gra zawiera też ciekawostkę: mnożenie i dzielenie operuje na liczbach pierwszych; w pierwszej wersji miałem tylko mnożenie i dzielenie przez liczby od 2 do 7, okazało się to jednak niewystarczające kiedy przeglądarka wylosowała równanie:

5X + 1 = - 6X

Chcąc więc pomnożyć (lub podzielić) równanie przez jakąś liczbę, której nie ma na przyciskach (np. 10) trzeba ją rozłożyć w pamięci na czynniki (tutaj 10 = 2 × 5) i pomnozyć (lub podzielić) po kolei przez te czynniki.

A oto dłuższy przykład:

4X - 4 = -2 - X | / 4
X - 1 = -0.5 - 0.25X | + 1
X = 0.5 - 0.25X | - X
0 = 0.5 - 1.25X | × 2
0 = 1 - 2.5X | - 1
-1 = - 2.5X | × 2
-2 = - 5X | / 5
-0.4 = - X | × (-1)
0.4 = X | ROZWIĄZANIE !

Gracz otrzymał poprawne rozwiązanie, jak się jednak nabiedził ! Wszystko dlatego, że niepotrzebnie na początku szybko podzielił wszystko przez 4, musiał potem pomnożyć ! Widać tu, że przykład ten powstał zanim odkryłem, że brakuje dzielenia przez 11 !

Właściwa taktyka jest taka: po pierwsze zgromadzić wszystkie X-y po lewej (stosując dodawanie i odejmowanie), potem wszystkie liczby bez X po prawej (takim samym sposobem), a na końcu podzielić wszystko przez czynnik przy X.

I jeszcze kilka pomysłów na rozwinięcie i udoskonalenie tego programiku:

  • Cofanie ruchu ("Undo")
  • Zapis (przy użyciu "local storage" HTML5)
  • Mierzenie czasu rozwiązywania
  • Możliwość wpisywania własnego równania
  • Podpowiedzi systemu
  • Grupowanie (zwijanie) ciągów operacji (np. dwie operacje +3 i +4 dają +7)
  • Równania ze współczynnikami symbolicznymi (np. aX + 2b = b - 1)
  • Układy równań
  • Operacje na ułamkach zwykłych (widziałem gdzieś w sieci bibliotekę implementującą wieżę numeryczną ze Scheme w JavaScripcie)
  • ... i pewnie wiele innych możliwości

Zagadki i ćwiczenia

  1. Co zrobi program, jeśli równanie nie ma rozwiązania (np. 2X + 1 = 2X) ?
  2. Albo gdy równanie ma nieskończenie wiele rozwiązań (np. 3X = 3X) ?
  3. Jak długo trzeba było klikać przycisk , żeby uzyskać przykłady odpowiadające powyższym sytuacjom 😉 ?
  4. * Czy każde zadanie wylosowane przez program da się rozwiązać używając zestawu przycisków, który jest do dyspozycji ?

wtorek, 6 listopada 2012

Jeszcze raz o foreksie

Jeden z niedoszłych adeptów foreksu upierał się kiedyś przy poglądzie, że na wykresach kursów walutowych istnieją wyraźne trendy i że powinno dać się je wykorzystać. Pytany o źródło takiego przekonania, pokazywał wykresy i twierdził, że to po prostu widać. Kolega odpowiedział mu (znam osobiście obu), że to złudzenie, a dowodem tego miał być prosty eksperyment: wygenerowanie wykresu losowego przebiegu, który z prawdopodobieństwem 1/2 w każdej chwili czasu idzie w górę lub w dół - ruch Browna. Podobno bardzo często na takim wykresie człowiek dostrzega trendy i tendencje, a nawet formacje analizy technicznej.

Kolega był szybkim koderem, więc błyskawicznie napisał coś w tym rodzaju:

awk 'BEGIN {srand();x=1000;for (i=0;i<1000;i++) {if (rand()>rand())x++; else x--; print x;}}' > tmp.txt;echo "plot 'tmp.txt' with lines; pause 10"|gnuplot

Miał trochę szczęścia (lub pecha), bo wykres był akurat wyraźnie stromy, trend był widoczny jak na dłoni ! Kliknij poniżej klawisz "LOSUJ", a wylosujesz kolejną instancję danych.

W praktyce CZASEM trafi się przebieg losowy, który WYGLĄDA na losowy, zwykle wygląda na regularny. Wniosek z tego jest taki: nie patrz zbyt naiwnie na wykresy, stosuj matematykę. Jeśli wierzysz w to, że odkryłeś Świętego Graala, sprawdź to pięć razy. Słuchaj ostrzeżeń brokerów o wysokim stopniu ryzyka związanym z handlem na foreksie ! Istnieje wiele przesłanek skłaniających do wniosku, że dla małych graczy forex to czysty hazard. Więksi być może wiedzą więcej.