Ответ в теме: Ряд Тейлора — arccos/arcsin на Prolog

      Комментарии к записи Ответ в теме: Ряд Тейлора — arccos/arcsin на Prolog отключены
#2389

Арккосинус вычисляется через арксинус:

pi(3.14).

arccos(X, ArcCos, Eps):-
  arcsin(X, ArcSin, Eps),
  pi(Pi), 
  ArcCos is Pi/2 - ArcSin.

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

calc_tailor_element(N, Fact2N, FactN, Pow4N, X2N, Element):-
  Element is Fact2N * X2N / (Pow4N * FactN * FactN * (2*N+1)).
  
calc_tailor_param(X, N, Fact2N, FactN, Pow4N, X2N, N1, Fact2N1, FactN1, Pow4N1, X2N1):-
  N1 is N + 1,
  Fact2N1 is Fact2N * N1*2 * (N1*2 - 1),
  FactN1 is FactN * N1,
  Pow4N1 is Pow4N * 4,
  X2N1 is X2N * X * X.

Арксинус вычисляется через ряд Тейлора, при этом вычисления надо продолжать до тех пор, пока очередной член ряда не превысит заданной точности. Если точность не достигнута, нужно вычислить значение очередного члена ряда, параметры следующего члена и запустить их рекурсивную обработку. Полученное при рекурсивном вызове значение следует прибавить к текущему члену ряда, т.к. ряд тейлора задается суммой:

arcsinTailor(_X, N, Fact2N, FactN, Pow4N, X2N, ArcSin, Eps):-
  calc_tailor_element(N, Fact2N, FactN, Pow4N, X2N, ArcSin),
  ArcSin < Eps, !.
arcsinTailor(X, N, Fact2N, FactN, Pow4N, X2N, ArcSin, Eps):-
  calc_tailor_element(N, Fact2N, FactN, Pow4N, X2N, Element),
  calc_tailor_param(X, N, Fact2N, FactN, Pow4N, X2N, N1, Fact2N1, FactN1, Pow4N1, X2N1),
  arcsinTailor(X, N1, Fact2N1, FactN1, Pow4N1, X2N1, NextElement, Eps),
  ArcSin is Element + NextElement.

Вложения: