Zaloguj się
Blog na Matlablog
Forum polskich użytkowników
 
UŻYTKOWNICY GRUPY PROFIL Zaloguj się, by sprawdzić wiadomości FAQ
 



Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Octave - konstrukcja siatki
Forum MATLAB Strona Główna-> Klony Matlaba (Scilab, Octave, ...)
Post Wysłany: 13 Listopada 2017, Pon 4:56 pm Temat postu: Octave - konstrukcja siatki Odpowiedz z cytatem
 
AUTOR:
k95n
Początki pisania


Dołączył: 13 Lis 2017
Posty: 6


Ogląda profil użytkownika Wyślij prywatną wiadomość
Witam,
Postanowiłem podszkolić się trochę w Octave, gdzie realizuję takie o to zadanie:
Mam pewne wzory, za pomocą których przeliczam długość i szerokość geograficzną na współrzędne prostokątne płaskie:



Gdzie:
To samo zadanie rozwiązałem sobie w excelu, który podaję za przykład:


I teraz o co mi chodzi:

Chciałbym, żeby w Octave podać macierz (lub zapisać to w innej postaci), która zawierałaby szerokość geograficzną ([tex]\phi[/tex]), o skoku 20 stopni w przedziale od 0 do 80, a następnie przeliczyć to do radianów, żeby móc obliczać sobie sinusy,cosiunusy itd. co rozwiązałem w ten sposób:
Kod:
fi_stopnie=0:20:80
fi
=deg2rad(fi_stopnie)


Analogicznie z długością geograficzną, tyle że w przedziale od -160 do 180:
Kod:
lambda_stopnie=-160:20:180
lambda
=deg2rad(lambda_stopnie)


I teraz pojawia się problem z dalszymi obliczeniami, jak wykonać podstawienie do wzoru na obliczenie x,y, żeby dla pierwszej wartości (fi) z macierzy (w przykładzie z excela o wartości równej 0), program wziął każdy element macierzy lambda czyli sparował to w ten sposób:

0 z macierzy fi z -160 z macierzy lambda
0 z macierzy fi z -140 z macierzy lambda
0 z macierzy fi z -120 z macierzy lambda
...
0 z macierzy fi z 180 z macierzy lambda

Czego przykład widoczny jest na screenie powyżej, a następnie obliczył dla każdej takiej pary x,y ze wzorów podanych na początku?

MoĹźe jest na to inny sposĂłb niĹź zapisanie tego w macierzy?
Generalnie efekt takiego skryptu ma być taki, że podaję przedział fi oraz skok, przedział lambda oraz skok,a program oblicza x,y tak jak w przykładzie z excela?
Te obliczone x,y będą współrzędnymi punktów węzłowych siatki, co w rezultacie da taki efekt rozmieszczenia punktów:


Z góry dziękuję za pomoc. W razie niejasności chętnie dopowiem Wink


 

Post Wysłany: 13 Listopada 2017, Pon 6:33 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
k95n
Początki pisania


Dołączył: 13 Lis 2017
Posty: 6


Ogląda profil użytkownika Wyślij prywatną wiadomość
EDIT: W dużym uproszczeniu potrzebuję komendy, która pozwoli mi posiadając np. taką macierz A:
A=
Kod:
20
40
60
80


wymnożyć każdy element macierzy A przez każdy kolejny element macierzy B
B=
Kod:
0
15
30
40
60
75
90


czyli: 20 x 0, 20 x 15, 20 x 30 itd.
potem zrobi to samo z drugim elementem macierzy A: 40 x 0, 40 x 15, 40 x 30, 50, x 45 itd.

i zwróci mi wynik w postaci jednej macierzy o wymiarze 1 kolumny i liczbie wierszy równej liczbie wierszy większej macierzy.


 

Post Wysłany: 13 Listopada 2017, Pon 9:31 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
mc2
Może pisać książki


Dołączył: 19 Maj 2009
Posty: 2241


Ogląda profil użytkownika Wyślij prywatną wiadomość Odwiedź stronę autora
Profesjonalnie zadane pytanie Smile

Potrzebujesz komendy meshgrid:
https://octave.sourceforge.io/octave/function/meshgrid.html

Aby uzyskać wynik jakiego potrzebujesz:
Kod:
[fi_stopnie, lambda_stopnie] =meshgrid(0:20:80,-160:20:180);
fi_stopnie = fi_stopnie(:);
lambda_stopnie = lambda_stopnie(:);
disp([fi_stopnie, lambda_stopnie])


Więcej o operatorze : (dwukropek) tu:
https://www.gnu.org/software/octave/doc/v4.2.1/Index-Expressions.html

A w ramach ciekawostki, wynik z drugiego postu możesz uzyskać za pomocą iloczynu Kroneckera:
https://octave.sourceforge.io/octave/function/kron.html
Kod:
A = 20:20:80;
B = 0:15:90;
kron(A,B')
 

Post Wysłany: 13 Listopada 2017, Pon 11:27 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
k95n
Początki pisania


Dołączył: 13 Lis 2017
Posty: 6


Ogląda profil użytkownika Wyślij prywatną wiadomość
Super, dziękuję za odpowiedź. Na pewno przyda mi się na przyszłość.
Poradziłem sobie w trochę inny sposób, aczkolwiek efekt ten sam:
Kod:
fi2=input('Podaj zakres szerokosci od 0 do 90 (wartosc poczatkowa:skok:wartosc koncowa np.  0:10:90):');
lambda2=input('Podaj zakres dlugosci od -180 do 180: (wartosc poczatkowa:skok:wartosc koncowa np. -180:20:180):');
R=6378;
fi_s2=input('Podaj wartosc fi s:');
fi_s=deg2rad(fi_s2);

fi=deg2rad(fi2);
lambda=deg2rad(lambda2);

ro=[R*sin(fi_s)*cot(fi)];

c=[cos(lambda)];
C=ro'*c;
Ct=C'
;
 
round(x=Ct( : ));
disp(round(x))
 


q=[sin(lambda)];
Q=ro'*q;
Qt=Q'
;
 
round(y=Qt( : ));
disp(round(y))
 
 
plot(x,y,'-x')
 
xlabel('Wspolrzedna prostokatna "y"')
 
ylabel('Wspolrzedna prostokatna "x"')
 
title('Siatka kartograficzna')


Uzyskałem dokładnie to co chciałem, mam jednak jeszcze mały problem z rysunkiem, po wygenerowaniu rysunku mam coś takiego:


A chciałbym coś takiego:



Jak połączyć odpowiednie punkty? Da się coś takiego w ogóle zrobić?

Pomijam już opisy oczywiście, chyba, że da się zrobić.


 

Post Wysłany: 15 Listopada 2017, Sro 9:14 pm Temat postu: Odpowiedz z cytatem
 
AUTOR:
mc2
Może pisać książki


Dołączył: 19 Maj 2009
Posty: 2241


Ogląda profil użytkownika Wyślij prywatną wiadomość Odwiedź stronę autora
Może wykorzystaj gotowe narzędzie:
https://octave.sourceforge.io/octave/function/polar.html
Kod:
clf;
[
fi_stopnie, lambda_stopnie] =meshgrid(-180:20:180, 0:10:90);
fi = deg2rad(fi_stopnie);
lambda = deg2rad(lambda_stopnie);

polar (fi',lambda');
 

Forum MATLAB Strona Główna-> Klony Matlaba (Scilab, Octave, ...)
Wyświetl posty z ostatnich:   

Napisz nowy temat     Odpowiedz do tematu Zobacz poprzedni temat :: Zobacz następny temat

Wszystkie czasy w strefie CET (Europa)

Skocz do:  

Statystyki forum:



Od dnia 08.06.2006 forum odwiedzano 39896997
Najwięcej użytkowników 266 było obecnych 19 Lutego 2015, Czw 7:03 pm

Aktualnie online:




Najnowsze posty na forum:
Once Upon a Time (Dawno, Dawno Temu) S07E10 online napisy PL  (15 Grudnia 2017, Pią 12:07 am)
Blindspot: Mapa zbrodni S03E07 online PL napisy 3x07 CDA  (15 Grudnia 2017, Pią 12:05 am)
Agenci T.A.R.C.Z.Y. S05E04 online PL napisy 5x04 CDA Zalukaj  (15 Grudnia 2017, Pią 12:03 am)
Egzorcysta (The Exorcist) S02E10 online PL napisy 2x10 CDA  (15 Grudnia 2017, Pią 12:01 am)
Hawaii 5.0 (Hawaii Five-0) S08E11 online PL napisy 8x11 CDA  (14 Grudnia 2017, Czw 11:59 pm)
Hawaii 5.0 (Hawaii Five-0) S08E10 online PL napisy 8x10 CDA  (14 Grudnia 2017, Czw 11:58 pm)
Z Nation [S04E13] online PL napisy 4x13 CDA Zalukaj  (14 Grudnia 2017, Czw 11:53 pm)
Z Nation [S04E12] online PL napisy 4x12 CDA Zalukaj  (14 Grudnia 2017, Czw 11:52 pm)
Rodzinka.pl [S11E17] online (Sezon 11 Odcinek 17) CDA  (14 Grudnia 2017, Czw 11:50 pm)
Gomorra [S03E10] online PL napisy 3x10 CDA Zalukaj  (14 Grudnia 2017, Czw 11:46 pm)
Twoje prawa:
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Nie możesz ściągać plików na tym forum