IPB

> ArcSin (функция) (пример программы)
Форум
Загрузка...
 
Час быка
Час быка
Карта Интернета
Internet Map
Яндекс.Метрика

Y = ArcSin(X)

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

Sqr(Sin(X)) + Sqr(Cos(X)) = 1

Затем, поделив синус на косинус, находим тангенс искомого угла, а затем, используя стандартную функцию арктангенса, и сам угол, который и будет искомым значением ArcSin(X).

ArcSin1.png

Борьба с погрешностью

С точки зрения математики, все действия проделаны корректно, кроме случаев X = ±1, приводящих к делению на 0, но и до того, как случится деление на 0, учитывая особенности машинного представления, имеет смысл находить арксинус другим путём, чтобы избегать стремящихся к бесконечности аргументов арктангенса. Разбиваем область определения арксинуса на центр, в котором производятся вычисления по выше приведённым формулам, и края. Разбить можно разными способами, но одно из способов разбиения примечательно тем, что аргументы, с которыми будет вызван ArcTan(X), будут не больше 1.0, что соответствует углу 45°, синус которого Sqrt(2)/2. Для правого края (Sqrt(2)/2 <= X <= 1) найдём арксинус другим способом: наоборот, поделим косинус (полученный по теореме Пифагора) на синус и получим котангенс, затем найдём угол, используя арккотангенс. Стандартной функции арккотангенса в Паскале нет, но арккотангенс очень просто выражается через арктангенс: ArcCot(X) := Pi/2 - ArcTan(X). Для левого края всё аналогично.

ArcSin2.png

ArcCot(X) + ArcTan(X) = Pi/2

Реализация

program MyArcSin;

function ArcSin(X: Real): Real;
begin
 if X <= -1.0 then
   ArcSin := -Pi / 2
 else if X < -Sqrt(2) / 2 then
   ArcSin := -Pi / 2 - ArcTan(Sqrt(1 - Sqr(X)) / X) { левый край }
 else if X <= Sqrt(2) / 2 then
   ArcSin := ArcTan(X / Sqrt(1 - Sqr(X))) { центр }
 else if X < 1.0 then
   ArcSin := Pi / 2 - ArcTan(Sqrt(1 - Sqr(X)) / X) { правый край }
 else
   ArcSin := Pi / 2
end;

begin
 WriteLn(ArcSin(-1.0):0:3, ' ', ArcSin(-0.9):0:3, ' ',
         ArcSin(0.3):0:3, ' ', ArcSin(0.9):0:3, ' ',
         ArcSin(1.0):0:3);
 { -1.571 -1.120 0.305 1.120 1.1571 }
end.

См. также

 
 К началу страницы 
Тэги: ArcSin
 

Код для вставки: :: :: :: ГОСТ ::
Поделиться: //
 


-
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"