Вычисление суммы ряда с заданной точностью

      Комментарии к записи Вычисление суммы ряда с заданной точностью отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Общие вопросы Вычисление суммы ряда с заданной точностью

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 месяц, 3 нед. назад.

  • Автор
    Сообщения
  • #3223

    Вычислить сумму. Суммирование производить до тех пор, пока очередное слагаемое по модулю не станет меньше наперед заданного E (E>0).

    sum_prolog

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

    predicates
      	series_sum(real, real, real)
      	series_sum(real, real, integer, real, real, real, real)

    Если точность меньше нуля, функция должна вывести сообщение ошибки и завершится неудачей, в противном случае вызывается основная функция:

    clauses
      series_sum(_, Eps, _):-
        	Eps <= 0, !, write("Eps must be > 0)"), nl, fail.
      series_sum(X, Eps, Sum):-
      	Mul = 1, Numerator = X*X, Denominator = 2*3,
      	series_sum(X, Eps, 2, Mul, Numerator, Denominator, Sum).

    Вычисления выполняются рекурсивно, при этом на каждом шаге вычисляется новое значение, которое сравнивается с точностью. Если значение стало меньше точности – вычисление останавливается, функция возвращает результат. В противном случае рассчитываются новые значения числителя, знаменателя и множителя, выполняется рекурсивный вызов:

      series_sum(_, Eps, _, Mul, Num, Den, AbsValue):-
      	Value = Mul*Num/Den,
      	AbsValue = abs(Value),
      	AbsValue < Eps, !.
      series_sum(X, Eps, K, Mul, Num, Den, Sum):-
      	Value = Mul*Num/Den,
      	Mul_1 = Mul*(-1), Num_1 = Num*X, Den_1 = Den*(K+1), K_1 = K + 1,
      	series_sum(X, Eps, K_1, Mul_1, Num_1, Den_1, Sum_1),
      	Sum = Value+Sum_1.

    В секции goal запросим значение X и точность, передадим значения нашей функции:

    goal 
      	write("x: "), readreal(X),
      	write("e: "), readreal(Eps), 
      	series_sum(X, Eps, Sum).

    Результаты работы программы:
    sum_prolog_results

Для ответа в этой теме необходимо авторизоваться.