Чому в арифметиці з плаваючою комою чому числова неточність є результатом додавання невеликого терміна до різниці великих термінів?


13

Я читав книгу " Комп'ютерне моделювання рідин " Аллена та Тільдеслі. Починаючи з сторінки 71, автори обговорюють різні алгоритми, які використовуються для інтеграції рівнянь руху Ньютона в моделювання молекулярної динаміки (МД). Починаючи з сторінки 78, автори обговорюють алгоритм Верле, який, можливо, є алгоритмом канонічної інтеграції в MD. Вони заявляють:

Мабуть, найбільш широко застосовуваний метод інтеграції рівнянь руху - це той, який спочатку був прийнятий Верлетом (1967) і приписувався Стормеру (Gear 1971). Цей метод є прямим рішенням рівняння другого порядку . Метод заснований на положеннях r ( t ) , прискореннях a ( t ) та позиціях r ( t - δ t ) з попереднього кроку. Рівняння просування позицій виглядає наступним чином:mir¨i=fir(t)a(t)r(tδt)

(3.14)r(t+δt)=2r(t)r(tδt)+δt2a(t).

Про рівняння (3.14) слід зазначити кілька моментів. Видно, що швидкості взагалі не з’являються. Вони були усунені додаванням рівнянь, отриманих розширенням Тейлора про :r(t)

r(t+δt)=r(t)+δtv(t)+(1/2)δt2a(t)+...

(3.15)r(tδt)=r(t)δtv(t)+(1/2)δt2a(t)....

Потім, пізніше (на стор. 80), автори констатують:

O(δt2)O(δt0)

δt2a(t)2r(t)r(tδt)

Моє запитання: чому числова неточність є результатом додавання невеликого терміна до різниці великих термінів?

Мене цікавить досить основна, концептуальна причина, оскільки я зовсім не знайомий з деталями арифметики з плаваючою комою. Крім того, чи знаєте ви будь-які посилання на "оглядовий тип" (книги, статті чи веб-сайти), які б познайомили мене з основними ідеями арифметики з плаваючою комою, пов'язаними з цим питанням? Дякую за ваш час.

Відповіді:


9

Їхнє спостереження "" форма алгоритму може непотрібно ввести чисельну точність "" є правильним. Але їх пояснення «» Це відбувається тому, що в рівнянні (3,14), недовгий термін ( ) додають до різниці великих членів ( ), для того , щоб сформувати траєкторію. '' є хибним.O(δt2)O(δt0)

Істинною причиною незначної чисельної нестабільності алгоритму Верле є те, що він лише незначно стабільний, оскільки рівняння різниці (по суті, випадок, коли ви нехтуєте в Verlet) має паразитарний розчин, пропорційний , що призводить до того , що введені помилки лінійно зростають у тоді як для повністю стабільного багатоступеневого методу, застосовуваного до дисипативного диференціального рівняння, зростання помилок обмежується.xk+1=2xkxk1akk

Змінити: Зверніть увагу , що книга про чисельному моделюванні молекулярної динаміки, і для отримання розумної точності отриманих очікувань потрібні величезне число кроків, як точність шкали з тільки . (Часто крок часу знаходиться в пікосекундах, щоб слідкувати за внутрішньою шкалою коливань. Але біологічно відповідні шкали часу знаходяться в мілісекундах або більше ( ), хоча зазвичай ніхто не обчислює так далеко.)NO(N1/2)N109

Докладніші відомості див. У розділі http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence


10

Якщо ви шукаєте гарного вступу, я б запропонував Девіду Голдбергу те, що повинен знати кожен вчений-комп’ютер про арифметику з плаваючою точкою . Це може бути занадто детально, але він доступний в Інтернеті безкоштовно.

Якщо у вас є хороша бібліотека, я б запропонував числові обчислення Майкла Овертона з арифметикою з плаваючою точкою IEEE або перші кілька глав Точності та стабільності чисельних алгоритмів Ніка Хігхема .

Що конкретно мають на увазі Аллен та Тільдеслі, це числове скасування . Короткі його в тому , що якщо у вас є, скажімо, тільки три цифри і відняти 100з 101, ви отримаєте 1.00(в трьох цифр). Число схоже на три цифри, але насправді лише перша цифра - це і .00сміття. Чому? Ну, 100і 101це лише неточні уявлення про, скажімо, 100.12345і 101.4321, але ви можете зберігати їх лише як трицифрові числа.


-1: Де скасування, яке ви відносите до формули Верле? Зазвичай невелика, що робить , без скасування. Спробуйте ! δtr(\tδt)r(t)r(t)=1
Арнольд Ноймаєр

@ArnoldNeumaier: Так, приклад Аллена та Тільдеслі, мабуть, не має особливого сенсу, я хотів лише надати деякі посилання на проблеми, що виникають, коли "невеликий термін [..] додається до різниці великих термінів", ось що ОП запитала, чи не є це проблемою в даному випадку.
Педро

Але додавання невеликого терміна до великого терміна - це лише помилка округлення, взагалі нічого небезпечного. Скасування - це коли дві майже однакові великі доданки віднімаються, щоб отримати крихітний термін. Це стає проблемою лише тоді, коли або відняті проміжні продукти є значно більшими, ніж кінцевий результат обчислення, або коли малий проміжний результат, який впливає на скасування, розділений на інший невеликий елемент.
Арнольд Ноймаєр

@ArnoldNeumaier: Оскільки, я думаю, це досить очевидно з моєї відповіді, я мав на увазі проблему обчислення різниці, а не суми.
Педро

1
@ArnoldNeumaier: Точка прийнята, але я сподіваюся, ви зрозуміли, що я вважаю це досить дріб'язком за "-1".
Педро

5

Щоб застосувати приклад Педро до рівняння , припустимо, що ваші змінні зберігаються із такими значеннями:(3.14)

r ( t - δ t ) = 100 δ t 2 a ( t ) = 1,49

r(t)=101
r(tδt)=100
δt2a(t)=1.49

З випливає це(3.14)

r(t+δt)=103.49

але, оскільки ми можемо використовувати лише три цифри, результат стає усіченим

r(t+δt)=103

Ця помилка пошириться, так що після 20 кроків, якщо залишиться незмінним, ви отримаєте замість ,r ( t + 20 δ t ) = 331 433,90a(t)r(t+20δt)=331433.90


Але ефект такий великий лише в трицифровій десятковій арифметиці.
Арнольд Ноймаєр

3

Педро вже наводить важливий факт, а саме скасування. Справа в тому, що кожне число, з яким ви обчислюєтеся, має пов’язану точність; наприклад, одне точне число з плаваючою точкою може представляти лише речі з точністю приблизно до 8 цифр. Якщо у вас є два числа, які майже однакові, але відрізняються від 7-ї цифри, то різниця знову буде 8-розрядним одноточним номером з плаваючою точкою і виглядає так, що це 8-цифрова точність, але насправді лише перша 1 або 2 цифри є точними, оскільки величини, з яких ви їх обчислили, не є точними за цією першою або двома цифрами різниці.

Зараз ви цитуєте книгу з 1989 року. Тоді найчастіше обчислення проводилися в одній точності, а округлення та скасування - серйозні проблеми. Сьогодні більшість обчислень проводиться з подвійною точністю з 16-ти цифрною точністю, і це набагато менше проблем, ніж раніше. Я думаю, що варто прочитати параграфи, які ви цитуєте, із зерном солі та приймати їх у контексті свого часу.


скасування в арифметиці подвійної точності може бути настільки ж великою проблемою, як і в одній точності. Справжній випадок - усунення Гаусса без повороту, що часто дає дуже погані результати через скасування, навіть у подвійній точності.
Арнольд Ноймаєр

-1: Формула Верле зазвичай зберігає всі цифри точності, а не лише 1 або 2 з 8 в одній точності.
Арнольд Ноймаєр

@ArnoldNeumaier: Звичайно, ви можете отримати однакові проблеми в подвійній точності. Все, що я сказав, - це те, що з ними стикаються не так часто.
Вольфганг Бангерт

Якщо ви втратите 6 цифр три рази в ланцюзі обчислень, ви втратили всі цифри навіть у подвійній точності. Алгоритми, які страждають від скасування, зазвичай будуть поганими навіть у подвійній точності. Алгоритм Верлета відрізняється тим, що немає скасування, а м'якого лінійного зростання помилок. Таким чином, втрата точності не може примножуватися, що робить її придатною для набагато довших часів інтеграції. Це, безумовно, було відомо Allen & Tildesley.
Арнольд Ноймаєр

Правильно. Але я маю на увазі те, що якщо у вас є алгоритм без скасування, ви все одно маєте помилку на порядок 1e-8 в одній точності, і якщо ви зробите кроки 1e8, то у вас можуть виникнути проблеми, навіть якщо все інше точно. Час 1e8 - це порядок, який ви можете мати для ODE. З іншого боку, у подвійній точності ваша неточність на кожному кроці становить 1е-16, і для отримання повної втрати точності знадобиться 1е16 часових кроків. Це ряд кроків, з якими ви не зіткнетесь на практиці.
Вольфганг Бангерт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.