MathLabs

Toán ứng dụng và Tính toán

Giải số phương trình vi phân

Các phương pháp từng bước như Euler và Runge–Kutta để xấp xỉ nghiệm khi không có công thức chính xác.

Trực giácXấp xỉ một đường cong từng bước nhỏ một

Phần lớn các phương trình vi phân xuất hiện trong vật lý, kỹ thuật và tài chính không có công thức tường minh viết bằng hàm sơ cấp. Các phương pháp giải số thay đường cong chính xác y(t)y(t) bằng một dãy giá trị xấp xỉ y0,y1,y2,…y_0, y_1, y_2, \ldots, tính từng bước chỉ dựa vào độ dốc f(t,y)f(t,y) mà phương trình cho biết tại mỗi điểm. Bước nhảy hh càng nhỏ thì đường gấp khúc xấp xỉ càng bám sát đường cong thật — nhưng bước nhỏ hơn cũng đòi hỏi nhiều phép tính hơn, nên mỗi phương pháp đều phải cân bằng giữa độ chính xác và chi phí tính toán.

Đồ thị tương tác cho thấy đường cát tuyến hội tụ về đường tiếp tuyến khi bước nhảy co lại, minh họa phép xấp xỉ tuyến tính đứng sau phương pháp Euler.
Thu nhỏ dần từ đường cát tuyến thành đường tiếp tuyến tại t0t_0: một bước Euler chỉ đơn giản là đi theo đúng hướng tiếp tuyến này trên một đoạn hh rồi mới tính lại độ dốc.

Phổ thôngPhương pháp Euler

Định nghĩa: Phương pháp Euler (hiển)

Cho bài toán giá trị ban đầu y′=f(t,y)y' = f(t, y) với y(t0)=y0y(t_0) = y_0, chọn bước nhảy hh và đặt tn=t0+nht_n = t_0 + nh. Phương pháp Euler cập nhật giá trị xấp xỉ theo công thức yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n), lặp lại với n=0,1,2,…n=0,1,2,\ldots.

y′=f(t,y),y(t0)=y0y' = f(t, y), \qquad y(t_0) = y_0

Ở đây f(t,y)f(t,y) là hàm độ dốc cho trước, hh là bước nhảy cố định, và yny_n là giá trị xấp xỉ cho giá trị đúng y(tn)y(t_n) sau nn bước. Mỗi bước chỉ đơn giản đi theo đường tiếp tuyến mà f(t,y)f(t,y) dự đoán tại điểm hiện tại trên một đoạn ngang hh, rồi tính lại độ dốc tại điểm mới — về mặt hình học, đó là một chuỗi các đoạn thẳng xấp xỉ đường cong.

yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n)
So sánh các phương pháp giải từng bước cho y′=f(t,y)y'=f(t,y)
Phương phápSố lần tính ff mỗi bướcBậc sai số toàn cụcPhù hợp với phương trình cứng?
Euler hiển1O(h)O(h)Không (cần hh rất nhỏ)
RK4 cổ điển4O(h4)O(h^4)Không (vẫn cần hh nhỏ với bài toán cứng)
Euler ẩn1 (cộng với giải một phương trình)O(h)O(h)Có (ổn định-A với mọi h>0h>0)

Đại họcHội tụ: mỗi phương pháp chính xác đến đâu?

Giả sử f(t,y)f(t,y) liên tục Lipschitz theo yy với hằng số LL, và nghiệm chính xác thỏa ∣y′′(t)∣≤M|y''(t) | \le M trên [t0,T][t_0, T]. Khi đó sai số toàn cục en=y(tn)−yne_n = y(t_n) - y_n sau nn bước với bước nhảy hh thỏa ∣en∣≤hM2L(eL(tn−t0)−1)|e_n| \le \frac{hM}{2L}\left(e^{L(t_n-t_0)}-1\right).

Vì sao đúng?

Mỗi bước Euler mắc một sai số cục bộ nhỏ cỡ O(h2)O(h^2) do cắt bỏ chuỗi Taylor sau số hạng bậc nhất, nhưng các sai số cục bộ này có thể cộng dồn qua khoảng (T−t0)/h(T-t_0)/h bước cần thiết để tới thời điểm TT cố định. Định lý cho thấy sự cộng dồn này không quá tệ: điều kiện Lipschitz ngăn các sai số cục bộ nhỏ bị khuếch đại nhanh hơn hàm mũ, nên sai số toàn cục chỉ còn bậc nhất, O(h)O(h), theo bước nhảy — kém một bậc so với sai số cục bộ, đúng theo quy luật thường gặp ở các phương pháp một bước.

Chứng minh

Viết sai số cục bộ mắc phải trong một bước là hiệu giữa nghiệm chính xác khai triển bằng chuỗi Taylor và bước cập nhật Euler. Định lý Taylor cho y(tn+1)=y(tn)+hf(tn,y(tn))+h22y′′(ξn)y(t_{n+1}) = y(t_n) + h f(t_n, y(t_n)) + \frac{h^2}{2} y''(\xi_n) với ξn\xi_n nào đó nằm giữa tnt_n và tn+1t_{n+1}, nên sai số cắt cụt cục bộ là τn=h22y′′(ξn)\tau_n = \frac{h^2}{2} y''(\xi_n), bị chặn bởi h2M2\frac{h^2 M}{2} nhờ giả thiết ∣y′′(t)∣≤M|y''(t) | \le M.

Trừ bước cập nhật Euler yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n) khỏi khai triển Taylor chính xác này. Viết en=y(tn)−yne_n = y(t_n) - y_n, hiệu của hai vế phải cho en+1=en+h[f(tn,y(tn))−f(tn,yn)]+τne_{n+1} = e_n + h\left[f(t_n, y(t_n)) - f(t_n, y_n)\right] + \tau_n. Điều kiện Lipschitz chặn số hạng trong ngoặc vuông bởi L∣en∣L|e_n|, nên ∣en+1∣≤(1+hL)∣en∣+h2M2|e_{n+1}| \le (1+hL)|e_n| + \frac{h^2 M}{2}.

Vì e0=0e_0 = 0 (giá trị ban đầu là chính xác), khai triển đệ quy này bằng quy nạp cho ∣en∣≤h2M2∑k=0n−1(1+hL)k=hM2L[(1+hL)n−1]|e_n| \le \frac{h^2M}{2}\sum_{k=0}^{n-1}(1+hL)^k = \frac{hM}{2L}\left[(1+hL)^n - 1\right], dùng đẳng thức chuỗi hình học. Cuối cùng, (1+hL)n≤eLhn=eL(tn−t0)(1+hL)^n \le e^{Lhn} = e^{L(t_n-t_0)} vì 1+x≤ex1+x\le e^x với mọi số thực xx, biến chặn trên thành ∣en∣≤hM2L(eL(tn−t0)−1)|e_n| \le \frac{hM}{2L}\left(e^{L(t_n-t_0)}-1\right) — đúng là bất đẳng thức cần chứng minh, và rõ ràng là O(h)O(h) khi tnt_n cố định.

Phương pháp Runge–Kutta bậc bốn cổ điển, xác định bởi các giai đoạn k1=f(tn,yn)k_1 = f(t_n, y_n), k2=f(tn+h2,yn+h2k1)k_2 = f\left(t_n+\frac{h}{2}, y_n+\frac{h}{2}k_1\right), k3=f(tn+h2,yn+h2k2)k_3 = f\left(t_n+\frac{h}{2}, y_n+\frac{h}{2}k_2\right), k4=f(tn+h,yn+hk3)k_4 = f(t_n+h, y_n+hk_3) và công thức cập nhật yn+1=yn+h6(k1+2k2+2k3+k4)y_{n+1} = y_n + \frac{h}{6}(k_1+2k_2+2k_3+k_4), có sai số cắt cụt cục bộ O(h5)O(h^5) mỗi bước và, với cùng giả thiết Lipschitz như trên, sai số toàn cục O(h4)O(h^4) sau nn bước.

Vì sao đúng?

RK4 tính độ dốc bốn lần mỗi bước tại các điểm trung gian được chọn khéo léo, thay vì một lần, rồi lấy trung bình với các trọng số theo tỉ lệ 1,2,2,11,2,2,1 trên tổng 66 phần. Công sức thêm này đổi lấy ba bậc chính xác cao hơn hẳn so với phương pháp Euler: khai triển khớp với nghiệm đúng theo chuỗi Taylor tới tận số hạng h4h^4, thay vì chỉ dừng ở số hạng bậc nhất.

Chứng minh

Khai triển mỗi giai đoạn thành chuỗi Taylor quanh (tn,yn)(t_n, y_n). Vì k1=f(tn,yn)=y′(tn)k_1=f(t_n,y_n)=y'(t_n), và k2,k3k_2, k_3 tính ff tại điểm giữa dùng yny_n dịch chuyển nửa bước theo hướng của một giai đoạn trước, thay quy tắc dây chuyền cho y′=fy'=f, y′′=ft+fyfy''=f_t+f_yf, và y′′′=ftt+2ftyf+fyyf2+fy(ft+fyf)y'''=f_{tt}+2f_{ty}f+f_{yy}f^2+f_y(f_t+f_yf) vào từng kik_i tạo ra bốn đa thức theo hh khớp với y′(tn),y′′(tn),y′′′(tn)y'(t_n), y''(t_n), y'''(t_n) tới bậc mà mỗi giai đoạn có thể thấy được.

Lập tổ hợp có trọng số 16(k1+2k2+2k3+k4)\frac{1}{6}(k_1+2k_2+2k_3+k_4) rồi nhân với hh, các hệ số của h1,h2,h3h^1, h^2, h^3 và h4h^4 trong tổng này chính xác là các hệ số của khai triển Taylor y(tn+h)=y(tn)+hy′(tn)+h22y′′(tn)+h36y′′′(tn)+h424y(4)(tn)+⋯y(t_n+h) = y(t_n) + hy'(t_n) + \frac{h^2}{2}y''(t_n) + \frac{h^3}{6}y'''(t_n) + \frac{h^4}{24}y^{(4)}(t_n) + \cdots tới tận số hạng h4h^4 — đây chính xác là tập điều kiện bậc cổ điển mà các hệ số c=(0,12,12,1)c=(0,\frac12,\frac12,1) và b=(16,13,13,16)b=(\frac16,\frac13,\frac13,\frac16) của bảng RK4 được chọn để thỏa mãn.

Vì hai chuỗi khớp nhau tới h4h^4, số hạng đầu tiên chúng có thể khác nhau là số hạng O(h5)O(h^5), nên sai số cắt cụt cục bộ là O(h5)O(h^5) mỗi bước. Như trong trường hợp Euler, cộng dồn các sai số cục bộ này qua n≈(T−t0)/hn\approx (T-t_0)/h bước cần thiết để tới một thời điểm cố định, dùng điều kiện Lipschitz trên ff, làm mất đúng một bậc của hh, cho sai số toàn cục O(h4)O(h^4).

Nâng caoPhương trình cứng và các phương pháp ẩn

Một phương trình vi phân được gọi là cứng khi nó trộn lẫn các thang thời gian rất khác nhau: một số thành phần của nghiệm suy giảm cực nhanh trong khi các thành phần khác biến đổi chậm, buộc các phương pháp hiển phải lấy bước rất nhỏ chỉ để giữ ổn định số, dù độ chính xác một mình cho phép bước lớn hơn nhiều. Với phương trình thử đơn giản y′=λyy'=\lambda y với λ<0\lambda<0, phương pháp Euler chỉ ổn định khi ∣1+hλ∣≤1|1+h\lambda|\le 1 đúng, tức khi h≤2∣λ∣h \le \frac{2}{|\lambda|}, nên một λ\lambda âm mạnh (một chế độ suy giảm nhanh) buộc hh phải rất nhỏ.

yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1})

Các phương pháp ẩn như Euler ẩn (lùi), yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1}), đòi hỏi giải một phương trình để tìm yn+1y_{n+1} ở mỗi bước (thường bằng phương pháp Newton khi ff phi tuyến), nhưng đổi lại chúng vẫn ổn định với mọi bước nhảy trên phương trình thử này — một tính chất gọi là ổn định-A — đúng là điều cần thiết cho các hệ cứng xuất hiện trong động học hóa học, mô phỏng mạch điện và lý thuyết điều khiển.

Đại họcỨng dụng thực tiễn và Ví dụ minh họa

Các bộ tích phân số cho phương trình vi phân là xương sống tính toán của phần mềm mô phỏng: chúng đưa trạng thái của một hệ vật lý hoặc tài chính tiến lên theo thời gian chỉ dựa vào phương trình chi phối và điều kiện ban đầu. Phần mềm mô phỏng mạch điện dùng chúng để dự đoán điện áp và dòng điện, phần mềm cơ học thiên thể dùng chúng để lan truyền quỹ đạo vệ tinh, các kỹ sư hóa học dùng bộ giải cho hệ cứng để mô hình hóa mạng phản ứng nhanh, và tài chính định lượng dùng chúng để mô phỏng các mô hình lãi suất và định giá quyền chọn.

Ví dụ: Phóng điện mạch RC bằng phương pháp Euler

Một tụ điện trong mạch RC phóng điện theo dVdt=−V\frac{dV}{dt} = -V (thời gian đo bằng đơn vị RCRC) với điện áp ban đầu V(0)=5V(0)=5. Dùng phương pháp Euler với bước h=0.1h=0.1 để ước lượng V(0.2)V(0.2).

Lời giải

Ở đây f(t,V)=−Vf(t,V) = -V, nên công thức cập nhật đơn giản là Vn+1=Vn−hVn=(1−h)VnV_{n+1} = V_n - hV_n = (1-h)V_n với h=0.1h=0.1.

Bước một: V1=V0−hV0=5−0.1(5)=4.5V_1 = V_0 - h V_0 = 5 - 0.1(5) = 4.5.

Bước hai: V2=V1−hV1=4.5−0.1(4.5)=4.05V_2 = V_1 - hV_1 = 4.5 - 0.1(4.5) = 4.05, nên ước lượng Euler là V(0.2)≈4.05V(0.2)\approx 4.05.

Nghiệm chính xác là V(t)=5e−tV(t) = 5e^{-t}, cho 5e−0.2≈4.09375e^{-0.2}\approx 4.0937, vậy ước lượng Euler sau hai bước lệch khoảng 0.0440.044 — phù hợp với sai số toàn cục bậc nhất, O(h)O(h), giảm tỉ lệ thuận với hh.

Ví dụ: Vì sao một phản ứng nhanh buộc bước nhảy phải rất nhỏ

Một mô hình động học hóa học đơn giản hóa có một pha chuyển tiếp suy giảm nhanh, chi phối bởi y′=−50(y−cos⁡t)y' = -50(y-\cos t) với y(0)=0y(0)=0. Xác định bước nhảy lớn nhất để phương pháp Euler hiển vẫn ổn định về số, và giải thích điều gì thay đổi nếu dùng Euler ẩn thay thế.

Lời giải

Gần pha chuyển tiếp nhanh, phương trình hoạt động giống phương trình thử tuyến tính y′≈−50yy'\approx -50y, nên giá trị liên quan là λ=−50\lambda=-50. Euler hiển ổn định đúng khi ∣1+hλ∣≤1|1+h\lambda|\le 1, với λ=−50\lambda=-50 điều này trở thành ∣1−50h∣≤1|1-50h|\le 1, tức 0≤h≤0.040\le h\le 0.04 — một trần rất nhỏ dù phần chậm của nghiệm hầu như không đổi trong khoảng đó.

Nếu chọn hh lớn hơn 0.040.04, các giá trị số bắt đầu dao động với biên độ tăng dần dù nghiệm đúng trơn và bị chặn: đây là lỗi ổn định, không phải lỗi độ chính xác, vì sai số cắt cụt cục bộ thực ra vẫn chấp nhận được ở một hh lớn hơn nhiều.

Chuyển sang Euler ẩn, yn+1=yn+hf(tn+1,yn+1)y_{n+1} = y_n + h f(t_{n+1}, y_{n+1}), điều kiện ổn định cho cùng phương trình thử trở thành ∣11−hλ∣≤1\left|\frac{1}{1-h\lambda}\right|\le 1, đúng với mọi h>0h>0 khi λ<0\lambda<0: phương pháp này ổn định-A, nên bước nhảy có thể được chọn hoàn toàn dựa trên độ chính xác cần có để theo dõi phần chậm của nghiệm, chứ không phải dựa trên pha chuyển tiếp nhanh.

Dùng phương pháp Euler với y′=yy'=y, y(0)=1y(0)=1 và bước nhảy h=0.5h=0.5, giá trị xấp xỉ y1y_1 sau một bước là bao nhiêu?

Bậc chính xác toàn cục của phương pháp Runge–Kutta bậc bốn (RK4) cổ điển là bao nhiêu?

Khi áp dụng Euler hiển cho một phương trình vi phân cứng, điều gì thường xảy ra nếu bước nhảy chỉ lớn hơn một chút so với ngưỡng ổn định?

Điều nào sau đây là một ứng dụng thực tế điển hình của các bộ giải số phương trình vi phân?

Tài liệu tham khảo

  1. J. C. Butcher (2016). Numerical Methods for Ordinary Differential Equations
  2. E. Hairer, S. P. Norsett, G. Wanner (1993). Solving Ordinary Differential Equations I: Nonstiff Problems