Strona 1 z 1

Wyprowadź wzór na kąt theta

: 30 cze 2022, o 11:58
autor: polak7
Mam dany układ trzech równań:

\(\displaystyle{
\begin{cases} x=\cos\theta \cdot \sin\phi\\ y=\cos\phi\\ z=\sin\theta \cdot \sin\phi\end{cases}
}\)


Muszę z tego otrzymać wzór na kąt \(\displaystyle{ \theta}\). Zrobiłem to, ale obliczając kąt \(\displaystyle{ \theta}\) z otrzymanego wzoru nie dostaję poprawnego wyniku. Proszę o sprawdzenie czy moje wyprowadzenie wzoru jest poprawne:

Najpierw wyprowadzam wzór na \(\displaystyle{ \phi}\) z drugiego równania:
\(\displaystyle{ \phi=\arccos y}\)

Powyższy wzór jest poprawny, bo daje mi dobre wyniki. Następnie próbuję wyprowadzić wzór na \(\displaystyle{ \theta}\) zaczynając od przekształcenia trzeciego równania:

\(\displaystyle{ \sin\theta= \frac{z}{\sin\phi} }\)
\(\displaystyle{ \theta=\arcsin\left( \frac{z}{\sin\phi} \right) }\)
\(\displaystyle{ \theta=\arcsin\left( \frac{z}{\sin\left( \arccos y\right) } \right) }\)

Gdy obliczam kąt \(\displaystyle{ \theta}\) z powyższego wzoru, to nie otrzymuję poprawnego wyniku. Czy coś jest nie tak z wyprowadzeniem wzoru?

Re: Wyprowadź wzór na kąt theta

: 30 cze 2022, o 12:07
autor: a4karo
A skąd wiesz, że wynik jest nieprawidłowy?

A gdybyś po prostu podzielił trzecie równanie przez pierwsze? (Oczywiście szczegóły są do dopracowania)

Re: Wyprowadź wzór na kąt theta

: 30 cze 2022, o 12:27
autor: polak7
Skąd wiem, że wynik jest nieprawidłowy?

Załóżmy, że mam następujące wartości kątów:
\(\displaystyle{ \phi = 2.3561945}\)
\(\displaystyle{ \theta=3.1415925}\)

Obliczmy na ich podstawie x, y, z:
\(\displaystyle{ x=-0.707107}\)
\(\displaystyle{ y=-0.707107}\)
\(\displaystyle{ z=0.000000}\)

Teraz z wyprowadzonych wzorów obliczmy z powrotem kąty:
\(\displaystyle{ \phi=\arccos(-0.707107) = 2.356195}\)
\(\displaystyle{ \theta=\arcsin\left( \frac{0.000000}{\sin\left( \arccos(-0.707107)\right) } \right)=0.000000 }\)

Wyszedł inny kąt \(\displaystyle{ \theta}\) niż był na początku. Kąt \(\displaystyle{ \phi}\) jest taki sam.

Re: Wyprowadź wzór na kąt theta

: 30 cze 2022, o 12:50
autor: Jan Kraszewski
No cóż, równoważność

\(\displaystyle{ x=\sin\theta \iff \theta=\arcsin x}\)

jest prawdziwa tylko dla \(\displaystyle{ \theta\in\left[ -\frac{\pi}{2},\frac{\pi}{2}\right]... }\)

JK

edit: poprawa kąta.

Re: Wyprowadź wzór na kąt theta

: 30 cze 2022, o 15:35
autor: polak7
Dziękuję. Faktycznie, dla tego zakresu dostaję poprawne wyniki.

Przekształciłem również pierwsze z równań w następujący sposób:
\(\displaystyle{ x=\cos\theta \cdot \sin\phi}\)
\(\displaystyle{ \cos\theta= \frac{x}{\sin\phi} }\)
\(\displaystyle{ \theta=\arccos\left( \frac{x}{\sin\phi} \right) }\)
\(\displaystyle{ \theta=\arccos\left( \frac{x}{\sin\left( \arccos y\right) } \right) }\)

Korzystając z powyższego równania otrzymuję poprawne wyniki w zakresie \(\displaystyle{ (0: \pi]}\).

W jaki sposób wyprowadzić wzór, aby otrzymać prawidłowe wyniki dla zakresu do \(\displaystyle{ 2\pi}\) (może być od \(\displaystyle{ \pi}\) do \(\displaystyle{ 2\pi}\))?

Re: Wyprowadź wzór na kąt theta

: 30 cze 2022, o 21:19
autor: Jan Kraszewski
Wzory redukcyjne.

JK

Re: Wyprowadź wzór na kąt theta

: 1 lip 2022, o 12:13
autor: polak7
Dziękuję. Potrzebuję równania dla zakresu \(\displaystyle{ \left[ 0 : 2\pi\right] }\), czyli mamy tak:

- dla zakresu \(\displaystyle{ [0 : \frac{\pi}{2}) }\) (niestety dla \(\displaystyle{ \frac{\pi}{2} }\) nie działa):
\(\displaystyle{ \theta=\arcsin\left( \frac{z}{\sin(\arccos y)} \right) }\)

- dla zakresu \(\displaystyle{ ( \frac{\pi}{2} : \frac{3\pi}{2}) }\) (znów nie działa dla granicznych wartości):
\(\displaystyle{ \theta=\pi-\arcsin\left( \frac{z}{\sin(\arccos y)} \right) }\)

- dla zakresu \(\displaystyle{ ( \frac{3\pi}{2} : 2\pi] }\) (niestety dla \(\displaystyle{ \frac{3\pi}{2} }\) nie działa):
\(\displaystyle{ \theta=2\pi+\arcsin\left( \frac{z}{\sin(\arccos y)} \right) }\)

Brakuje mi jeszcze dwóch rzeczy:
1) Powyższe wzory nie działają dla granicznych wartości, takich jak: \(\displaystyle{ \frac{\pi}{2}, \frac{3\pi}{2} }\). Co zrobić, aby działały?
2) Powyższe wzory nie działają, gdy \(\displaystyle{ \phi}\) przyjmuje wartość 0 (mamy wtedy dzielenie przez zero: \(\displaystyle{ \sin\theta= \frac{z}{\sin\phi} }\)). Jednakże, mogę obliczyć x, y i z dla \(\displaystyle{ \phi}\) równego 0, więc w drugą stronę też w jakiś sposób powinno udać się uzyskać kąt \(\displaystyle{ \theta}\) na podstawie x, y, z.

Re: Wyprowadź wzór na kąt theta

: 1 lip 2022, o 15:17
autor: Dasio11
Jeśli potrzebujesz tych wzorów do jakiegoś programu, to sprawdź czy w języku nie ma funkcji atan2, bo wtedy wystarczy wzór:

\(\displaystyle{ \theta = \operatorname{\text{atan2}} \left( \frac{z}{\sqrt{x^2+z^2}}, \frac{x}{\sqrt{x^2+z^2}} \right)}\)

(przy założeniu że \(\displaystyle{ \sin \phi > 0}\)).

Re: Wyprowadź wzór na kąt theta

: 1 lip 2022, o 20:26
autor: polak7
Dasio, dzięki za odpowiedź. Takie wykorzystanie funkcji atan2 nie daje niestety prawidłowych wyników dla całego zakresu.

Re: Wyprowadź wzór na kąt theta

: 3 lip 2022, o 22:08
autor: Niepokonana
A nie można po prostu skorzystać z jedynki trygonometrycznej dla igreka i potem podstawić?

Re: Wyprowadź wzór na kąt theta

: 9 lip 2022, o 13:56
autor: polak7
Niepokonana pisze: 3 lip 2022, o 22:08 A nie można po prostu skorzystać z jedynki trygonometrycznej dla igreka i potem podstawić?
Nie wiem, co by to dało. Potrzebuję wzory dla konkretnych zakresów kąta theta.

Mam jeszcze jeden problem. Otóż, dla pewnego zakresu kąta theta (zakres w pobliżu kąta \(\displaystyle{ \frac{3}{2}\pi }\)) obliczenia nie działają, mimo - wydawałoby się - użycia poprawnych wzorów.
Poniżej rysunek przedstawiający rozkład jednorodny wielu punktów na górnej części sfery:
2022_07_09-13_40_42.png
2022_07_09-13_40_42.png (41.54 KiB) Przejrzano 461 razy
Widać, że w okolicy kąta 270 stopni jest ciemniejsze pole - tam wzory dla części punktów zwracają błąd.

Jednym z takich punktów jest punkt o współrzędnych (pozostałe z nich mają zbliżone współrzędne):
x = 0.00187002
y = 0.99929
z = -0.03776

Wszystkie z wypisanych przeze mnie wzorów zwracają błąd, gdy podstawimy do nich powyższe wartości. Wynika on z tego, że we wzorze pojawia się \(\displaystyle{ \arccos}\) liczby mniejszej (niewiele) od -1. Przykładowo, weźmy wzór:

\(\displaystyle{ \phi=2\pi+\arcsin\left( \frac{z}{\sin(\arccos(y))} \right) }\)

Podstawiamy:
\(\displaystyle{ \phi=2\pi+\arcsin\left( \frac{-0.03776}{\sin\left( \arccos(0.99929)\right) } \right) }\)
\(\displaystyle{ \phi=2\pi+\arcsin\left( \frac{-0.03776}{\sin(0.037685117289918)} \right) }\)
\(\displaystyle{ \phi=2\pi+\arcsin\left( \frac{-0.03776}{0.0376761980565976} \right) }\)
\(\displaystyle{ \phi=2\pi+\arcsin(-1.00222426751437) }\)

Powyższe generuje błąd. Jak sobie z tym poradzić?

Re: Wyprowadź wzór na kąt theta

: 9 lip 2022, o 16:49
autor: Dasio11
Problem wynika stąd, że podane liczby nie spełniają \(\displaystyle{ x^2+y^2+z^2=1}\), tj. ten punkt nie leży na sferze jednostkowej. Podany wcześniej przeze mnie wzór:

$$\theta = \operatorname{\text{atan2}} \left( \frac{z}{\sqrt{x^2+z^2}}, \frac{x}{\sqrt{x^2+z^2}} \right)$$

jest odporny na tę sytuację, więc tym bardziej będę zalecał jego użycie. Jeśli potrzebujesz by kąt należał do przedziału \(\displaystyle{ \theta \in [0, 2\pi)}\) zamiast \(\displaystyle{ (-\pi, \pi]}\), wystarczy go odpowiednio przesunąć:

$$\theta_0 = \operatorname{\text{atan2}} \left( \frac{z}{\sqrt{x^2+z^2}}, \frac{x}{\sqrt{x^2+z^2}} \right) \qquad \qquad
\theta = \begin{cases} \theta_0 & \text{jeśli } \theta_0 \ge 0 \\ \theta_0 + 2 \pi & \text{jeśli } \theta_0 < 0 \end{cases}$$

Rzecz w tym, że aby odzyskać kąt punktu o podanych współrzędnych nie da się uniknąć rozważania kilku nieładnych przypadków. Dlatego twórcy bibliotek standardowych swojego czasu namęczyli się umieszczając te przypadki w środku funkcji \(\displaystyle{ \operatorname{\text{atan2}}}\), właśnie po to by dostarczyć zwykłym programistom jednej, eleganckiej funkcji która robi dokładnie to, czego potrzebują.

Re: Wyprowadź wzór na kąt theta

: 9 lip 2022, o 18:29
autor: polak7
Dasio, bardzo dziękuję. Atan2 jednak działa. Wcześniej nie przesunąłem przedziału, a nie miałem wtedy jeszcze dostępu do wizualizacji, żeby wychwycić, że działał dla przedziału do \(\displaystyle{ \pi}\).