Cách tính toán số lượng góc ổn định giữa các vectơ


13

Khi áp dụng công thức cổ điển cho góc giữa hai vectơ:

α=arccosv1v2v1v2

người ta thấy rằng, đối với các góc rất nhỏ / cấp tính, có sự mất độ chính xác và kết quả là không chính xác. Như đã giải thích trong câu trả lời Stack Overflow này , một giải pháp là sử dụng arctangent thay thế:

α=arctan2(v1×v2,v1v2)

Và điều này thực sự cho kết quả tốt hơn. Tuy nhiên, tôi tự hỏi nếu điều này sẽ cho kết quả xấu cho các góc rất gần với . Có phải vậy không? Nếu vậy, có công thức nào để tính toán chính xác các góc mà không kiểm tra dung sai bên trong một nhánh không?π/2if


1
Điều này sẽ phụ thuộc vào việc thực hiện hai hàm tiếp tuyến nghịch đảo tham số. Các phiên bản chậm, ổn định chuyển đổi điều kiện giữa làm việc với x / y và y / x để duy trì độ chính xác, trong khi các phiên bản nhanh chỉ gắn mọi thứ vào góc phần tư bên phải và do đó không chính xác hơn phiên bản một tham số.
origimbo

Bạn nên xác định "mất độ chính xác": giả sử câu trả lời đúng là và thay vào đó bạn nhận được . Bạn cần hay là đủ? αα+ΔΔ«αΔ«π
Stefano M

Trong trường hợp này, câu trả lời đúng là và tôi đã nhận được , cả hai . alpha 10 8 « 1αα1081
astrojuanlu

Câu trả lời:


18

( Tôi đã thử nghiệm phương pháp này trước đây và tôi nhớ nó hoạt động chính xác, nhưng tôi chưa thử nghiệm cụ thể cho câu hỏi này. )

Theo như tôi có thể nói, cả hai v 1v 2 có thể bị hủy thảm khốc nếu họ đang gần như song song / vuông góc-atan2 không thể cung cấp cho bạn độ chính xác tốt nếu một trong hai đầu vào là tắt.v1×v2v1v2

Bắt đầu bằng cách định dạng lại bài toán khi tìm góc của một tam giác có độ dài cạnh , b = | v 2 | c = | v 1 - v 2 | (tất cả đều được tính toán chính xác trong số học dấu phẩy động). Có một biến thể nổi tiếng trong công thức của Heron do Kahan ( Vùng tính toán và góc của tam giác giống như kim ), cho phép bạn tính diện tích và góc (giữa aba=|v1|b=|v2|c=|v1v2|ab) của một tam giác được chỉ định bởi độ dài cạnh của nó và thực hiện ổn định bằng số. Bởi vì việc giảm đối với bài toán con này cũng chính xác, cách tiếp cận này sẽ hoạt động cho các đầu vào tùy ý.

Trích dẫn từ giấy (xem p.3), giả sử , μ = { c - ( một - b ) , nếu  b c 0 , b - ( một - c ) , nếu  c > b 0 , không hợp lệ tam giác , nếu không a n g l e = 2 arctan ( ab

μ={c(ab),if bc0,b(ac),if c>b0,invalid triangle,otherwise
Tất cả các dấu ngoặc đơn ở đây được đặt cẩn thận, và chúng quan trọng; nếu bạn thấy mình lấy căn bậc hai của một số âm, thì độ dài cạnh đầu vào không phải là độ dài cạnh của một hình tam giác.
angle=2arctan(((ab)+c)μ(a+(b+c))((ac)+b))

Có một lời giải thích về cách thức hoạt động của nó, bao gồm các ví dụ về các giá trị mà các công thức khác không thành công, trong bài báo của Kahan. Công thức đầu tiên của bạn cho C trên trang 4.αC

Lý do chính tôi đề xuất công thức Heron của Kahan là bởi vì nó tạo ra rất nhiều câu hỏi hình học phẳng có khả năng rất khó có thể giảm xuống để tìm diện tích / góc của một tam giác tùy ý, vì vậy nếu bạn có thể giảm vấn đề của mình sang đó, thì có một công thức ổn định tốt đẹp cho nó, và không cần phải tự mình nghĩ ra thứ gì.

v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2ϵϵnhập mô tả hình ảnh ở đây


Cảm ơn các liên kết và câu trả lời! Thật không may, công thức thứ hai tôi đã viết không xuất hiện trong bài viết. Mặt khác, phương pháp này có thể hơi phức tạp, vì nó yêu cầu chiếu ở dạng 2D.
astrojuanlu

2
@astrojuanlu Không có phép chiếu nào cho 2d ở đây: bất kể hai vectơ 3d là gì, chúng xác định một tam giác (phẳng) giữa chúng. Bạn chỉ cần biết độ dài cạnh của nó.
Kirill

Bạn nói đúng, nhận xét của tôi không có ý nghĩa. Tôi đã suy nghĩ trong tọa độ thay vì độ dài. Cảm ơn một lần nữa!
astrojuanlu

2
@astrojuanlu Một điều nữa tôi muốn lưu ý: dường như có một bằng chứng chính thức rằng công thức tính diện tích là chính xác trong Cách tính diện tích tam giác: Sylvie Boldo , sử dụng Flocq.
Kirill

cc<ϵmin(a,b)(v1v2)

7

Câu trả lời hiệu quả cho câu hỏi này là, không quá ngạc nhiên, trong một ghi chú khác của Velvel Kahan :

α=2arctan(v1v1+v2v2,v1v1v2v2)

arctan(x,y)(x,y)

(Tôi đã đưa ra một Mathematica cuộc biểu tình của công thức Kahan của ở đây .)


arctan2

1
arctan(x,y)ATAN2(Y, X)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.