Дан треугольник с известными сторонами a, b и углом между ними gamma. Какие способы нахождения высот и площади треугольника вы предложите и в каких ситуациях каждый способ более устойчив численно
Коротко — формулы и когда их лучше использовать. Данные: стороны a,ba,ba,b и угол между ними γ\gammaγ (угол при вершине, общая для сторон a,ba,ba,b; сторона напротив этого угла — ccc). Основные формулы: - площадь (самая простая и обычно устойчивa) S=12 absinγ.
S=\tfrac12\,a b\sin\gamma. S=21absinγ.
- высоты (через площадь) ha=2Sa=bsinγ,hb=2Sb=asinγ,hc=2Sc=absinγc.
h_a=\frac{2S}{a}=b\sin\gamma,\qquad h_b=\frac{2S}{b}=a\sin\gamma,\qquad h_c=\frac{2S}{c}=\frac{a b\sin\gamma}{c}. ha=a2S=bsinγ,hb=b2S=asinγ,hc=c2S=cabsinγ.
- длина третьей стороны (закон косинусов) c=a2+b2−2abcosγ.
c=\sqrt{a^2+b^2-2ab\cos\gamma}. c=a2+b2−2abcosγ. Устойчивость и альтернативы: - Для площади предпочтителен прямо S=12absinγS=\tfrac12ab\sin\gammaS=21absinγ. Устойчив, когда sinγ\sin\gammasinγ вычисляется точно. При очень маленьких γ\gammaγ площадь мала (потенциально большая относительная погрешность), но формула всё равно численно простая. - Вычисление ccc по формуле с вычитанием может страдать потерей значащих цифр, когда γ\gammaγ очень мала или очень близка к π\piπ и при этом a≈ba\approx ba≈b (тогда под корнем разность больших близких чисел). Более устойчивый эквивалент: c=(a−b)2+4absin2γ2
c=\sqrt{(a-b)^2+4ab\sin^2\frac{\gamma}{2}} c=(a−b)2+4absin22γ
и для наилучшей реализации вычислять через hypot: c=hypot (a−b, 2absinγ2).
c=\operatorname{hypot}\!\left(a-b,\;2\sqrt{ab}\sin\frac{\gamma}{2}\right). c=hypot(a−b,2absin2γ).
Это уменьшает потерю точности при вычитании и работает лучше при малых углах. - Если известны уже все три стороны (или требуется альтернатива), площадь можно получить по Герону: s=12(a+b+c),S=s(s−a)(s−b)(s−c).
s=\tfrac12(a+b+c),\qquad S=\sqrt{s(s-a)(s-b)(s-c)}. s=21(a+b+c),S=s(s−a)(s−b)(s−c).
Heron хорош при «нормальных» треугольниках, но неустойчив для сильно вытянутых (когда один из членов s−a,s−b,s−cs-a,s-b,s-cs−a,s−b,s−c мал). - Вычисление высот: ha=bsinγ, hb=asinγh_a=b\sin\gamma,\ h_b=a\sin\gammaha=bsinγ,hb=asinγ — очень простое и устойчивое (если sinγ\sin\gammasinγ точен). hch_chc удобнее брать как hc=absinγch_c=\dfrac{ab\sin\gamma}{c}hc=cabsinγ при условии, что ccc найден устойчиво (см. устойчивый способ выше). Альтернатива — построить координаты (например вершины в (0,0),(a,0),(bcosγ,bsinγ)(0,0),(a,0),(b\cos\gamma,b\sin\gamma)(0,0),(a,0),(bcosγ,bsinγ)) и взять модуль векторного произведения для площади; это полезно при программной реализации с функцией hypot. Практические рекомендации: - Используйте напрямую S=12absinγS=\tfrac12ab\sin\gammaS=21absinγ и ha=bsinγ, hb=asinγh_a=b\sin\gamma,\ h_b=a\sin\gammaha=bsinγ,hb=asinγ. - Если нужен ccc, применяйте формулу через sin(γ/2)\sin(\gamma/2)sin(γ/2) и hypot при возможной потере точности. - Для очень вытянутых или почти вырожденных треугольников избегайте Герона и формул с большими вычитаниями; используйте выражения через sin(·/2) и масштабирование/ гипотенузу.
Данные: стороны a,ba,ba,b и угол между ними γ\gammaγ (угол при вершине, общая для сторон a,ba,ba,b; сторона напротив этого угла — ccc).
Основные формулы:
- площадь (самая простая и обычно устойчивa)
S=12 absinγ. S=\tfrac12\,a b\sin\gamma.
S=21 absinγ. - высоты (через площадь)
ha=2Sa=bsinγ,hb=2Sb=asinγ,hc=2Sc=absinγc. h_a=\frac{2S}{a}=b\sin\gamma,\qquad
h_b=\frac{2S}{b}=a\sin\gamma,\qquad
h_c=\frac{2S}{c}=\frac{a b\sin\gamma}{c}.
ha =a2S =bsinγ,hb =b2S =asinγ,hc =c2S =cabsinγ . - длина третьей стороны (закон косинусов)
c=a2+b2−2abcosγ. c=\sqrt{a^2+b^2-2ab\cos\gamma}.
c=a2+b2−2abcosγ .
Устойчивость и альтернативы:
- Для площади предпочтителен прямо S=12absinγS=\tfrac12ab\sin\gammaS=21 absinγ. Устойчив, когда sinγ\sin\gammasinγ вычисляется точно. При очень маленьких γ\gammaγ площадь мала (потенциально большая относительная погрешность), но формула всё равно численно простая.
- Вычисление ccc по формуле с вычитанием может страдать потерей значащих цифр, когда γ\gammaγ очень мала или очень близка к π\piπ и при этом a≈ba\approx ba≈b (тогда под корнем разность больших близких чисел). Более устойчивый эквивалент:
c=(a−b)2+4absin2γ2 c=\sqrt{(a-b)^2+4ab\sin^2\frac{\gamma}{2}}
c=(a−b)2+4absin22γ и для наилучшей реализации вычислять через hypot:
c=hypot (a−b, 2absinγ2). c=\operatorname{hypot}\!\left(a-b,\;2\sqrt{ab}\sin\frac{\gamma}{2}\right).
c=hypot(a−b,2ab sin2γ ). Это уменьшает потерю точности при вычитании и работает лучше при малых углах.
- Если известны уже все три стороны (или требуется альтернатива), площадь можно получить по Герону:
s=12(a+b+c),S=s(s−a)(s−b)(s−c). s=\tfrac12(a+b+c),\qquad S=\sqrt{s(s-a)(s-b)(s-c)}.
s=21 (a+b+c),S=s(s−a)(s−b)(s−c) . Heron хорош при «нормальных» треугольниках, но неустойчив для сильно вытянутых (когда один из членов s−a,s−b,s−cs-a,s-b,s-cs−a,s−b,s−c мал).
- Вычисление высот: ha=bsinγ, hb=asinγh_a=b\sin\gamma,\ h_b=a\sin\gammaha =bsinγ, hb =asinγ — очень простое и устойчивое (если sinγ\sin\gammasinγ точен). hch_chc удобнее брать как hc=absinγch_c=\dfrac{ab\sin\gamma}{c}hc =cabsinγ при условии, что ccc найден устойчиво (см. устойчивый способ выше). Альтернатива — построить координаты (например вершины в (0,0),(a,0),(bcosγ,bsinγ)(0,0),(a,0),(b\cos\gamma,b\sin\gamma)(0,0),(a,0),(bcosγ,bsinγ)) и взять модуль векторного произведения для площади; это полезно при программной реализации с функцией hypot.
Практические рекомендации:
- Используйте напрямую S=12absinγS=\tfrac12ab\sin\gammaS=21 absinγ и ha=bsinγ, hb=asinγh_a=b\sin\gamma,\ h_b=a\sin\gammaha =bsinγ, hb =asinγ.
- Если нужен ccc, применяйте формулу через sin(γ/2)\sin(\gamma/2)sin(γ/2) и hypot при возможной потере точности.
- Для очень вытянутых или почти вырожденных треугольников избегайте Герона и формул с большими вычитаниями; используйте выражения через sin(·/2) и масштабирование/ гипотенузу.