Задачи с плавающей запятой в асимптотических функциях, приближающихся к нулю-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 (...)) вообще.

[1] http://maxima.sourceforge.net