Задачи с плавающей запятой в асимптотических функциях, приближающихся к нулю-Python
новое для python из MATLAB.
я использую гиперболическое касательное усечение функции масштаба величины. Я сталкиваюсь с моей проблемой при применении
2 ответов
Напомним, что гиперболический тангенс может быть выражен как (1-e^{- 2x})/(1+e^{- 2x}). С помощью немного алгебры мы можем получить, что 0.5 * tanh (x)-0.5(минус вашей функции) равен e^{-2x}/(1+e^{-2x}). Логарифм этого будет -2*x-log(1+exp(-2*x))
, который работал бы и был стабилизирован везде.
то есть, я рекомендую вам заменить:
P1 = [ (0.5*m.tanh( (2.0 - B(rb1,drs1) ) * x / rb1 + B(rb1,drs1) ) + 0.5) for x in r]
P1 = [ -2.5*m.log10(x) if x!=0.0 else np.inf for x in P1 ] # band-aid for problem
С этим более простым и стабильным способом сделать это:
r = np.arange(0.1,100.01,0.01)
#r and xvals are numpy arrays, so numpy functions can be applied in one step
xvals=(2.0 - B(rb1,drs1) ) * r / rb1 + B(rb1,drs1)
P1=2*xvals+np.log1p(np.exp(-2*xvals))
две вещи, которые вы можете попробовать.
(1) подход грубой силы: найдите арифметический пакет с переменной точностью и используйте его вместо встроенной фиксированной точности. Я играю с вашей проблемой в Maxima [1], и я нахожу, что мне нужно увеличить точность поплавка довольно много, чтобы избежать underflow, но это возможно. Я могу отправить код Maxima, если хотите. Я бы предположил, что для Python есть подходящая библиотека float с переменной точностью.
(2) приблизительный журнал ((1/2) (1 + tanh (- x)) с рядом Тейлора или каким-либо другим видом приближения, чтобы избежать журнала (tanh (...)) вообще.