벡터 사이에서 계산 각도를 수치 적으로 안정적으로 계산


14

두 벡터 사이의 각도에 대한 고전적인 공식을 적용 할 때 :

α=arccosv1v2v1v2

매우 작거나 예각 인 경우 정밀도가 떨어지고 결과가 정확하지 않다는 것을 알 수 있습니다. 이 스택 오버플로 답변에 설명 된 것처럼 한 가지 해결책은 대신 아크 탄젠트를 사용하는 것입니다.

α=arctan2(v1×v2,v1v2)

그리고 이것은 실제로 더 나은 결과를 제공합니다. 그러나 이것이 \ pi / 2에 아주 가까운 각도에 나쁜 결과를 줄지 궁금합니다 π/2. 그런가요? 그렇다면 if분기 내부의 공차를 확인하지 않고 각도를 정확하게 계산하는 공식이 있습니까?


1
이것은 두 매개 변수 역 탄젠트 함수의 구현에 달려 있습니다. 느리고 안정적인 버전은 x / y와 y / x로 작업하는 것 사이에서 조건을 전환하여 정밀도를 유지하는 반면, 빠른 버전은 올바른 사분면에 물건을 붙이기 때문에 하나의 파라미터 버전보다 더 정확하지 않습니다.
origimbo

"정확도의 손실"을 정의해야합니다. 정답이 이고 가 있다고 가정합니다 . 당신은 필요로 하는가 또는 충분하다? αα+ΔΔαΔπ
Stefano M

이 경우 정답은 이고 , 둘 다 입니다. αα1081
astrojuanlu

답변:


18

( 이 방법을 이전에 테스트했지만 올바르게 작동했지만이 질문에 대해 구체적으로 테스트하지는 않았습니다. )

지금까지 내가 말할 수있는, 모두 와 그들은 거의 평행하는 경우 중 하나를 입력이 꺼져있는 경우 / 수직 - ATAN2 당신에게 좋은 정확성을 제공 할 수없는 치명적인 취소 고생 할 수 있습니다.v1×v2v1v2

측면 길이가 삼각형의 각도를 찾음으로써 문제를 재구성하는 것으로 시작하십시오. ,및(이들은 모두 부동 소수점 산술로 정확하게 계산됩니다). 잘 알려진 변형있다 헤론의 공식 인해 Kahan (로 잘못 계산 영역과 바늘 형상의 각도 삼각형 는 (사이의 영역 및 각도를 산출 할 수 있도록), 와 의 측면 길이에 의해 특정 된 삼각형)을, 수치 적으로 안정적으로 수행하십시오. 이 하위 문제의 감소도 정확하기 때문에이 방법은 임의의 입력에 적합합니다.a=|v1|b=|v2|c=|v1v2|ab

가정 (P.3 참조) 즉 종이 인용 , 여기에있는 모든 괄호는주의해서 배치되며 중요합니다. 음수의 제곱근을 취하면 입력 측 길이는 삼각형의 측 길이가 아닙니다.ab

μ={c(ab),if bc0,b(ac),if c>b0,invalid triangle,otherwise
angle=2arctan(((ab)+c)μ(a+(b+c))((ac)+b))

Kahan의 논문에는 다른 수식이 실패하는 값의 예를 포함하여 이것이 어떻게 작동하는지에 대한 설명이 있습니다. 에 대한 귀하의 첫 번째 공식 있다 4 페이지.αC

Kahan 's Heron의 공식을 제안하는 주된 이유는 매우 멋진 기본 요소를 만들기 때문입니다. 잠재적으로 까다로운 평면 형상 질문을 임의의 삼각형의 면적 / 각도를 찾는 것으로 줄일 수 있기 때문에 문제를 줄일 수 있다면 그것에 대한 좋은 안정된 공식이며, 스스로 무언가를 생각 해낼 필요가 없습니다.

편집 Stefano의 의견에 따라 , ( code )에 대한 상대 오류 플롯을 작성했습니다 . 두 줄은 및 , 대한 상대 오류 가 가로 축을 따라 이동하는 것입니다. 작동하는 것 같습니다. v1=(1,0)v2=(cosθ,sinθ)θ=ϵθ=π/2ϵϵ여기에 이미지 설명을 입력하십시오


링크와 답변에 감사드립니다! 불행히도 내가 쓴 두 번째 공식은 기사에 나타나지 않습니다. 반면에이 방법은 2D 투영이 필요하므로 약간 복잡 할 수 있습니다.
astrojuanlu

2
@astrojuanlu 여기에 2d 로의 투영은 없습니다 : 두 3D 벡터가 무엇이든, 그것들은 그들 사이에 하나의 (평면) 삼각형을 정의합니다 – 당신은 그것의 측면 길이 만 알면됩니다.
Kirill

당신 말이 맞아, 내 의견은 말이되지 않습니다. 나는 길이 대신 좌표를 생각하고있었습니다. 다시 감사합니다!
astrojuanlu

2
@astrojuanlu 한 가지 더 주목해야 할 점 은 삼각형의 면적을 계산하는 방법 에서 공식 공식이 정확하다는 공식적인 증거가있는 것 같습니다 : 공식적인 방문 , Sylvie Boldo , Flocq 사용.
Kirill

훌륭한 대답이지만 부동 소수점 산술에서 항상 정확하게 를 계산할 수 있다고 논쟁합니다 . 실제로 이면 의 구성 요소를 계산할 때 치명적인 취소가 발생합니다 . cc<ϵmin(a,b)(v1v2)
Stefano M

7

이 질문에 대한 효율적인 답변은 Velvel Kahan의 또 다른 메모 에서 너무 놀랍지 않습니다 .

α=2arctan(v1v1+v2v2,v1v1v2v2)

여기서 를 가로 축과 의 각도로 사용합니다. 일부 언어에서는 인수 순서를 바꿔야 할 수도 있습니다.arctan(x,y)(x,y)

(나는 Kahan의 공식에 대한 Mathematica 데모를 여기에 주었다 .)


의미 합니까? arctan2
astrojuanlu

1
나는 두 개의 인수 아크 탄젠트를 로 묘사하는 데 익숙합니다 . FORTRAN과 같은 언어에서는 이에 해당합니다 . arctan(x,y)ATAN2(Y, X)
JM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.