Strona 1 z 1

[Octave] Program do obróbki matematycznej

: wtorek 28 wrz 2021, 23:44
autor: gaweł
Octave – program do obróbki matematycznej

tit.png


Całkiem przypadkiem natrafiłem na ciekawy program do ogólnie pojętej obróbki matematycznej. Jak się później okazało, jest to program klasy MatLab z tym, że jest to program bezpłatny (niekomercyjny). Jak to bardzo często się odbywa, szukając czegoś znajdujemy coś całkiem innego, które przy bliższym zapoznaniu się staje się ciekawym i godnym uwagi. Tak i było w tym przypadku. Poszukiwałem algorytmów związanych z obrotami i rzutami w przestrzeni 3-wymiarowej i tak całkiem „przypadkiem” googiel wynalazł mi prelekcję omawiającą właśnie ten program. No i mnie wcięło...
Instalka jest do pobrania tu:https://www.gnu.org/software/octave/download.
Wspomniana wyżej pogadanka na temat programu Octave to:https://www.youtube.com/watch?v=2KEbWrtKBLI (trochę długie, ale warte obejrzenia, bo prezentowane koncepcje to po prostu kosmos).
Sama instalacja jest bezbolesna (tylko deko trwa). Co warte jest zaznaczenia, wraz z instalką jest „ogromny” manual (ponad 1000 stron do poczytania). Jak na razie, to jedynie dotknąłem czubka góry lodowej, a możliwości (i nadziei na fajną zabawę) jest cały ogrom.
Rzecz jasna, na początek zawsze jest coś prostego, a później w miarę jedzenia apetyt rośnie (no i program za tym nadąża). Te proste, to zaczerpnięte wprost z załączonej dokumentacji:

Kod: Zaznacz cały

subplot (2, 1, 1)
fplot (@sin, [-2*pi, 4*pi]);
subplot (2, 1, 2)
fplot (@cos, [-2*pi, 4*pi]);

Przykład jest wręcz trywialny, ale pokazuje prostotę działań w celu uzyskania zamierzonego efektu.
cur01.png

Skoro tak łatwo jest uzyskać przebieg funkcji, to może coś bardzie fajnego. Padło na drgania gasnące. No więc wystarczy:

Kod: Zaznacz cały

clear all ;
close all ;
clc ;
x = linspace ( 0 , 4 * pi , 500 ) ;
for i=1 : 500
 y ( i ) = exp ( - 0.4 * x ( i ) ) * sin ( 5 * x ( i ) ) ;
end ;
plot(x, y);
grid on;

cur02.png

Całkiem przypadkiem mi wyszło, że krzywą płaską można sobie pooglądać z różnych stron, czego całkiem się nie spodziewałem.
cur03.png

Jak wspomniałem już wcześniej coś na temat apetytu, to... (cytując Pawlaka z „Kochaj albo rzuć”: nadeszła wiekopomna chwila na… powierzchnie w przestrzeni). Tak trochę musiałem się podrapać po głowie, by wymyślić jakąś fajną powierzchnię. Stanęło na czymś takim:
form.png

W zapisie dla Octave to:

Kod: Zaznacz cały

clear all;
close all;
clc;

N = 101;
x = linspace(-5, 5, N);
y = linspace(-5, 5, N);
[XX, YY] = meshgrid(x, y);
for i=1:N
  for j=1:N
    ZZ(i,j)=10*exp(-0.5*sqrt(x(i)^2 + y(j)^2))*cos(4*sqrt(x(i)^2 + y(j)^2));
  end
end;
surf(XX, YY, ZZ);

No więc „ten koń” zaprzęgnięty do pracy daje następujący wynik:
cur04.png

Rzecz jasna, można sobie to poobracać:
cur05.png

popatrzeć na to prawie z góry:
cur06.png

popatrzeć na to praktycznie z boku:
cur07.png

i zajrzeć od spodu:
cur08.png

Tak całkiem przypadkiem odkryłem (to znaczy program to miał, a odkryłem przypadkiem), że tą powierzchnię można sobie przesunąć do krawędzi i to co „wychodzi” poza jest obcinane. Powstaje coś na kształt przekroju i tu całkiem fajnie widać, że to jest gasnący przebieg fali. W tym przypadku jest to cosinus.
cur09.png

Jak zamienić funkcję cos na sin, to zamiast „piku do nieba” na środku, jest dziurka (jak „przekroić” przez środek, to widać):
cur10.png

cur11.png

Re: [Octave] Program do obróbki matematycznej

: czwartek 30 wrz 2021, 02:35
autor: gaweł
Liczby zespolone w Octave

Tak pomyślałem sobie, że taka obrabiarka powinna dysponować liczbami zespolonymi. Okazuje się, że to prawda, można całkiem sprawnie obrabiać te niezwykłe liczby. No więc krótki kawałek programu:

Kod: Zaznacz cały

clear all;
close all;
clc;

N = 151;
rep = linspace(-5, 2, N);
imp = linspace(-20, 20, N);
[ret, imt] = meshgrid(rep, imp);
for i=1:N
  for j=1:N
    z=complex(rep(i),imp(j));
    zm(i,j)=real(exp(z));
  end
end;
surf(rep, imp, zm);

Jak łatwo zorientować się, będzie obrabiana funkcja wykładnicza dla zespolonego argumentu, co daje zespoloną wartość. Tu powstaje odwieczny problem związany z wizualizacją, brakuje wymiarów (przydałaby się przestrzeń 4-wymiarowa). No cóż, jest jak jest, więc na początek: część rzeczywista wyniku. By nie mieć kłopotów z interpretacją, część rzeczywista jest z zakresu -5 .. 2 oraz część urojona jest z zakresu -20 .. 20. Obrazek jest następujący:
cur21.png

Drobna modyfikacja w kodzie i mamy do pokazania część urojoną wyniku:

Kod: Zaznacz cały

clear all;
close all;
clc;

N = 151;
rep = linspace(-5, 2, N);
imp = linspace(-20, 20, N);
[ret, imt] = meshgrid(rep, imp);
for i=1:N
  for j=1:N
    z=complex(rep(i),imp(j));
    zm(i,j)=imag(exp(z));
  end
end;
surf(rep, imp, zm);

cur22.png

lub z innej perspektywy:
cur23.png

no i wartość bezwzględna wyniku:

Kod: Zaznacz cały

clear all;
close all;
clc;

N = 151;
rep = linspace(-5, 2, N);
imp = linspace(-20, 20, N);
[ret, imt] = meshgrid(rep, imp);
for i=1:N
  for j=1:N
    z=complex(rep(i),imp(j));
    zm(i,j)=abs(exp(z));
  end
end;
surf(rep, imp, zm);

i obrazek prezentujący wynik rachunków:
cur24.png

i widoczek z boku:
cur25.png

No i tak coś mnie tknęło. Intuicyjne coś mi tu nie bardzo pasuje. Skoro jest zakres na osi od -20...20, to należy mniemać, że jest to widok na oś urojoną, natomiast kształt raczej odpowiada innej perspektywie. Niby powinno być OK, ale coś nie styka i nie bardzo wiem co?
Drogą różnych eksperymentów doszedłem do „prawdy” – zamieniłem miejscami indeksy w macierzy wynikowej:

Kod: Zaznacz cały

clear all;
close all;
clc;

N = 151;
rep = linspace(-5, 2, N);
imp = linspace(-20, 20, N);
[ret, imt] = meshgrid(rep, imp);
for i=1:N
  for j=1:N
    z=complex(rep(i),imp(j));
    zm(j,i)=abs(exp(z));
  end
end;
surf(rep, imp, zm);

cur26.png

No i ten wynik już do mnie przemawia. Patrząc na oś -5...2 jest coś, co nie generuje we mnie wewnętrznego sprzeciwu. Więc powtarzając poprzednie rachunki mamy: część rzeczywista i urojona:
cur27.png

cur28.png

No obrazki nieznacznie się różnią: jak sin i cos i to się zgadza z moim wyobrażeniem wyniesionym z wykładów mamty na polibudzie. Ciekawy wniosek można z tego wysnuć: funkcja exp jest okresowa (z okresem urojonym, ale okresowa), o czym nie wiedziałem. No cóż zawsze można dowiedzieć się czegoś nowego.
Niemniej nadal nie rozumiem, dlaczego tak wyszło (ta zamiana indeksów). Może należy wyciągnąć kolejny wniosek: nie zbadane są drogi, jakimi chadzają bity w komputerze, bo słowo daję, nie rozumiem dlaczego tak wyszło.

Re: [Octave] Program do obróbki matematycznej

: sobota 02 paź 2021, 10:29
autor: piotrek
Używanie pakietu Octave do rysowania wykresów to jak z armatą na wróble ;) do tego celu wystarczy gnuplot.
Jest też inny pakiet open source o podobnym jak Octave zastosowaniu noszący nazwę R. Różnią się między sobą składnią języka programowania.

Re: [Octave] Program do obróbki matematycznej

: sobota 02 paź 2021, 21:08
autor: gaweł
Masz rację, ja na razie poznaję ten pakiet, ale docelowo ma on ogromne znaczenie, ale... na razie nie mogę zdradzić jakie :)

Re: [Octave] Program do obróbki matematycznej

: poniedziałek 01 lis 2021, 19:19
autor: PROTON
Octave wykorzystywałem w kursie ML, w tym: https://www.coursera.org/learn/machine-learning
R używa moja żona, to jest jakaś masakra składnia tego języka, pisany przez naukowców wszystko robi się inaczej jak w innych językach programowania.