Отсутствие в .NET важных тригонометрических функций: заполняем пробелы

от автора

.NET включает базовые тригонометрические функции (sin, cos, tan, asin, acos, atan) и их гиперболические аналоги (sinh, cosh, tanh, asinh, acosh, atanh) в классе Math. Однако в .NET отсутствуют следующие тригонометрические функции:

  • Sec (секанс)

  • Csc (косеканс)

  • Cot (котангенс)

  • Asec (обратный секанс)

  • Acsc (обратный косеканс)

  • Acot (обратный котангенс)

  • Sech (гиперболический секанс)

  • Csch (гиперболический косеканс)

  • Coth (гиперболический котангенс)

  • Asech (обратный гиперболический секанс)

  • Acsch (обратный гиперболический косеканс)

  • Acoth (обратный гиперболический котангенс)

Это упущение может быть неудобным для разработчиков, особенно тех, кто работает в таких областях, как компьютерная графика, обработка сигналов и научные вычисления, где важны точные тригонометрические расчеты.

Например, в компьютерной графике функция арккотангенса часто используется для вычисления углов при вращении и отражении объектов. Без прямой реализации разработчикам приходится выводить её с использованием других функций, что может приводить к неэффективности и потенциальным ошибкам, как показано ниже.

Я считаю, что современный язык программирования, предназначенный для решения научных задач, должен предлагать полный набор математических инструментов для облегчения точных и эффективных вычислений. Чтобы заполнить пробелы в математических функциях .NET, я разработал библиотеку, включающую недостающие тригонометрические функции, назвав ее MathTrigonometric. Вы можете найти библиотеку и её документацию на GitHub.

Зачем использовать эту библиотеку?

  1. Функция арккотангенса (arccot)

Функция арккотангенса является одной из наиболее спорных тригонометрических функций из-за её двойных графических представлений. Оба графика математически правильны, но один из них предпочтительнее из-за согласованности и ясности.

Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2).

Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2).

С математической точки зрения, функция арккотангенса arccot(x) обычно определяется как угол, чей котангенс равен x. Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2), так как он сохраняет согласованность с другими обратными тригонометрическими функциями. Вот реализация функции arccot с использованием существующей функции ‘Math.Atan’ в C#:

public static double Acot(double d) {     if (Math.Abs(d) < double.Epsilon)         return Math.PI / 2.0;      return Math.Atan(1.0 / d); }

Эта реализация не учитывает правильный диапазон функции арккотангенса, что приводит к неточным результатам для отрицательных входных значений. Вот правильная реализация, применяющая свойство симметрии arccot(−x) = π − arccot(x) для отрицательных входных значений:

public static double Acot(double d) {     if (Math.Abs(d) < double.Epsilon)         return Math.PI / 2.0;      //the Trigonometric Symmetry is applied: arccot(−x) = π − arccot(x)     if (IsNegative(d))         return Math.PI - Math.Atan(1 / -d);      return Math.Atan(1.0 / d); } 

Математики предпочитают правильную реализацию, так как она придерживается стандартного диапазона (0, π), обеспечивая согласованность и избегая неоднозначностей в расчетах.

  1. Повышение точности

Функция обратного гиперболического косеканса определяется как:

Arcsch(x) = ln[1/x + √(1/(x^2) + 1)]

При вычислении этой функции для двух противоположных входных значений, таких как -0.1E-7 и 0.1E-7, получаем 19.1138 для x = 0.1E-7 и -∞ для x = -0.1E-7.

Для значений, близких к нулю, относительная ошибка (т.е. ошибка относительно фактического значения) может быть значительной. Это связано с тем, что расстояние между представимыми числами с плавающей запятой не является равномерным. По мере приближения чисел к нулю расстояние между ними уменьшается в абсолютных величинах, но увеличивается в относительных, что приводит к заметным ошибкам при выполнении арифметических операций или математических функций, таких как логарифмы.

Чтобы уменьшить эти ошибки, можно использовать свойство симметрии функции обратного гиперболического косеканса: arcsch(−x) = −arcsch(x). Применяя это свойство для отрицательных входных значений, можно избежать вычислений значений, близких к нулю, и тем самым повысить точность результатов.

Пример:

public static double Acsch(double x) {     if (Math.Abs(x) < double.Epsilon)         return double.NaN;      //the Trigonometric Symmetry is applied: arcsch(−x)=−arcsch(x)     if (IsNegative(x))         return -Math.Log(1.0 / -x + Math.Sqrt(1.0 / Math.Pow(x, 2.0) + 1.0));      return Math.Log(1.0 / x + Math.Sqrt(1.0 / Math.Pow(x, 2.0) + 1.0)); }
  1. Обеспечение диапазонов входных и выходных значений

Тригонометрические функции часто требуют специфических диапазонов входных значений для получения допустимых результатов. Например, функция обратного гиперболического секанса arsech(x) принимает значения только в диапазоне (0, 1]. При реализации пользовательских тригонометрических функций важно проверять диапазоны входных значений, чтобы предотвратить ошибки выполнения и обеспечить точные вычисления.

Пример:

public static double Asech(double x) {     if (x is < double.Epsilon or > 1.0)         return double.NaN;      return Math.Log(1.0 / x + Math.Sqrt(1.0 / Math.Pow(x, 2.0) - 1.0)); }

Заключение

Включение недостающих тригонометрических функций имеет важное значение для полноты современного языка программирования, такого как .NET. Как разработчикам, нам необходимо учитывать точность, диапазон и симметрию при реализации этих функций. Моя библиотека нацелена на заполнение этих пробелов и предоставление надежных реализаций для научных вычислений.

Чтобы установить библиотеку, используйте следующую команду в консоли NuGet Package Manager:

Install-Package MathTrigonometric

Я также работаю над библиотекой .NET для быстрого вычисления сложных научных математических формул, что значительно улучшит возможности C#. Вы можете поддержать мои усилия, став спонсором на GitHub. Ваши взносы помогут развитию open-source и улучшению инструментов, доступных для сообщества.

Спасибо! Пожалуйста, оставляйте идеи в комментариях!


ссылка на оригинал статьи https://habr.com/ru/articles/822741/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *