Проблема в том, что при расчете rij2 = np.dot(rij, rij)
в total energy
с использованием постоянных значений вы всегда очень мало.Глядя на выражение внутри журнала, используемое для вычисления FENE, np.log(1-((np.sqrt(rij2) - r0) / R)**2)
, я впервые заметил, что вы берете квадратный корень из rij2
, что не соответствует формуле, которую вы предоставили.
Во-вторых, обратите внимание, что ((rij2 - r0) / R)**2
совпадает с ((r0 - rij2) / R)**2
, так как знак теряется при возведении в квадрат.Поскольку rij2
очень мало (уже в первой итерации - я проверил, печатая значения), это будет более или менее равно ((r0 - 0.05)/R)**2
, что будет числом больше 1. Как только вы вычтете это значение из 1в выражении журнала 1-((np.sqrt(rij2) - r0) / R)**2
будет равно np.nan
(что означает «не число»).Это будет распространяться через все вызовы функций (например, вызов energy_trial = total_energy(coord_trial)
будет эффективно устанавливать energy_trial
в np.nan), пока какая-либо функция не выдаст ошибку.
Может быть, вы могли бы что-то сделать с вызовом np.isnan()
, задокументировано здесь .Кроме того, вы должны проверить, как вы выполняете итерацию coord
(в коде есть некоторые несоответствия) - я предлагаю вам также проверить сообщество проверки кода .