Я читал книгу Аллена и Тилдесли « Компьютерное моделирование жидкостей ». Начиная со страницы 71, авторы обсуждают различные алгоритмы, которые используются для интеграции уравнений движения Ньютона в моделирование молекулярной динамики (МД). Начиная со страницы 78, авторы обсуждают алгоритм Верле, который, возможно, является каноническим алгоритмом интегрирования в MD. Они заявляют:
Возможно, наиболее широко используемый метод интегрирования уравнений движения - это метод, первоначально принятый Верле (1967) и приписанный Штормеру (Gear 1971). Этот метод является прямым решением уравнения второго порядка . Метод основан на позициях , ускорениях и позициях из предыдущего шага. Уравнение для продвижения позиций выглядит следующим образом:
Следует отметить несколько моментов, касающихся уравнения (3.14). Будет видно, что скорости не появляются вообще. Они были устранены путем сложения уравнений, полученных разложением Тейлора по :
Затем, позже (на странице 80), авторы утверждают:
Против алгоритма Верле, ... форма алгоритма может излишне вводить некоторую числовую неточность. Это возникает потому , что, в уравнении (3.14), маленький член ( ) добавляют к разности больших членов ( O ( δ т 0 ) ), для того , чтобы генерировать траекторию.
Я полагаю , что «малый термин» является , а «разность больших терминов» является 2 г ( т ) - г ( т - δ т ) .
Мой вопрос: почему численная неточность является результатом добавления маленького термина к разнице больших?
Меня интересует довольно базовая концептуальная причина, поскольку я совсем не знаком с деталями арифметики с плавающей запятой. Кроме того, знаете ли вы какие-либо «обзорные» ссылки (книги, статьи или веб-сайты), которые познакомили бы меня с основными идеями арифметики с плавающей точкой, связанной с этим вопросом? Спасибо за ваше время.
Чтобы применить пример Педро к уравнению( 3.14 ) предположим, что ваши переменные хранятся со следующими значениями:
Из( 3.14 ) это должно следовать за этим
но, поскольку мы можем использовать только три цифры, результат становится усеченным до
This error will propagate, so that after 20 steps, assuminga(t) remains unchanged, you get r(t+20δt)=331 instead of 433.90 ,
источник
Pedro already gives the important fact, namely cancellation. The point is that every number you compute with has an associated accuracy; for example, a single precision floating point number can only represent things up to approximately 8 digits of accuracy. If you have two numbers that are almost exactly the same but differ in the 7th digit, then the difference will again be an 8-digit single precision floating point number and it looks like it is accurate to 8 digits, but in reality only the first 1 or 2 digits are accurate because the quantities you computed it from are not accurate beyond this first 1 or 2 digits of the difference.
Now, the book you cite is from 1989. Back then, computations were most often done in single precision and round-off and cancellation were serious problems. Today, most computations are done using double precision with 16 digits of accuracy, and this is far less a problem today than it used to be. I think it is worthwhile reading the paragraphs you cite with a grain of salt and take them in the context of their time.
источник