Аппроксимация бесконечной суммы в R

Я вычисляю функцию массы вероятности для счетной переменной, а член нормализации представляет собой бесконечную сумму формы ∑f(n), где сумма проходит по всем неотрицательным целым числам (0-бесконечность). Я ищу функцию в R, которая приближает такую ​​сумму. После некоторых исследований я обнаружил, что классические процедуры являются приближениями, такими как метод Лапласа для сумм или формула сумм Эйлера-Маклорена, но я не могу найти функцию для этого в R. Функция f(n) становится убывающей через некоторое время. n и сходится к 0. Функция

f(n) = exp(an + b*sqrt(n) - ln(n!),

где a и b — некоторые константы.


person gregorp    schedule 07.05.2018    source источник
comment
Вы должны указать f(n).   -  person Christoph    schedule 07.05.2018
comment
Значит, нет функции, которая бы аппроксимировала это для произвольного f(n)? Если мы только знаем, что f(n) сходится к нулю, когда n стремится к бесконечности.   -  person gregorp    schedule 07.05.2018
comment
Можешь написать f(n) в своем посте?   -  person bschneidr    schedule 07.05.2018
comment
Я добавил функцию.   -  person gregorp    schedule 07.05.2018
comment
Вы написали x вместо n, я думаю.   -  person Frank    schedule 07.05.2018
comment
Да, я редактировал его.   -  person gregorp    schedule 07.05.2018
comment
Будьте осторожны: напр. сумма по 1/n расходится.   -  person Christoph    schedule 07.05.2018
comment
Член ln(n!) имеет больший порядок, чем n и sqrt(n), поэтому он должен сходиться. Или я что-то пропустил?   -  person gregorp    schedule 08.05.2018
comment
Вы правы, я просто хотел сказать, что функция f (n) становится убывающей после некоторого n и сходится к 0 только достаточно (таким образом, недостаточно ;-)   -  person Christoph    schedule 09.05.2018
comment
Хорошо, я понял, что вы имели в виду, спасибо.   -  person gregorp    schedule 10.05.2018


Ответы (1)


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

#Define the function
f <- function(x){ 1/(x**2)}

# First check on a segment
lower = 0.5
upper = 2
sum(f(seq(lower, upper, by=0.0001)))
# [1] 15002.13

# Integrate
integrate(f, lower, upper)
# 1.5 with absolute error < 3.8e-09

# For upper boundary to be infinity:
lower = 0.5
upper = Inf
integrate(f, lower, upper)
# 2 with absolute error < 8.4e-11

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

sum(f(1:(2^25)))
# [1] 1.644934

sum(f(1:(2^26))) # Check how much the value changes for even longer vector
# [1] 1.644934

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

f(n) = exp(an + b*sqrt(n) - ln(n!))

В этой функции есть член ln(n!), который R будет очень трудно оценить, так как ему нужно будет вычислить N! на очень большое количество. Таким образом, лучший подход для этого конкретного случая — найти верхнюю и нижнюю граничные функции и использовать их для аппроксимации.

person Katia    schedule 07.05.2018
comment
Но это применимо только к очень маленьким фрагментам (который становится интегралом Римана, если размер фрагментов приближается к 0). В моем случае сумма превышает неотрицательные целые числа. - person gregorp; 07.05.2018
comment
Я вижу, что я был недостаточно ясен и написал неотрицательные числа вместо целых чисел, прошу прощения. - person gregorp; 07.05.2018
comment
Так что вы предлагаете, чтобы я урезал сумму? Как в сумме только к какому-то очень высокому n? Простое усечение не годится, потому что это член нормализации, и если я усекаю, то суммы вероятностей будут больше 1. Может быть, я мог бы найти непрерывную функцию как верхнюю границу выше некоторого n, а затем аппроксимировать ее. - person gregorp; 07.05.2018
comment
Да, мое предложение с транскрипцией суммы только приблизит сумму. Я не знаю каких-либо пакетов, которые выполняли бы суммирование целых чисел, поэтому подход к поиску верхнего и нижнего пределов для ваших функций будет лучшим подходом... - person Katia; 07.05.2018
comment
Кроме того, вы можете исправить определение своей функции - вы использовали в f (n), но затем используете x внутри функции. - person Katia; 07.05.2018