У меня есть две величины a & b, которые определяются рекурсией и посредством ссылки на другой список значений x = [x_1, x_2, ... x_N], который будет вводить в программу , Программа будет перебирать все значения х и обновления & б в соответствии с:Стабильное вычисление больших квантов через рекурсию
for n in range(1,N)
a[n] = a[n-1] * exp(+x[n]) + b[n-1] * exp(-x[n])
b[n] = b[n-1] * exp(+x[n]) + a[n-1] * exp(-x[n])
и исходных значений
a[0] = exp(+x[0])
b[0] = exp(-x[0])
Значения в х не большие числа (всегда < 10), но N будет в сотнях, и из-за всех экспонент конечные значения & b будут очень большими. Меня волнует, что из-за формы рекурсии, где мы постоянно умножаем экспоненциально большие числа с экспоненциально малыми и добавляя их, эта схема станет довольно численно неустойчивой.
В идеале я бы подсчитал log (a) и log (b), чтобы остановить слишком большие значения. Но из-за схемы рекурсии, что это невозможно, если я не вычислять что-то гораздо грязнее, как
log_a[n] = x[n] + log_a[n-1] + log(1 + exp(-2*x[n] + log_b[n-1]-log_a[n-1]))
ли численная устойчивость что-то я права быть обеспокоены здесь? И если бы это было похоже на схему, основанную на журналах, чтобы стабилизировать ее?
Ваше выражение messier может быть улучшено с помощью 'log1p (x) == log (1 + x)', который более численно устойчив – Eric
Я предполагаю, что ваши начальные значения используют 'x [0]', а не ' х [п] '? – Eric
Да, это так. Оно должно быть x [0] в начальных условиях. Спасибо за отзыв о log1p too – RGWinston