Kolejne wpisy dopiero po Świętach – zatem już dziś Wszystkim życzę wesołych Świąt! W ramach cyklu „Matematyka w obrazkach” przygotowałem fraktalną kartkę świąteczną – Choinkę Sierpińskiego – na którą składają się:
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Przekształcenie stereograficzne (rzut stereograficzny) okręgu na prostą oraz sfery na płaszczyznę – czyli równoliczność odcinka / okręgu z całą prostą oraz sfery z płaszczyzną.
Rzut stereograficzny okręgu na prostą
Rzut stereograficzny sfery na płaszczyznę
Pozdrowienia,
Mariusz Gromada
Poza Liczbami: Inne Twórcze Przestrzenie
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Geometryczny dowód twierdzenia Pitagorasa – sam obrazek nie stanowi formalnego dowodu, ale co tam 🙂 .
Pozdrowienia,
Mariusz Gromada
Poza Liczbami: Inne Twórcze Przestrzenie
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
W pierwszych trzech częściach „Zabaw z rekurencją” skupialiśmy się na rekurencji bezpośredniej, tzn. na sytuacji, kiedy w ciele funkcji dochodzi do wywołania „siebie samej”. Przebieg rekurencji bezpośredniej jest dość oczywisty, struktura wywołania, argumenty, jak też warunek stopu, są takie same dla wszystkich odwołań.
Rekurencja pośrednia
O rekurencji pośredniej mówimy w sytuacji „łańcucha wywołań”. Przykładowo funkcja f(.) wywołuje funkcję g(.), następnie funkcja g(.) wywołuje f(.), zatem ponowne wywołanie funkcji f(.) realizowane jest bezpośrednio przez funkcję g(.),jednak pośrednio przez f(.), gdyż to f(.) wywołała g(.).
Długość łańcucha nie musi być ograniczona, w rzeczywistości wywołania pośrednie mogą mieć nietrywialną strukturę, mogą „cofać się” do poprzednich elementów, „iść na skróty”, „rozdzielać się”, a w szczególności może dochodzić do wariantów mieszanych – tzn. wywołań bezpośrednich i pośrednich (różnego typu) w ramach jednej procedury. Dobrze to obrazuje poniższy schemat.
Aproksymacja funkcji sin(x) oraz cos(x) przy wykorzystaniu połączenia rekurencji bezpośredniej i rekurencji pośredniej
Przypomnijmy podstawowe tożsamości trygonometryczne dla wielokrotności kątów.
Zwróćmy uwagę, że znając rozwiązanie dla argumentu mniejszego $\frac{x}{2}$ możemy podać rozwiązanie dla $x$ – zatem tożsamości trygonometryczne są w istocie rekurencją z odwołaniami bezpośrednimi i pośrednimi! Funkcję $\sin(x)$ w otoczeniu $0$ można przybliżyć przez $x$, natomiast funkcję $\cos(x)$ przez stałą wartość $1$. Im mniejsze otoczenie $0$ wybierzemy tym lepsza aproksymacja w zadanym przedziale, a w konsekwencji mniejszy błąd oszacowania w całości. Przyjęte wartości w otoczeniu $0$ dają również pewny warunek stopu! Mamy więc wszystko co niezbędne do zastosowania strategii rekurencyjnej w aproksymacji.
Ustalmy stałą $a>0$ (reprezentującą otoczenie $0$), następnie definiujemy dwie funkcje rekurencyjne
Podkreślmy ponownie, że funkcja $\text{s}(x)$ wywołuje siebie bezpośrednio oraz wskazuje na funkcję $\text{c}(x)$, która, oprócz bezpośredniego wywołania siebie samej, wskazuje ponownie na $\text{s}(x)$. Jest to zatem ciekawa kombinacja rekurencji bezpośredniej z rekurencją pośrednią. Zapiszmy to w MathParser.org-mXparser.
/* Definicja funkcji rekurencyjncyh */
Constant a = new Constant("a = 0.1");
Function s = new Function("s(x) =  if( abs(x) < a, x, 2*s(x/2)*c(x/2) )", a);
Function c = new Function("c(x) =  if( abs(x) < a, 1, c(x/2)^2-s(x/2)^2 )", a);
/* Wskazanie, ze 's' korzysta z 'c', a 'c' korzysta z 's' */
s.addDefinitions(c);
c.addDefinitions(s);
Oczekujemy, że im mniejszy parametr $a>0$ tym lepsza aproksymacja funkcji $\sin(x)$ oraz $\cos(x)$ przez odpowiednio $\text{s}(x)$ oraz $\text{c}(x)$. Poniżej wykresy dla $a=0.5$ oraz $a=0.01$.
Wniosek – proste zapisy rekurencyjne dają złożone wyniki! 🙂
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Jednym z najprostszych testów pierwszości jest weryfikacja czy dana liczba $n$ posiada dzielnik z przedziału $(2, \sqrt{n})$ – takie podejście nazywane jest metodą naiwną – i niestety charakteryzuje się dużą złożonością obliczeniową. Nawet przy wykorzystaniu Sita Eratostenesa złożoność obliczeniowa sięga $\frac{\sqrt{n}}{\log{n}}$. Jednak w cyklu „Zabawy z rekurencją” nie bardzo zwracamy uwagę na złożoność 🙂 , bardziej chodzi o zobrazowanie jak całe algorytmy mogą być łatwo zapisane w postaci krótkich matematycznych funkcji rekurencyjnych – zatem do dzieła 🙂
Rekurencyjne poszukiwanie dzielników
Naszym zadaniem będzie zdefiniowanie funkcji zwracającej $1$ jeśli podana liczba $n$ jest liczbą pierwszą oraz $0$ w przeciwnym wypadku. Zacznijmy jednak od podania funkcji weryfikującej czy liczba posiada dzielniki.
$${\small\text{CzyDzielnik}(n, a, b)=}$$
$${\small=\begin{cases}0&\text{dla}\quad a>b\\1&\text{dla}\quad n \mod a=0\\ \text{CzyDzielnik}(n, a+1, b)&\text{w inn. przyp.}\end{cases}}$$
Powyższa funkcja zwraca $1$ jeśli liczba $n$ posiada dzielnik z przedziału $(a,b)$, oraz $0$ w przeciwnym wypadku. Następnie definiujemy wyrażenie reprezentujące naiwny test pierwszości.
Rolą funkcji „CzyPierwsza” jest jedynie „wprawienie algorytmu w ruch” oraz zwrócenie negacji wyniki funkcji „CzyDzielnik”. Proste prawda? 🙂 Sprawdźmy więc w mXparser czy to faktycznie działa.
CzyPierwsza(1) = 0.0, czas oblicz. = 0.08 s.
CzyPierwsza(2) = 1.0, czas oblicz. = 0.03 s.
CzyPierwsza(3) = 1.0, czas oblicz. = 0.026 s.
CzyPierwsza(4) = 0.0, czas oblicz. = 0.022 s.
CzyPierwsza(5) = 1.0, czas oblicz. = 0.038 s.
CzyPierwsza(6) = 0.0, czas oblicz. = 0.015 s.
CzyPierwsza(7) = 1.0, czas oblicz. = 0.028 s.
CzyPierwsza(8) = 0.0, czas oblicz. = 0.015 s.
CzyPierwsza(9) = 0.0, czas oblicz. = 0.053 s.
CzyPierwsza(10) = 0.0, czas oblicz. = 0.011 s.
Wygląda na to, że obliczenia są poprawne! Teraz możemy zweryfikować ile jest liczb pierwszych w podanym przedziale, definiując
$$\pi(n)=\sum_{i=1}^n \text{CzyPierwsza}(i)$$
/* Definicja wyrażenia sumującego wynik funkcji CzyPierwsza */
Expression pi100 = new Expression("sum(i, 1, 100, CzyPierwsza(i) )");
pi100.addFunctions(CzyPierwsza);
/* Obliczenie i wyświetlenie wyniku */
mXparser.consolePrintln( "Liczba liczb pierwszych w przedziale (1,100) = " + pi100.calculate());
+ wynik
Liczba liczb pierwszych w przedziale (1,100) = 25.0
Pozdrowienia,
Mariusz Gromada
Pamiętajcie, że uruchamiając kody mXparsera należy dodać w nagłówku:
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Dziś ciekawostka w nawiązaniu do wpisu z dnia 20 października 2015 roku „Liczba PI ukryta w zbiorze Mandelbrota”, ujawniająca nietrywialne powiązanie liczby $\pi$ z prędkością ucieczki do nieskończoności przy zbliżaniu się punktu startu iteracji do „ostrza” zbioru Mandelbrota. Brzmi trochę skomplikowanie? Poniżej wyjaśnienie 🙂
Zbliżanie się do „ostrza” zbioru Mandelbrota
Rozważmy równanie rekurencyjne dla liczb rzeczywistych
Powyższe wyrażenie powstaje na bazie równania (w liczbach zespolonych) opisującego zbiór Mandelbrota
$$z_n=z_{n-1}^2+c$$
Ograniczając się do prostej rzeczywistej (dlatego użyłem zapisu $x_n$) przeanalizujmy zachowanie $x_n$ przy zbliżaniu się elementu $x_1=\frac{1}{4}+\epsilon$ do „ostrza” (ang. „cusp”) zbioru – ostrze to punkt o współrzędnych $(\frac{1}{4},0)$.
Szybkość ucieczki do nieskończoności
Ustalając odpowiednio małe $\epsilon>0$ decydujemy jak bardzo chcemy się zbliżyć do „ostrza”. Teraz zadanie polega na znalezieniu pierwszego $n$, dla którego $x_n>=2$. Takie minimalne $n$ jest dobrą miarą prędkości ucieczki $x_n$ do nieskończoności w zależności od wybranego $\epsilon$. Na marginesie dodam, że zbiór Juli dla równania Mandelbrota (na powyższym obrazku oznaczony kolorem czarnym), reprezentuje punkty „nieuciekające” do nieskończoności w trakcie nieskończonej iteracji . Ta tematyka jest sama w sobie bardzo ciekawa i zapewne kiedyś coś napiszę o atraktorach.
WOW! Jaki super wzorzec liczby wymaganych iteracji, aby przekroczyć 2! Dostajemy coś, co przypomina $\pi$, jednak wymaga postawienia „przecinka” w odpowiednim miejscu!Można również zauważyć, że 100-krotne zmniejszenie $\epsilon$ zwiększa niezbędną liczbę iteracji około 10-krotnie. Zmniejszając $\epsilon$ otrzymujemy liczbę coraz bardziej „przypominającą” $\pi$ 🙂
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Okres średniowiecza, kobieta winna uprawiania magii, kara straszna – spalenie na stosie! Nadszedł dzień, tłum gawiedzi, czarownica na stosie, płomienie, wiedźma krzyczy – więcej drewna! Więcej drewna! Tłum zdziwiony, mimo wszystko spełnia ostatnie życzenie opętanej. Wiedźma nie przerywa – jeszcze więcej drewna! Więcej drewna! Z oddali dobiega nagły i stanowczy sprzeciw – STOP! Czarownica chce przepełnić stos!
🙂
Czym jest rekurencja?
Zazwyczaj o rekurencji myślimy jako o procesie podziału zadania na mniejsze, następnie podziału na jeszcze mniejsze, i jeszcze mniejsze … dochodząc do zadań, dla których rozwiązanie jest znane. Od tego momentu zaczyna się składanie „mniejszych” rozwiązań w „większe”, następnie tych większych w jeszcze większe, … i w jeszcze większe … kończąc na rozwiązaniu zadania początkowego. Dla przykładu zapiszmy funkcję n! w postaci rekurencyjnej.
Podane wyżej przykłady zapisów rekurencyjnych (n!, suma n-pierwszych wyrazów ciągu, ciąg Fibonacciego) są tak naprawdę rekurencyjną realizacją pętli „for” – znamy przecież dokładnie liczbę niezbędnych operacji do wykonania, a i same operacje są raczej łatwe oraz czytelne – zatem zagnieżdżenie ich w pętli „for” nie powinno spowodować utraty przejrzystości kodu.
Poszukiwanie rozwiązania – czyli rekurencja w roli pętli „While/Until”
W metodach numerycznych często stosuje się strategie rekurencyjne – w takiej sytuacji, będąc w kroku $n$, weryfikujemy czy propozycja rozwiązania $n$ spełnia kryterium stopu (np. jakość oszacowania), jeśli tak – kończymy z rozwiązaniem $n$, jeśli nie – przechodzimy do badania propozycji rozwiązania $n+1$. Procedurę rozpoczynamy od kroku 0 (zerowego).
Przykład: znając definicję silni chcemy znaleźć pierwsze $n$, dla którego $n! >= 100$ – takie zadanie formalnie możemy zapisać jako:
/* Definicja funkcji rekurencyjnej */
Function S = new Function("S(n) = if( n! < 100, S(n+1), n )"); /* Obliczenia i wyświetlenie wyniku */ System.out.println( "Pierwsze n, że n! >= 100 to n = " + S.calculate(0) );
+ wynik:
Pierwsze n, że n! >= 100 to n = 5.0
Rekurencja bezpośrednia
Wszystkie omawiane wyżej typy rekurencji polegają na wywołaniu z ciała funkcji „siebie samej”, dlatego należą do bardziej ogólnej klasy nazywanej rekurencją bezpośrednią.
Wydajność
Implementacje na bazie rekurencji są bardzo czytelne, o często minimalnym rozmiarze kodu. Jednak coś za coś – tracimy bardzo dużo na złożoności obliczeniowej (powtarzane operacje, dzielenie zadań, operacje na stosie) oraz wymogach pamięci (głównie struktura stosu) – to właśnie dlatego czarownica błagała o drewno – licząc na przerwanie procesu z tytułu przepełnienia stosu 🙂
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Zmiana w stosunku do 1.0.1 to poprawa kontroli składni w funkcji definiowanej przez użytkownika. Do wersji 1.0.1 użycie argumentu rekurencyjnego w funkcji definiowanej przez użytkownika powodowało zwiększenie liczby oczekiwanych parametrów wywołania funkcji. Wartość argumentu rekurencyjnego jest wyznaczana automatycznie, stąd w kontroli składni (weryfikując liczbę podanych parametrów) taki argument należy pominąć. Od wersji 1.0.2 liczba parametrów funkcji definiowanej przez użytkownika opiera się na bazie liczby argumentów pomniejszonej o argumenty rekurencyjne.
Przykład
Poniżej przykład demonstrujący działanie wprowadzonej zmiany – proszę przesunąć tekst w celu uwidocznienia komentarzy.
</p>
<p>import org.mariuszgromada.math.mxparser.*;</p>
<p>public class mXparserTests {<br />
public static void main(String[] args) {<br />
RecursiveArgument z = new RecursiveArgument("z","z(n-1)^2+c", "n"); /* Definicja argumentu rekurencyjnego */<br />
z.addBaseCase(0, 0); /* Definicja elementu początkowego */<br />
Constant c = new Constant("c", 0.3); /* Deklaracja stałej występującej w równaniu rekurencyjnym */<br />
z.addConstants(c); /* Wskazanie argumentowi oczekiwanej stałej 'c' */<br />
Function diff1 = new Function("diff1", "z(n) - z(n-1)", "n"); /* Definicja funkcji o parametrze n opartej również na argumencie rekurencyjnym */<br />
diff1.addArguments(z); /* Wskazanie funkcji oczekiwanego argumentu 'z' */<br />
System.out.println(diff1.calculate(10)); /* Obliczenie wartości funkcji + wyświetlenie wyniku */<br />
}<br />
}</p>
<p>
Rezultat
</p>
<p>0.17863353779409574</p>
<p>
Pozdrowienia,
Mariusz Gromada
Poza Liczbami: Inne Twórcze Przestrzenie
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Wpis z dnia 6 listopad 2015 „Precyzja liczby Pi a obwód obserwowalnego Wszechświata” zawierał nieco zaskakującą informację na temat rozmiaru Obserwowalnego Wszechświata – tzn. podałem, że promień Obserwowalnego Wszechświata wynosi obecnie około 46 miliardów lat świetlnych, co się wydaje być w niezgodzie z wiekiem Wszechświata szacowanym na 13,8 miliarda lat. Pokusiłem się wtedy o kilkuzdaniowe wyjaśnienie różnicy, teraz wracam do tematu prezentując materiał z serwisu YouTube, który w jasny i przejrzysty sposób ilustruje zagadnienia: rozmiaru Wszechświata (nie tylko w odniesieniu do jego obserwowalnej części), centrum Wszechświata oraz stożków świetlnych. Gorąco polecam!
„Radius of Observable Universe” (+ polskie napisy) od Khan Academy
Pozdrowienia,
Mariusz Gromada
Poza Liczbami: Inne Twórcze Przestrzenie
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
W poprzednich częściach omówiliśmy sposób tworzenia macierzy błędu oraz podstawowe miary oceny jakości klasyfikacji: czułość (TPR), specyficzność (TNR), precyzję przewidywania pozytywnego (PPV), precyzję przewidywania negatywnego (NPV). Opisane miary określone są dla klasyfikatora binarnego (klasyfikacja pozytywna bądź negatywna), jednak w praktyce najczęściej stosuje się modele predykcyjne z ciągłą zmienną odpowiedzi (np. estymator prawdopodobieństwa skorzystania z produktu, gdzie wynikiem działania modelu jest wartość z przedziału [0, 1] interpretowana właśnie jako wspomniane prawdopodobieństwo określane również skłonnością).
Model predykcyjny
Dla lepszego zrozumienia załóżmy, że analizujemy bazę $n$-klientów oznaczonych odpowiednio $x_1, x_2, \ldots, x_n$. Model predykcyjny to np. funkcja (estymator) zwracająca dla każdego klienta właściwe dla niego prawdopodobieństwo zakupienia produktu – oznaczmy więc fakt zakupienia produktu klasą pozytywną „1”. Teraz możemy podać bardziej formalne określenie – zatem model predykcyjny to estymator prawdopodobieństwa warunkowego $p(1|x_i)$, że wystąpi zakup produktu (klasa „1”), pod warunkiem, że zaobserwujemy cechy klienta $x_i$.
Obserwacja cech klienta, a nie samego klienta, jest tu niezwykle istotna. Mianowicie danego klienta mamy dokładnie jednego, natomiast klientów o tych samych / podobnych cechach (np. miejsce zamieszkania, wiek, itp.) możemy posiadać wielu, co dalej umożliwia wnioskowanie indukcyjne, a w wyniku otrzymanie upragnionego modelu 🙂 .
Segment wysokiej skłonności
Typowo mniejszość klientów charakteryzuje się „wysoką” skłonnością, natomiast „średnia” i „niska” skłonność jest przypisywana do znacznie większej części bazy. Łatwo to uzasadnić – zazwyczaj w określonym okresie czasu produkt kupuje maksymalnie kilka procent bazy klientów. Jeśli model predykcyjny posiada faktyczną wartość predykcyjną, wysokie prawdopodobieństwo przypisze do relatywnie niewielkiej części klientów. Idąc dalej – im lepszy model, tym segment o wysokiej skłonności jest mniejszy i bliższy rozmiarem do oszacowania pochodzącego ze średniej sprzedaży mierzonej dla całej analizowanej bazy klientów (tzw. oszacowanie a-priori).
Punkt odcięcia (cut-off point)
Zadaniem punktu odcięcia jest stworzenie na bazie ciągłej zmiennej odpowiedzi (np. szacowanego prawdopodobieństwa) segmentów (klas) – dla uproszczenia załóżmy, że dwóch (jeden punkt odcięcia). Oznaczmy przez $p_0 \in [0;1]$ punkt rozgraniczający segment wysokiej skłonności od segmentów średniej i niskiej skłonności. Jeśli szacowane prawdopodobieństwo $p(1|x_i) \geq p_0$ klientowi $x_i$ przypiszemy klasę pozytywną „1”, w przeciwnym wypadku klientowi przypisujemy klasę negatywną „0”.
W powyższy sposób z „ciągłego” modelu predykcyjnego otrzymaliśmy klasyfikator binarny – co, w zestawieniu z faktycznymi zdarzeniami zakupu, umożliwia utworzenie macierzy błędu i wyznaczenie wszystkich istotnych miar oceny jakości dokonanej klasyfikacji.
Ale jak dobrać punkt odcięcia? O tym w następnej części 🙂
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury
Matematyka i muzyka są ściśle powiązane przez rytm, harmonię i struktury, które wykorzystują matematyczne wzory i proporcje do tworzenia estetycznych i emocjonalnych doznań. Z nieśmiałą ekscytacją przedstawiam moją pierwszą poważniejszą kompozycję, w której starałem się uchwycić te połączenia.
Scalar – zaawansowana aplikacja mobilna z silnikiem matematycznym mojego autorstwa
Skalar - kalkulator, funkcje, wykresy i skrypty - Made in Poland
Skalar to potężny silnik matematyczny i matematyczny język skryptowy, który zbudowany jest na bazie MathParser.org-mXparser
Kliknij na wideo i zobacz Skalara w akcji 🙂
Scalar Lite – wersja lite
Scalar Pro – wersja profesjonalna
Kontynuując przeglądanie strony, wyrażasz zgodę na używanie przez nas plików cookies. więcej informacji
Aby zapewnić Tobie najwyższy poziom realizacji usługi, opcje ciasteczek na tej stronie są ustawione na "zezwalaj na pliki cookies". Kontynuując przeglądanie strony bez zmiany ustawień lub klikając przycisk "Akceptuję" zgadzasz się na ich wykorzystanie.