Trong số học dấu phẩy động, tại sao sự thiếu chính xác số lại dẫn đến việc thêm một số hạng nhỏ vào một sự khác biệt của các số hạng lớn?


13

Tôi đã đọc cuốn sách Mô phỏng máy tính về chất lỏng của Allen và Tildesley. Bắt đầu từ trang 71, các tác giả thảo luận về các thuật toán khác nhau được sử dụng để tích hợp các phương trình chuyển động của Newton trong mô phỏng động lực học phân tử (MD). Bắt đầu từ trang 78, các tác giả thảo luận về thuật toán Verlet, có lẽ là thuật toán tích hợp chính tắc trong MD. Họ tuyên bố:

Có lẽ phương pháp được sử dụng rộng rãi nhất để tích hợp các phương trình chuyển động là ban đầu được Verlet (1967) áp dụng và được quy cho Stormer (Gear 1971). Phương pháp này là một giải pháp trực tiếp của phương trình bậc hai . Phương pháp này dựa trên các tư thế r ( t ) , gia tốc a ( t ) và các vị trí r ( t - δ t ) từ bước trước. Phương trình để tiến các vị trí đọc như sau:mTôir¨Tôi= =fTôir(t)a(t)r(tδt)

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

Có một số điểm cần lưu ý về eqn (3.14). Nó sẽ được thấy rằng vận tốc hoàn toàn không xuất hiện. Chúng đã được loại bỏ bằng cách thêm các phương trình thu được từ việc mở rộng Taylor về :r(t)

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

(3.15)r(t-δt)= =r(t)-δtv(t)+(1/2)δt2một(t)-....

Sau đó, sau đó (trên trang 80), các tác giả nêu rõ:

Đối với thuật toán Verlet, ... hình thức của thuật toán có thể không cần thiết phải đưa ra một số sai số. Điều này phát sinh bởi vì, trong eqn (3.14), một thuật ngữ nhỏ ( ) được thêm vào một sự khác biệt của các điều khoản lớn ( O ( δ t 0 ) ), để tạo ra quỹ đạo. Ôi(δt2)Ôi(δt0)

Tôi đoán rằng "nhỏ thuật ngữ" là , và "sự khác biệt từ ngữ lớn" là 2 r ( t ) - r ( t - δ t ) .δt2một(t)2r(t)-r(t-δt)

Câu hỏi của tôi là, tại sao sự thiếu chính xác số lại dẫn đến việc thêm một thuật ngữ nhỏ vào sự khác biệt của các điều khoản lớn?

Tôi quan tâm đến một lý do khái niệm khá cơ bản, vì tôi hoàn toàn không quen thuộc với các chi tiết về số học dấu phẩy động. Ngoài ra, bạn có biết bất kỳ tài liệu tham khảo "loại tổng quan" nào (sách, bài viết hoặc trang web) sẽ giới thiệu cho tôi các ý tưởng cơ bản về số học dấu phẩy động liên quan đến câu hỏi này không? Cảm ơn vì đã dành thời gian cho tôi.

Câu trả lời:


9

Quan sát của họ '' hình thức của thuật toán có thể không cần thiết phải đưa ra một số sai số '' là chính xác. Nhưng lời giải thích của họ '' Điều này phát sinh bởi vì, trong eqn (3.14), một thuật ngữ nhỏ ( ) được thêm vào một sự khác biệt của các điều khoản lớn ( O ( δ t 0 ) ), để tạo ra quỹ đạo. '' là giả mạo.Ôi(δt2)Ôi(δt0)

Lý do thực sự cho sự không ổn định về số lượng của thuật toán Verlet là vì nó chỉ ổn định một chút, bởi vì phương trình sai khác (về cơ bản là trường hợp bạn bỏ qua a trong Verlet) có ký sinh giải pháp tỷ lệ với k , gây ra các lỗi được giới thiệu để tăng tuyến tính trong k trong khi đối với phương pháp đa pha hoàn toàn ổn định được áp dụng cho phương trình vi phân tiêu tan, tăng trưởng lỗi bị giới hạn.xk+1= =2xk-xk-1mộtkk

Chỉnh sửa: Lưu ý rằng cuốn sách là về mô phỏng số động lực học phân tử, và để có được một độ chính xác hợp lý của sự mong đợi kết quả người ta cần một số lượng lớn bước, như quy mô chính xác với O ( N - 1 / 2 ) mà thôi. (Thông thường các bước thời gian là trong pico giây theo quy mô dao động nội tại. Nhưng quy mô thời gian có liên quan sinh học đang trong mili giây hoặc lớn hơn ( N ~ 10 9 ), mặc dù thường người ta không tính rằng đến nay.)NÔi(N-1/2)N~109

Để biết thêm chi tiết, xem http://en.wikipedia.org/wiki/Linear_multistep_method#Stability_and_convergence


10

Nếu bạn đang tìm kiếm một lời giới thiệu hay, tôi sẽ gợi ý những điều mà mọi nhà khoa học máy tính nên biết về số học dấu phẩy động của David Goldberg . Nó có thể là một chút quá chi tiết, nhưng nó có sẵn trực tuyến miễn phí.

Nếu bạn có một thư viện tốt, tôi sẽ đề xuất tính toán số của Michael Overton với Số học dấu phẩy động của IEEE , hoặc một vài chương đầu của Độ chính xác và tính ổn định của thuật toán số của Nick Higham .

Điều mà Allen và Tildesley đang đề cập cụ thể là Hủy bỏ số . Ngắn của nó là nếu bạn có, nói rằng, chỉ có ba chữ số và bạn trừ đi 100từ 101, bạn nhận được 1.00(trong ba chữ số). Con số có vẻ chính xác đến ba chữ số, nhưng thực tế, chỉ có chữ số đầu tiên là đúng và dấu .00là rác. Tại sao? Chà, 100101chỉ là những đại diện không chính xác của, nói 100.12345101.4321, nhưng bạn chỉ có thể lưu trữ chúng dưới dạng số có ba chữ số.


-1: Trường hợp hủy mà bạn gán cho công thức Verlet ở đâu? Điển hình là là nhỏ, mà làm cho r ( \ t - δ t ) r ( t ) , không hủy kết quả. Hãy thử r ( t ) = 1 ! δtr(\ t-δt)r(t)r(t)= =1
Arnold Neumaier

@ArnoldNeumaier: Vâng, ví dụ của Allen và Tildesley dường như không có ý nghĩa gì nhiều, tôi chỉ muốn cung cấp một số tài liệu tham khảo cho các vấn đề phát sinh khi "một thuật ngữ nhỏ [..] được thêm vào một sự khác biệt của các điều khoản lớn", đó là những gì OP hỏi, không phải là vấn đề trong trường hợp cụ thể.
Pedro

Nhưng thêm một thuật ngữ nhỏ vào một thuật ngữ lớn chỉ là một lỗi làm tròn, không có gì nguy hiểm cả. Hủy bỏ là khi hai điều khoản lớn gần bằng nhau được trừ đi để có được một điều khoản nhỏ. Điều này chỉ trở thành vấn đề khi các trung gian bị trừ lớn hơn nhiều so với kết quả cuối cùng của một phép tính hoặc khi kết quả trung gian nhỏ bị ảnh hưởng bởi hủy được chia cho một phần tử nhỏ khác.
Arnold Neumaier

@ArnoldNeumaier: Như tôi nghĩ, khá rõ ràng từ câu trả lời của tôi, tôi đã đề cập đến vấn đề tính toán sự khác biệt, không phải là tổng.
Pedro

1
@ArnoldNeumaier: Đã lấy điểm, nhưng tôi hy vọng bạn hiểu rằng tôi cho rằng điều đó khá nhỏ đối với "-1".
Pedro

5

Để áp dụng ví dụ của Pedro cho phương trình , giả sử các biến của bạn được lưu trữ với các giá trị sau:(3.14)

r ( t - δ t ) = 100 δ t 2 một ( t ) = 1.49

r(t)= =101
r(t-δt)= =100
δt2một(t)= =1,49

Từ cần tuân theo điều đó(3.14)

r(t+δt)= =103,49

nhưng, vì chúng ta chỉ có thể sử dụng ba chữ số, kết quả sẽ bị cắt cụt thành

r(t+δt)= =103

một(t)r(t+20δt)= =331433,90


Nhưng hiệu quả là chỉ lớn trong số học thập phân 3 chữ số.
Arnold Neumaier

3

Pedro đã đưa ra một thực tế quan trọng, cụ thể là hủy bỏ. Vấn đề là mọi số bạn tính toán đều có độ chính xác liên quan; ví dụ, một số dấu phẩy động chính xác duy nhất chỉ có thể biểu thị những thứ có độ chính xác tối đa khoảng 8 chữ số. Nếu bạn có hai số gần giống nhau nhưng khác nhau ở chữ số thứ 7, thì sự khác biệt sẽ lại là số dấu phẩy động chính xác 8 chữ số và có vẻ như nó chính xác đến 8 chữ số, nhưng thực tế chỉ là số đầu tiên 1 hoặc 2 chữ số là chính xác vì số lượng bạn đã tính từ đó không chính xác ngoài 1 hoặc 2 chữ số đầu tiên của chênh lệch.

Bây giờ, cuốn sách bạn trích dẫn là từ năm 1989. Trước đó, việc tính toán thường được thực hiện ở độ chính xác duy nhất và hoàn thành và hủy bỏ là những vấn đề nghiêm trọng. Ngày nay, hầu hết các tính toán được thực hiện bằng cách sử dụng độ chính xác kép với độ chính xác 16 chữ số và ngày nay vấn đề này ít hơn nhiều so với trước đây. Tôi nghĩ rằng đáng để đọc những đoạn bạn trích dẫn bằng một hạt muối và đưa chúng vào bối cảnh thời gian của họ.


hủy bỏ trong số học chính xác kép có thể là một vấn đề lớn như trong độ chính xác đơn. Một trường hợp điển hình là loại bỏ Gaussian mà không xoay vòng, thường cho kết quả rất kém do hủy bỏ, thậm chí ở độ chính xác kép.
Arnold Neumaier

-1: Công thức Verlet thường giữ lại tất cả các chữ số của độ chính xác, không chỉ 1 hoặc 2 trên 8 ở độ chính xác đơn.
Arnold Neumaier

@ArnoldNeumaier: Chắc chắn, bạn có thể gặp cùng loại vấn đề với độ chính xác gấp đôi. Tất cả những gì tôi nói là người ta không gặp họ thường xuyên.
Wolfgang Bangerth

Nếu bạn mất 6 chữ số ba lần trong một chuỗi tính toán, bạn đã mất tất cả các chữ số ngay cả với độ chính xác gấp đôi. Các thuật toán bị hủy bỏ thường sẽ kém ngay cả với độ chính xác gấp đôi. Thuật toán của Verlet là khác nhau vì không có sự hủy bỏ mà là sự phát triển tuyến tính nhẹ của các lỗi. Do đó, việc mất độ chính xác không thể nhân lên, làm cho nó phù hợp với thời gian tích hợp lâu hơn nhiều. Điều này chắc chắn đã được biết đến với Allen & Tildesley.
Arnold Neumaier

Đúng. Nhưng điều tôi muốn nói là nếu bạn có thuật toán mà không hủy, bạn vẫn gặp lỗi theo thứ tự 1e-8 với độ chính xác duy nhất và nếu bạn thực hiện các bước thời gian 1e8 thì bạn có thể gặp sự cố ngay cả khi mọi thứ khác chính xác. Các bước thời gian 1e8 là một thứ tự cường độ bạn có thể có cho ODE. Mặt khác, với độ chính xác gấp đôi, độ chính xác của bạn trong mỗi bước là 1e-16 và nó sẽ yêu cầu các bước thời gian 1e16 để mất hoàn toàn độ chính xác. Đó là một số bước mà bạn sẽ không gặp phải trong thực tế.
Wolfgang Bangerth
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.