[Octave] Program do obróbki matematycznej

Tutaj umieszczamy tematy związane z językami programowania niepasującymi do innych działów.
Regulamin forum
Temat prosimy poprzedzić nazwą języka umieszczonego w nawiasach kwadratowych np. [Pascal].
Awatar użytkownika
gaweł
Geek
Geek
Posty: 1041
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

[Octave] Program do obróbki matematycznej

Postautor: gaweł » wtorek 28 wrz 2021, 23:44

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
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1041
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Octave] Program do obróbki matematycznej

Postautor: gaweł » czwartek 30 wrz 2021, 02:35

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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse

Awatar użytkownika
piotrek
User
User
Posty: 137
Rejestracja: niedziela 05 lis 2017, 02:46

Re: [Octave] Program do obróbki matematycznej

Postautor: piotrek » sobota 02 paź 2021, 10:29

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.

Awatar użytkownika
gaweł
Geek
Geek
Posty: 1041
Rejestracja: wtorek 24 sty 2017, 22:05
Lokalizacja: Białystok

Re: [Octave] Program do obróbki matematycznej

Postautor: gaweł » sobota 02 paź 2021, 21:08

Masz rację, ja na razie poznaję ten pakiet, ale docelowo ma on ogromne znaczenie, ale... na razie nie mogę zdradzić jakie :)

Prawdziwe słowa nie są przyjemne. Przyjemne słowa nie są prawdziwe.
Lao Tse


Wróć do „Inne języki programowania”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 1 gość