.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.
Зачем использовать эту библиотеку?
-
Функция арккотангенса (arccot)
Функция арккотангенса является одной из наиболее спорных тригонометрических функций из-за её двойных графических представлений. Оба графика математически правильны, но один из них предпочтительнее из-за согласованности и ясности.
![Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2). Предпочтительный диапазон для arccot(x) составляет (0, π), а не (−π/2, π/2).](https://habrastorage.org/getpro/habr/upload_files/2db/22b/8db/2db22b8db8427c9d73f83b57ac6cb2af.jpg)
С математической точки зрения, функция арккотангенса 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, π), обеспечивая согласованность и избегая неоднозначностей в расчетах.
-
Повышение точности
Функция обратного гиперболического косеканса определяется как:
При вычислении этой функции для двух противоположных входных значений, таких как -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)); }
-
Обеспечение диапазонов входных и выходных значений
Тригонометрические функции часто требуют специфических диапазонов входных значений для получения допустимых результатов. Например, функция обратного гиперболического секанса 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/
Добавить комментарий