Nói chung, bạn sẽ muốn sử dụng một phương pháp ngầm cho các phương trình parabol (phần khuếch tán) - các sơ đồ rõ ràng cho PDE parabol cần phải có một dấu thời gian rất ngắn để ổn định. Ngược lại, đối với phần hyperbol (khuyến khích) bạn sẽ muốn một phương pháp rõ ràng vì nó rẻ hơn và không phá vỡ tính đối xứng của hệ thống tuyến tính mà bạn phải giải quyết bằng cách sử dụng sơ đồ ngầm để khuếch tán. Trong trường hợp đó, bạn muốn tránh các khác biệt tập trung như và chuyển sang các khác biệt một phía vì lý do ổn định.(uj+1−uj−1)/2Δt(uj−uj−1)/Δt
Tôi khuyên bạn nên xem cuốn sách của Randy Leveque hoặc cuốn sách của Dale Durran để biết "phân tích ổn định von Neumann". Đó là một cách tiếp cận chung để xác định tính ổn định của sơ đồ rời rạc của bạn, miễn là bạn có các điều kiện biên định kỳ. (Cũng có một bài viết wiki tốt ở đây .)
Ý tưởng cơ bản là giả định rằng xấp xỉ rời rạc của bạn có thể được viết một tổng số sóng phẳng , trong đó là số sóng và tần số. Bạn nhồi nhét một làn sóng máy bay vào gần đúng với PDE và cầu nguyện nó sẽ không nổ tung. Chúng ta có thể viết lại sóng phẳng dưới dạng và chúng tôi muốn đảm bảo rằng .ei(kjΔx−ωnΔt)kωξneikjΔx|ξ|≤1
Bằng cách minh họa, hãy xem xét phương trình khuếch tán thông thường với sự khác biệt hoàn toàn ẩn:
un+1j−unjΔt=Dun+1j−1−2un+1j+un+1j+1Δx2
Nếu chúng ta thay thế trong một sóng phẳng, sau đó chia cho và , chúng ta sẽ có phương trìnhξneikjΔx
ξ−1Δt=De−ikΔx−2+eikΔxΔx2ξ
Làm sạch điều này một chút bây giờ và chúng tôi nhận được:
ξ=11+2DΔtΔx2(1−coskΔx) .
Điều này luôn luôn ít hơn một, vì vậy bạn rõ ràng. Hãy thử áp dụng điều này cho sơ đồ trung tâm rõ ràng cho phương trình tiến lên:
un+1j−unjΔt=vunj−1−unj+12Δx
và xem những gì bạn nhận được. (Lần này nó sẽ có một phần tưởng tượng.) Bạn sẽ thấy rằng , đó là thời gian buồn. Do đó tôi khuyên bạn không nên sử dụng nó. Nếu bạn có thể làm điều đó, thì bạn sẽ không gặp nhiều khó khăn khi tìm một sơ đồ ổn định cho phương trình khuếch tán hoàn toàn.ξ|ξ|2>1
Điều đó nói rằng, tôi sẽ sử dụng một sơ đồ hoàn toàn ẩn cho phần khuếch tán. Thay đổi sự khác biệt trong phần tiến lên thành nếu và nếu và chọn dấu thời gian sao cho . (Đây là điều kiện Courant-Friedrichs-Lewy .) Nó chỉ chính xác theo thứ tự đầu tiên, vì vậy bạn có thể muốn tìm kiếm các chương trình phân biệt thứ tự cao hơn nếu điều đó làm bạn lo lắng.uj−uj−1v>0uj−uj+1v<0VΔt/Δx≤1