1. Khái niệm mô phỏng
Mô phỏng là việc thiết lập một mô hình cho hệ thống hoặc hiện tượng thực tế, sau đó chạy mô hình trên máy tính để thu thập dữ liệu, quan sát hành vi và rút ra kết luận, thay vì thực hiện trực tiếp trên hệ thống thật.
Chẳng hạn, thay vì tung đồng xu thật 1 000 lần để xem tỉ lệ sấp - ngửa, ta viết chương trình sinh kết quả ngẫu nhiên nhiều lần rồi thống kê.
- Tiết kiệm chi phí và thời gian so với thực nghiệm thực tế.
- An toàn khi thử nghiệm có thể gây nguy hiểm hoặc thất thoát lớn.
- Lặp lại được nhiều lần với các tham số khác nhau để so sánh kịch bản.
- Hỗ trợ dự báo, phân tích trước khi thực hiện ở quy mô lớn.
- Thực nghiệm trực tiếp quá đắt đỏ, cần nhiều thời gian hoặc thiết bị lớn.
- Thực hiện thật có tính nguy hiểm, phá hoại hoặc không phù hợp về đạo đức.
- Sự kiện chỉ xảy ra một lần nên không thể thử lại (thay đổi chính sách, mở rộng thị trường).
- Cần thử nhiều cách bố trí, cấu hình trước khi chọn phương án tối ưu.
2. Các bước mô phỏng trên máy tính
- 1.Xác định rõ vấn đề và mục tiêu của mô hình mô phỏng.
- 2.Thu thập thông tin, dữ liệu thực tế; chọn các tham số ngẫu nhiên cần sử dụng.
- 3.Xây dựng mô hình: mô tả cách thức vận hành của hệ thống bằng các bước xử lí.
- 4.Lập trình và cho chạy mô hình nhiều lần; thu thập kết quả thực nghiệm.
- 5.Phân tích, thống kê kết quả; rút ra quy luật hoặc dự báo; đánh giá mức độ tin cậy của mô hình.
3. Mô phỏng với Python
Trong Python, thư viện (mô-đun) random cung cấp sẵn các hàm sinh số ngẫu nhiên.
random.random(): trả về một số thực trong khoảng .random.randint(a,b): trả về một số nguyên trong đoạn , tức là từađếnb, cảavàbđều có thể xuất hiện.
Trước khi gọi các hàm trên, phải có dòng import random.
Viết chương trình mô phỏng tung đồng xu 1 000 lần; in ra số lần được mặt sấp và tỉ lệ phần trăm tương ứng.
Giả sử random.randint(0,1) ra 0 được coi là mặt sấp. Ta dùng biến dem để đếm trong vòng lặp.
import random
N = 1000
dem = 0
for lan in range(N):
if random.randint(0, 1) == 0:
dem = dem + 1
print("So lan sap:", dem)
print("Ti le %:", round(100 * dem / N, 2))
Kết quả in ra là một con số xấp xỉ gần 500 lần sấp, tỉ lệ gần 50%. Số liệu có thể thay đổi mỗi lần chạy vì đây là thực nghiệm ngẫu nhiên.
Mô phỏng gieo xúc xắc 6 mặt 2 000 lần, đếm số lần xuất hiện của từng mặt từ 1 đến 6.
Dùng một danh sách gồm 6 ô để đếm tần suất các mặt. Sau mỗi lần gieo, tăng đúng ô tương ứng với mặt vừa nhận được.
import random
lan = 2000
dem = [0, 0, 0, 0, 0, 0]
for i in range(lan):
mat = random.randint(1, 6)
dem[mat - 1] += 1
for k in range(6):
print("Mat", k + 1, ":", dem[k])
Nhận xét: với 2 000 lần gieo, mỗi mặt xuất hiện khoảng 333 lần (có chênh lệch nhỏ mỗi lần chạy). Số lần lặp càng lớn thì tần suất (tỉ lệ) xuất hiện của mỗi mặt thường càng gần xác suất lý thuyết .
- Quên dòng
import randomsẽ gây lỗiNameError. - Không nhầm
random.randint(a,b)là chỉ cho các số nhỏ hơnb; thực chất nó cho cảb. - Kết quả mô phỏng là xác suất thực nghiệm, chỉ xấp xỉ xác suất lý thuyết. Số lần lặp càng nhỏ thì chênh lệch càng lớn.
- Mô hình chỉ phù hợp trong phạm vi các giả định đã đặt ra, không thay thế tuyệt đối mọi thực nghiệm thật.
4. Câu hỏi ôn tập
Trình bày khái niệm mô phỏng và nêu hai ví dụ áp dụng mô phỏng trong đời sống hoặc sản xuất.
Gợi ý trả lời
Mô hình hóa hệ thống rồi cho chạy trên máy tính để quan sát thay vì làm trực tiếp; ví dụ: dự báo thời tiết, mô phỏng giao thông, thử nghiệm an toàn phương tiện.
Trong Python, lệnh random.randint(2,5) có thể cho ra những giá trị nào?
Gợi ý trả lời
Các số nguyên 2, 3, 4 hoặc 5; cả hai đầu mút đều có thể xuất hiện.
Mô tả thuật toán mô phỏng tung hai đồng xu cùng lúc, sau đó in ra tần suất xuất hiện trường hợp cả hai mặt đều ngửa.
Gợi ý trả lời
Cho mỗi đồng xu sinh một giá trị ngẫu nhiên 0 hoặc 1; lặp lại nhiều lần, đếm các lần cả hai đều mang giá trị quy ước cho mặt ngửa; cuối cùng tính tỉ lệ phần trăm.