Мне нужно вычислить эту формулу:
Это приближение этого интеграла
но это не имеет значения, на самом деле я просто хочу вычислить значение рисунка 1 с помощью PYTHON , это то, что касается темы.
K, альфа и сигма являются фиксированными значениями в пределах одного вычисления, обычно:
- 0 <= k <= 99; </li>
- alpha = 3;
- sigma = 2.
Ниже показано, как я пытаюсь вычислить такое суммирование в python:
import decimal
from scipy.special import binom
def residual_time_mean(alpha, sigma=2, k=1):
prev_prec = decimal.getcontext().prec
D = decimal.Decimal
decimal.getcontext().prec = 128
a = float(alpha)
s = float(sigma)
sum1 = 0.0
sum2 = 0.0
sumD1 = D(0.0)
sumD2 = D(0.0)
for i in range(1, k + 1):
sum1 += binom(k, i) * ((-1) ** (i + 1)) * (s / ((a - 1) * i - 1.0))
sum2 += binom(k, i) * ((-1) ** (i + 1)) * s / ((a - 1) * i - 1.0)
sumD1 += D(binom(k, i)) * (D(-1.0) ** (D(i) + D(1.0))) * (D(s) / ((D(a) - D(1.0)) * D(i) - D(1.0)))
sumD2 += D(binom(k, i)) * (D(-1.0) ** (D(i) + D(1.0))) * D(s) / ((D(a) - D(1.0)) * D(i) - D(1.0))
decimal.getcontext().prec = prev_prec
return sum1, sum2, float(sumD1), float(sumD2)
Запуск
for k in [0, 1, 2, 4, 8, 20, 50, 99]:
print("k={} -> {}".format(k, residual_time_mean(3, 2, k)))
результат:
k=0 -> (0.0, 0.0, 0.0, 0.0)
k=1 -> (2.0, 2.0, 2.0, 2.0)
k=2 -> (3.3333333333333335, 3.3333333333333335, 3.3333333333333335, 3.3333333333333335)
k=4 -> (5.314285714285714, 5.314285714285714, 5.314285714285714, 5.314285714285714)
k=8 -> (8.184304584304588, 8.184304584304583, 8.184304584304584, 8.184304584304584)
k=20 -> (13.952692275798238, 13.952692275795965, 13.95269227579524, 13.95269227579524)
k=50 -> (23.134878809207617, 23.13390225415814, 23.134078892910786, 23.134078892910786)
k=99 -> (265412075330.96634, 179529505602.9507, 17667813427.20196, 17667813427.20196)
Вы можете видеть, что начиная с k=8
результаты отличаются.
Делая умножение перед делением, результаты sum1
и sum2
сильно расходятсянапример, для k = 99.
sum1 += binom(k, i) * ((-1) ** (i + 1)) * (s / ((a - 1) * i - 1.0))
sum2 += binom(k, i) * ((-1) ** (i + 1)) * s / ((a - 1) * i - 1.0)
С десятичной дробью эта проблема не возникает, но результат совсем не корректен.
Вычисление суммирования на WolframAlpha
для k = 99
( Вот ссылка для вычисления на WolframAlpha ).Это дает 33.3159488 (...), в то время как для моей функции python это 17667813427.20196.Я доверяю WolframAlpha, так как он выполняет что-то вроде символьных вычислений, на самом деле он также возвращает реальное значение в виде дроби.
для других k
Проблемы аппроксимации (например, значение, вычисленное Wolfram, отличаетсяиз вычисленного в python на порядок 10 ^ 0 или более) начинается с k ~ = 60.
Кроме того, вычисление интеграла (рисунок 2 ) с scipy.integrate
приводит к аналогичным ошибкам аппроксимации.
Вопрос:
Есть ли у вас какие-либо предложения для обработки этого вычисления?Увеличение десятичной точности не кажется полезным.