Daftar Isi:
- Langkah 1: Buat Matriks Kedekatan
- Langkah 2: Buat Hubungan
- Langkah 3: Tambahkan Statistik Penyakit
- Langkah 4: Acak Peluang Orang yang Divaksinasi dan Tidak Divaksinasi Dapat Terinfeksi
- Langkah 5: Buat Matriks Orang yang Tidak Divaksinasi dan Terinfeksi Dari Informasi Awal
- Langkah 6: Plot Grafik Awal
- Langkah 7: Simulasikan Perkembangan Infeksi
- Langkah 8: Gunakan Teori Monte Carlo
- Langkah 9: Jadikan File ('infectionSim.m') Dengan Simulasi Menjadi Fungsi
- Langkah 10: Hitung Persentase Orang yang Tidak Divaksinasi dan Divaksinasi yang Terinfeksi
- Langkah 11: Buat Variabel Output di 'infectionSim.m' Fungsi Anda
- Langkah 12: Buat Menu untuk Mendapatkan Kondisi Awal Simulasi Dari Pengguna
- Langkah 13: Pilih % Orang yang Tidak Divaksinasi dan Hitung Rata-rata Orang yang Tidak Divaksinasi dan Terinfeksi untuk Persentase Terpilih
- Langkah 14: Grafik: 'Tren Infeksi pada Orang yang Tidak Divaksinasi Vs. Divaksinasi untuk Penyakit Tertentu'
- Langkah 15: Produk Akhir: Seperti Apa Simulasinya
Video: Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit: 15 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:57
Ikhtisar Proyek:
Proyek kami mengeksplorasi kekebalan kawanan dan berharap dapat mendorong orang untuk mendapatkan vaksinasi untuk mengurangi tingkat infeksi di komunitas kami. Program kami mensimulasikan bagaimana suatu penyakit menginfeksi populasi dengan persentase yang berbeda dari tingkat vaksinasi dan tidak divaksinasi. Ini menunjukkan kekebalan kawanan dengan menunjukkan bagaimana peningkatan jumlah populasi yang divaksinasi dapat menurunkan jumlah orang yang terkena dampak.
Kami memodelkan ini di Matlab menggunakan konsep teori graf. Teori graf adalah cara matematis untuk merepresentasikan hubungan antar objek. Dalam teori graf, graf memiliki simpul (atau simpul) yang dihubungkan oleh sisi (atau garis). Untuk proyek kami, node adalah individu yang bersangkutan dan edge adalah koneksi mereka. Misalnya, jika dua simpul terhubung dengan tepi, maka itu berarti mereka "berteman" atau memiliki beberapa bentuk kontak satu sama lain. Kontak ini merupakan cara penyebaran penyakit. Inilah mengapa kami menggunakan teori graf untuk memodelkan konsep kami karena kami ingin melihat bagaimana penyakit menyebar di antara individu-individu yang terhubung dalam suatu populasi.
Proyek kami juga melibatkan Metode Monte Carlo. Metode Monte Carlo adalah algoritma yang membuat pengambilan sampel acak berulang untuk menerima hasil numerik. Dalam proyek kami, kami menggunakan metode ini untuk menjalankan simulasi kami beberapa kali mengubah persentase awal yang tidak divaksinasi untuk melihat tingkat di mana orang terinfeksi.
Semua kode proyek ditautkan di bagian bawah!
Kredit PC:
Tautan Matlab ke Teori Grafik:
Langkah 1: Buat Matriks Kedekatan
Buat skrip baru. Kita akan menyebut milik kita 'infectionSim.m'.
Kita akan membuat variabel 'NUMOFPEOPLE'. Anda dapat menetapkannya ke nilai integer apa pun. Ini akan mewakili jumlah orang dalam populasi Anda.
Mulai sekarang, kita akan berasumsi bahwa
JUMLAH ORANG = 20;
Pertama mulai dengan menggunakan fungsi teori graf Matlab untuk graf tak berarah.
Jika Anda tertarik untuk mempelajari lebih lanjut, berikut ini tautan untuk Anda baca lebih mendalam tentangnya.
www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html
Membuat matriks ketetanggaan.
adjMatrix = nol(NUMOFPEOPLE);
Ini akan membuat matriks persegi 0s. Setiap baris dalam matriks adalah satu orang. Setiap kolom dalam matriks adalah orang atau teman yang ditemui orang tersebut sepanjang hari.
Lihat Gambar 100 (di atas) untuk membantu memvisualisasikan tampilan adjMatrix untuk 20 orang.
**Mulai saat ini kita akan menganggap NUMOFPEOPLE sama dengan 20.**
Anda dapat mencoba memplot matriks adjacency ini. Berikut adalah sedikit informasi lebih lanjut tentang memplot jenis matriks ini.
Catatan: Cara kerja matriks adjacency.
Mantan:
%membuat matriks yang berdekatan
a = [0, 1, 0, 0, 0; 1, 0, 1, 1, 1; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0; 0, 1, 0, 0, 0] %plotting g = grafik(a); %menggunakan fungsi graf (teori graf) gambar(1); h = plot(g);
Lihat Gambar 1 (di atas) untuk melihat cara menambahkan tepi dalam matriks adjacency, menggunakan kode di "Catatan".
Langkah 2: Buat Hubungan
Sekarang orang-orang (simpul atau simpul) dibuat, kita perlu membuat jaringan hubungan (garis atau tepi grafik). Ini akan mensimulasikan bagaimana orang berinteraksi dan bertemu orang lain sepanjang hari.
Ini bisa dilakukan dengan banyak cara. Salah satu cara untuk menyelesaikan tugas ini adalah pertama-tama menetapkan nomor acak untuk setiap orang untuk menentukan berapa banyak orang yang akan berinteraksi dengan setiap orang dalam sehari.
numOfFriendsMatrix = randi([leastFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);
Ini membuat matriks 1 kali 20 bilangan bulat acak yang mewakili jumlah interaksi yang dimiliki setiap orang dalam sehari. Kolom matriks ini akan menjadi nomor yang sesuai untuk setiap orang. Misalnya jika kita menetapkan leastFriendsPersonCanHave = 2 dan mostFriendsPersonCanHave = 5, kita akan mendapatkan nilai acak antara 2 dan 5.
Mengalami masalah dengan randi()? Di terminal, ketik
bantu randi
Selanjutnya, kami membuat matriks acak (disebut "allFriendsmatrix") tentang bagaimana setiap orang dalam populasi terhubung/berinteraksi dalam populasi.
tempMatriks = ;
menghitung = 0; allFriendsMatrix = ; untuk k = 1:NUMOFPEOPLE while length(tempMatrix) ~= numOfFriendsMatrix(k) count = count +1; suhu = randi([1, BANYAK ORANG]); tempMatrix(hitungan) = suhu; akhiri setiap while length(tempMatrix) ~= 9 tempMatrix = [tempMatrix, NaN]; end allFriendsMatrix = [allFriendsMatrix; tempMatriks]; tempMatriks = ; menghitung = 0; akhir
Penjelasan kode secara mendalam:
Pertama kita membuat matriks sementara kosong untuk menampung daftar teman/interaksi setiap orang. Kami juga menginisialisasi hitungan, yang hanya melacak di mana untuk menempelkan koneksi acak baru di tempMatrix. Perulangan for berjalan 20 kali sehingga ini terjadi untuk setiap individu dalam populasi. Loop while pertama berjalan hingga tempMatrix setiap orang memiliki panjang yang sama dari jumlah interaksi yang ditetapkan secara acak. Dalam loop ini, nomor acak yang sesuai dengan orang dalam populasi dihasilkan dan ditempatkan ke dalam tempMatrix. Karena panjang masing-masing tempMatrix berbeda, kami perlu membuat beberapa nilai NaN sehingga kami dapat menggabungkan semua tempMaticies ini menjadi satu matriks ('allFriendsMatrix'). Loop while kedua memecahkan masalah ini dengan menambahkan NaN ke setiap tempMatrix. Perulangan while diatur untuk berjalan 9 kali karena merupakan angka yang lebih besar dari 5, yang merupakan batas atas teman yang dapat ditetapkan untuk seseorang. Nilai '9' adalah variabel dan dapat/harus diubah ketika 'mostFriendsPersonCanHave' lebih besar dari 9. Tiga baris kode terakhir (tidak termasuk akhir) menambahkan tempMatrix ke baris berikutnya dari 'allFriendsMatrix'. Kemudian menghapus tempMatrix dan menghitung untuk orang berikutnya.
Keluaran
Seperti inilah tampilan output untuk putaran pertama melalui for loop (sebelum tiga baris terakhir).
tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN
allFriendsMatrix =
16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11 17 2 NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN 17 10 9 3 1 NaN NaN NaN NaN 16 16 6 NaN NaN NaN NaN NaN NaN 3 8 17 17 14 NaN NaN NaN NaN 20 19 3 NaN NaN NaN NaN NaN NaN 13 10 NaN NaN NaN NaN NaN NaN NaN 2 18 10 16 NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN 8 16 14 8 NaN NaN NaN NaN NaN 7 7 NaN NaN NaN NaN NaN NaN NaN 19 10 9 NaN NaN NaN NaN NaN NaN 10 19 NaN NaN NaN NaN NaN NaN NaN 5 18 NaN NaN NaN NaN NaN NaN NaN 1 7 NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN
Selanjutnya, tambahkan hubungan ini ke adjMatrix.
untuk setiapBaris = 1:NUMOFPEOPLE
for eachCol = 1:9 if isnan(allFriendsMatrix(eachRow, eachCol)) == 0 adjMatrix(eachRow, allFriendsMatrix(eachRow, eachCol)) = 1; adjMatrix(allFriendsMatrix(setiapBaris,setiapKol),setiapBaris) = 1; akhir akhir akhir
Penjelasan Kode
Loop for ganda ini melewati setiap baris dan kolom 'allFriendsMatrix'. Pernyataan if akan dijalankan untuk semua nilai yang bukan 'NaN'. Pada dasarnya itu akan membuat tepi atau garis grafik. Jadi baris pertama yang akan dibuat adalah orang 1 menjadi orang 16 dan orang 16 menjadi orang 1. Karena tidak terarah, 1 harus diubah untuk keduanya! Kita tidak bisa hanya memiliki edge 1 hingga 16 dan bukan 16 hingga 1. Mereka harus simetris agar dapat berjalan dengan baik di Matlab.
Dalam simulasi kami, kami menetapkan bahwa orang tidak dapat berinteraksi dengan diri mereka sendiri. Ketika kami mengacak nilainya, ada kemungkinan matriks yang berdekatan kami memiliki kesalahan ini.
Mari kita perbaiki ini dengan kode berikut:
untuk masing-masing = 1:NUMOFPEOPLE
adjMatrix(masing-masing, masing-masing) = 0; akhir
Penjelasan Kode
Ini untuk loop memastikan bahwa orang 1 tidak terhubung ke orang 1, orang 2 tidak terhubung ke orang 2, dll dengan membuat semuanya 0. Seperti yang Anda lihat di bawah di bagian output, kami memiliki diagonal persegi matriks dari kiri atas ke kanan bawah semuanya 0.
Keluaran
Ini adalah adjMatrix terakhir untuk simulasi saat ini. Ini menjelaskan semua garis dalam grafik (Gambar 2).
adjMatriks =
0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 1 1 0 0 0 1 0 1 1 1 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 1 0 1 0 0 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 0 0 0 1 1 1 0 0 1 0 0 1 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
Lihat Gambar 2 untuk melihat grafik 'adjMatrix'.
Langkah 3: Tambahkan Statistik Penyakit
Sekarang program Anda dapat membuat grafik dengan sekumpulan orang acak dan membuat hubungan acak, kita perlu memasukkan informasi atau statistik penyakit untuk melihat bagaimana interaksi ini dalam suatu populasi dapat meningkatkan atau mengurangi infeksi.
Buat variabel ini:
unvacc %type: ganda; persen kemungkinan orang yang tidak divaksinasi tidak terkena penyakit
vacc% jenis: ganda; persen kemungkinan orang yang divaksinasi tidak terkena penyakit unvacc_perc %type: double; persen populasi tidak divaksinasi init_infect %type: int; persen populasi yang divaksinasi
Selanjutnya kita perlu melakukan beberapa perhitungan.
Kita akan membuat 'infectionMat' yang merupakan matriks 3*NUMOFPEOPLE.
vacc_perc = 1-unvacc_perc;
infeksiMat = nan(3, NUMOFPEOPLE); angka = bulat(vacc_perc * NUMOFPEOPLE); infeksiMat(1, 1:angka) = vacc; infeksiMat(1, angka+1:akhir) = unvacc; infeksiMat(2, 1:akhir) = 0; infeksiMat(2, 1:init_infect) = 1;
Penjelasan Kode
baris 1: Persentase populasi yang tidak divaksinasi dihitung
baris 2: buat matriks jumlah orang 3*N
baris 3: cari tahu jumlah orang yang divaksinasi dari persentase yang divaksinasi
baris 4: untuk orang yang divaksinasi, beri mereka kekebalan yang terkait dengan memiliki vaksin. Nilai ini diberikan berdasarkan penelitian tentang penyakit tersebut.
baris 5: untuk sisa populasi (orang yang tidak divaksinasi), beri mereka persen kekebalan. Nilai ini diberikan berdasarkan penelitian tentang penyakit.
baris 6: awalnya mengatur semua orang untuk tidak terinfeksi.
baris 7: untuk jumlah orang yang awalnya terinfeksi, isilah kolom pasangan pertama yang sesuai.
Sekarang setelah kita menetapkan semua parameter untuk simulasi penyakit, kita akan mengacak peluang apakah orang tersebut (baik yang divaksinasi maupun yang tidak divaksinasi) terinfeksi. Ini dilakukan pada langkah berikutnya dengan menetapkan nilai acak antara 0 dan 1 untuk setiap orang di baris ketiga 'infectionMat' ini.
Langkah 4: Acak Peluang Orang yang Divaksinasi dan Tidak Divaksinasi Dapat Terinfeksi
Selanjutnya, berikan nomor acak kepada setiap orang, ini akan digunakan nanti untuk menentukan apakah orang tersebut terinfeksi atau tidak.
untuk w = 1:panjang(InfectionMat)
infeksiMat(3, w) = rand; akhir
Penjelasan kode
Perulangan for ini berhubungan dengan baris ketiga dari 'infectionMat' yang dibuat pada langkah terakhir. 'rand' memberikan nilai antara 0 dan 1 untuk setiap indeks baris 3.
Keluaran
infeksiMat sekarang lengkap! Ini dengan populasi dengan vaksinasi 100% dan 1 orang awalnya terinfeksi.
InfeksiMat =
Kolom 1 sampai 12 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 1.0000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0869 0,5489 0,3177 0,9927 0,7236 0,5721 0,7172 0,97500 0,4270 0,9130 0,8973 500 0.7500 0.7500 0 0 0 0 0 0 0 0 0.0480 0.3593 0.2958 0.6291 0.1362 0.3740 0.8648 0.2503
baris 1: Persentase peluang TIDAK terkena penyakit
baris 2: Terinfeksi atau tidak terinfeksi (nilai boolean)
baris 3: Nomor yang digunakan untuk memeriksa apakah orang yang tidak terinfeksi terinfeksi jika bertemu dengan orang yang terinfeksi. Jika orang yang tidak terinfeksi bertemu orang yang terinfeksi, angka ini lebih besar dari angka pada baris 1 (untuk kolom yang sama), maka mereka terinfeksi. Kami akan mengkodekan fungsi ini pada langkah 7.
Langkah 5: Buat Matriks Orang yang Tidak Divaksinasi dan Terinfeksi Dari Informasi Awal
Buat 2 matriks yang disebut "matrixUnvacc" dan "matrixInfected" yang menyimpan semua orang yang terinfeksi dari infectionMat. Ini akan digunakan agar kita dapat memberi kode warna pada grafik mereka yang terinfeksi, tidak divaksinasi, atau divaksinasi, membantu memvisualisasikan dampak individu yang tidak divaksinasi versus individu yang divaksinasi.
bersihkan masing-masing
matrixInfected = ; matrixUnvacc = ; untuk h= 1:panjang(InfectionMat) jika infeksiMat(1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end untuk orang = 1:NUMOFPEOPLE jika infeksiMat(2, orang) == 1 matrixInfected = [matrixInfected, orang]; akhir akhir
Penjelasan Kode
Buat dua matriks kosong untuk masing-masing menyimpan jumlah orang yang tidak divaksinasi dan terinfeksi. Kedua perulangan for dijalankan 20 kali dan jika pernyataan if terpenuhi, maka bilangan tersebut ditambahkan ke matriks yang benar.
Keluaran
matriksUnvacc =
matrixInfected =
[1]
Langkah 6: Plot Grafik Awal
Selanjutnya kita akan memplot matriks adjacency.
g = grafik(adjMatrix);
angka(1) p = plot(g, 'Warna Node', 'b', 'Ukuran Penanda', 7); sorot(p, matrixUnvacc, 'NodeColor', 'g') sorot(p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title(['Persentase orang yang tidak divaksinasi: ', num2str(title_unvacc), '%']); jeda (kecepatan)
Penjelasan kode
Teori grafik di Matlab memiliki fungsi bawaan. Saat kita menggunakan fungsi graph(), kita dapat menerjemahkan 'adjMatrix' ke dalam grafik tak berarah yang sebenarnya. Kami kemudian harus membuat plot menggunakan fungsi plot() untuk benar-benar melihat seperti apa. Kami mengatur plot() ini ke variabel sehingga kami dapat memanipulasi dan mengubah warna plot dengan lebih mudah selama simulasi. Semua orang (atau node) awalnya disetel ke warna 'biru'. Selanjutnya, semua orang yang tidak divaksinasi diatur ke warna 'hijau'. Orang yang terinfeksi kemudian diatur ke warna 'merah'. Judul ditetapkan sesuai dengan nilai persentase tertentu dari orang yang tidak divaksinasi yang diuji. Fungsi pause() untuk sementara menghentikan eksekusi MatLab. Kami melewati kecepatan variabel yang tersebar yang dihitung dalam hitungan detik.
Lihat gambar (atas) untuk melihat grafik kode warna acak.
Pelajari lebih lanjut tentang fungsi highlight() di MatLab.
Langkah 7: Simulasikan Perkembangan Infeksi
Selanjutnya kita perlu mencari tahu siapa yang terinfeksi setelah interaksi (tercatat dalam adjMatrix) dan memperbarui grafik ketika seseorang terinfeksi.
Gunakan adjMatrix untuk menentukan orang mana yang terinfeksi setelah interaksi mereka dengan orang dalam sehari.
untuk setiapBaris = 1:panjang(adjMatrix)
if infectionMat(2, eachRow) == 1 for eachCol = 1:length(adjMatrix) if adjMatrix(eachRow, eachCol) == 1 % eachRow = orang % eachCol = temannya % teman setiap orang dan lihat apakah mereka terinfeksi. jika infeksiMat(3, setiapKol) > infeksiMat(1, setiapKol) infeksiMat(2, setiapKol) = 1; sorot(p, eachCol, 'NodeColor', 'r') jeda(kecepatan) akhir akhir akhir akhir akhir
Perulangan for melewati setiap orang. Ia memeriksa bahwa jika orang tersebut terinfeksi, ia akan memeriksa setiap orang/teman yang berinteraksi dengan mereka dan memeriksa apakah tingkat kekebalan teman itu lebih besar daripada kekuatan penyakitnya. Di sinilah 'infectionMat' yang kita buat sebelumnya berperan. Baris ke-1 dan ke-3 dari setiap kolom teman dibandingkan dan jika baris ke-3 lebih besar, berarti teman tersebut tidak memiliki kekebalan yang cukup tinggi untuk menghindari penyakit dan akhirnya terinfeksi. Kami juga mengubah warna menggunakan highlight() menjadi merah jika mereka terinfeksi.
Sekarang kode Anda untuk simulasi akan berfungsi! dan untuk ukuran populasi berapa pun, cukup ubah NUMOFPEOPLE!
Langkah 8: Gunakan Teori Monte Carlo
Untuk mengambil satu langkah lebih jauh dan mengekstrak data dari simulator kami ('infectionSim.m'), kami ingin menghitung dan membuat grafik tren persentase orang yang tidak divaksinasi yang terinfeksi dan persentase orang yang divaksinasi yang terinfeksi. Kami berhipotesis bahwa persentase orang yang divaksinasi yang terinfeksi harus jauh lebih rendah daripada persentase orang yang tidak divaksinasi yang terinfeksi.
Langkah 9: Jadikan File ('infectionSim.m') Dengan Simulasi Menjadi Fungsi
Untuk menjalankan Monte Carlo, kami ingin menjalankan simulasi beberapa kali dan mengumpulkan data sehingga kami dapat menggunakannya untuk membuat grafik persentase orang yang terinfeksi.
Fungsinya dapat diatur seperti ini:
output fungsi = infeksiSim(unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, kecepatan)
Komentari variabel dalam simulasi Anda karena sekarang Anda meneruskannya melalui file utama (kita akan mulai menulis ini di langkah 12):
unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect
variabel baru
kecepatan
akan ditetapkan dalam file utama (Monte_Carlo.m).
Catatan: Jangan lupa akhiri di bagian bawah file fungsi untuk mengakhiri fungsi!
Langkah 10: Hitung Persentase Orang yang Tidak Divaksinasi dan Divaksinasi yang Terinfeksi
Ini menghitung persentase orang yang tidak divaksinasi yang terinfeksi. Kode ini berada di bagian bawah file 'infectionSim.m'.
number_of_unvacc = 0;
number_of_infec_unvacc = 0; %menghitung persentase orang yang tidak divaksinasi yang terinfeksi untuk x = 1:length(infectionMat) if infectionMat(1, x) == unvacc number_of_unvacc = number_of_unvacc+1; akhiri jika infeksi(1, x) == unvacc & infeksiMat(2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; akhir persentase_of_unvacc_and_infec = (angka_infec_unvacc / angka_unvacc)*100;
Penjelasan kode
Dalam perulangan for, ia akan mengulang NUMOFPEOPLE kali. Setiap kali nomor di infectionMat sesuai dengan nomor unvacc (yaitu 0.95 == 0.95), maka jumlah orang yang tidak divaksinasi akan bertambah 1. Setiap kali nomor di infectionMat sesuai dengan nomor unvacc dan mereka terinfeksi, jumlah orang yang terinfeksi dan tidak divaksinasi bertambah 1. Baris terakhir membagi jumlah orang yang terinfeksi dan tidak divaksinasi dengan jumlah total orang yang tidak divaksinasi. Kemudian persentase dihitung dari ini.
Tantangan:
Coba hitung persentase orang yang divaksinasi yang terinfeksi! (Petunjuk: sangat mirip dengan kode di atas, namun beberapa variabel diubah dan nama disesuaikan.)
Selanjutnya persentase orang yang terinfeksi berdasarkan jumlah penduduk dihitung:
pre_per_infect = cumsum(InfectionMat(2,:));
per_infect = (pre_per_infect(1, NUMOFPEOPLE)/NUMOFPEOPLE)*100;
Penjelasan kode
Jumlah kumulatif dihitung menggunakan baris kedua dari infectionMat, yang menyimpan 1 dan 0 tergantung apakah orang tersebut terinfeksi atau tidak. Karena fungsi cumsum() mengembalikan matriks, kami mengambil nilai terakhir dalam matriks ('pre_per_infect(1, NUMOFPEOPLE)'), yang seharusnya merupakan jumlah sebenarnya dari semua nilai dari 'infectionMat(2,:)'. Dengan membagi jumlah dengan NUMOFPEOPLE dan mengalikannya dengan 100, kita mendapatkan persentase akhir yang terinfeksi dalam total populasi.
Langkah 11: Buat Variabel Output di 'infectionSim.m' Fungsi Anda
output = [per_infeksi, persentase_unvacc_dan_infeksi, persentase_vacc_dan_infeksi];
Penjelasan kode
Simpan informasi ini dalam output, yang akan dikirim kembali ke main (Monte_Carlo.m) ketika fungsi dipanggil dan selesai dijalankan. Data ini digunakan untuk membuat grafik poin persen terinfeksi dari mereka yang divaksinasi dan tidak divaksinasi.
Fungsi 'infectionSim.m' Anda seharusnya sudah selesai sekarang! Namun, itu tidak akan berjalan karena kita masih perlu menulis main!
Langkah 12: Buat Menu untuk Mendapatkan Kondisi Awal Simulasi Dari Pengguna
Ingat bagaimana kami mengatakan variabel
kecepatan
akan dibuat dan melewati fungsi utama? Kita perlu mendapatkan nilai untuk lolos ke fungsi. Catatan, urutan nilai saat memanggil fungsi itu penting!
Mulailah dengan meminta pengguna untuk mengetikkan beberapa jawaban ke terminal.
> Pilih penyakit. Perhatikan bahwa ini peka huruf besar-kecil >> Pertusis >> Flu >> Campak >> Penyakit yang Dipilih: Flu >> Pilih ukuran populasi. >> 20 >> 200 >> Populasi yang dipilih: 20 >> Pilih kecepatan simulasi. >> Cepat >> Lambat >> Kecepatan yang dipilih: Cepat
Kode di bawah ini menanyakan kepada pengguna penyakit apa yang ingin mereka periksa.
disp('Pilih penyakit. Perhatikan bahwa ini peka huruf besar-kecil')
fprintf('Pertusis\nFlu\nCampak\n') penyakit = input('Penyakit yang Dipilih: ', 's'); if sama(penyakit, 'Pertusis') vacc =.85; %15 persen kemungkinan terkena penyakit unvacc =.20; %80 persen kemungkinan terkena penyakit jika tidak sama(penyakit, 'Flu') vacc =.75; %25 persen kemungkinan terkena penyakit unvacc = 0,31; %69 persen kemungkinan terkena penyakit jika tidak sama(penyakit, 'Campak') vacc =.97; %3 persen kemungkinan terkena penyakit unvacc =.10; %90 persen kemungkinan terkena penyakit berakhir
Penjelasan kode:
Fungsi disp() mencetak pernyataan ke layar dan juga mencetak opsi yang berbeda. Penyakit ini akan ditugaskan sesuai. Versi ini saat ini tidak memperhitungkan input yang tidak valid. Input yang tidak valid akan menghasilkan kesalahan dan menghentikan program sepenuhnya. Setiap penyakit memiliki nilai vacc dan unvacc yang terkait dengannya. Nilai-nilai ini TIDAK acak. Kami mendapatkan nilai-nilai ini dari penelitian statistik tentang penyakit.
Selanjutnya, kita perlu menanyakan kepada pengguna apakah mereka ingin menguji ukuran populasi yang besar atau kecil untuk penyakit yang mereka pilih.
disp('Pilih ukuran populasi.')
fprintf('20\n200\n') speed = input('Populasi yang dipilih: ', 's'); if isequal(speed, '20') population_size = 20; elseif isequal(speed, '200') population_size = 200; akhir
Penjelasan kode
Ini mencetak pernyataan kepada pengguna dan meminta pengguna untuk memasukkan ukuran populasi yang ingin diuji. Versi ini saat ini tidak memperhitungkan input yang tidak valid. Input yang tidak valid akan menghasilkan kesalahan dan menghentikan program sepenuhnya. 20 dipilih karena merupakan ukuran sampel kecil yang masih memberikan gambaran yang baik tentang bagaimana infeksi menyebar ke seluruh populasi kecil. 200 orang dipilih sebagai opsi yang lebih besar karena 200 titik yang diplot pada grafik hampir tidak memiliki titik yang tumpang tindih sehingga semuanya dapat dengan mudah dilihat dan dibedakan satu sama lain.
Selanjutnya, kita perlu mencari kecepatan simulasi.
disp('Pilih kecepatan simulasi.')
fprintf('Cepat\nLambat\n') speed = input('Kecepatan yang dipilih: ', 's'); jika sama(kecepatan, 'Cepat') sim_speed = 0; elseif isequal(kecepatan, 'Lambat') sim_speed = 0.25; akhir
Penjelasan kode
Proses ini sama dengan mendapatkan jenis penyakit dan ukuran populasi. Untuk cepat, tidak akan ada jeda. dan untuk yang lambat akan terdapat lag 0,25 detik pada loop for saat menjalankan simulasi.
Besar! Sekarang kita memiliki semua input dari pengguna yang kita butuhkan! Mari beralih ke pengumpulan data untuk berbagai persentase orang yang tidak divaksinasi.
Langkah 13: Pilih % Orang yang Tidak Divaksinasi dan Hitung Rata-rata Orang yang Tidak Divaksinasi dan Terinfeksi untuk Persentase Terpilih
Kode ini untuk 0% orang yang tidak divaksinasi.
% ------- %0 Tidak divaksinasi ------------
per_infect_av_0 = ; persentase_of_unvacc_and_infec_av_0 = ; untuk i = 1:20 out = infeksiSim(unvacc, vacc, population_size, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, out(1, 1)]; persentase_of_unvacc_and_infec_av_0 = [persentase_of_unvacc_and_infec_av_0, keluar(1, 2)]; akhir average_infected_0 = mean(per_infect_av_0); average_unvacc_and_infected_0 = mean(persentase_unvacc_and_infec_av_0);
Penjelasan kode:
Perulangan for dijalankan sebanyak 20 kali. Output dari fungsi, infectionSim(), disimpan di out. Setiap kali for loop berjalan, maka persentase terinfeksi dalam total populasi ditambahkan ke matriks, 'per_infect_av_0'. Selain itu, persentase yang tidak divaksinasi dan terinfeksi juga ditambahkan setiap kali ke dalam matriks 'percentage_of_unvacc_and_infec_av_0'. Dalam dua baris terakhir, kedua matriks yang disebutkan di atas kemudian dirata-ratakan dan disimpan dalam variabel. Singkatnya, persentase disimpan untuk setiap simulasi, rata-rata, dan grafik. Monte Carlo digunakan untuk menunjukkan nilai rata-rata menjalankan simulasi dan menunjukkan hasilnya. Untuk tujuan eksperimental kami, kami memilih untuk menjalankan simulasi 20 kali dan rata-rata nilai tersebut.
Tantangan:
Ulangi untuk semua persentase yang ingin Anda uji! Ini dapat dilakukan dengan mengubah nama variabel sesuai dengan angka persentase. Kami menguji 0%, 5%, 10%, 20%, 30%, dan 50%.
Petunjuk:
Satu-satunya baris yang harus diubah dalam kode yang sebenarnya adalah
out = infeksiSim(unvacc, vacc, population_size, 0, 1, sim_speed);
Ubah nol menjadi persen dalam bentuk desimal. Misalnya, untuk simulasi yang tidak divaksinasi 5%, 0 harus diganti dengan 0,5.
Langkah 14: Grafik: 'Tren Infeksi pada Orang yang Tidak Divaksinasi Vs. Divaksinasi untuk Penyakit Tertentu'
Ini adalah kode untuk membuat grafik tren infeksi pada orang yang tidak divaksinasi vs orang yang tidak divaksinasi.
graph_mat_y = [average_infected_0, average_infected_5, average_infected_10, average_infected_20, average_infected_30, average_infected_50];
graph_mat_x = [0, 5, 10, 20, 30, 50]; kemiringan = (average_infected_5-average_infected_0)/5; line_y = [rata-rata_terinfeksi_0, (kemiringan*50)+rata-rata_terinfeksi_0]; baris_x = [0, 50]; gambar(2) plot(grafik_mat_x, grafik_mat_y); line(line_x, line_y, 'Warna', 'merah', 'Gaya Garis', '--'); title(['Tren Pembatalan Vaksin untuk ', penyakit]); xlabel('Persentase Awal Tidak Divaksinasi'); ylabel('Persentase Akhir Terinfeksi')
Penjelasan kode
baris 1: menetapkan nilai y ke rata-rata persen terinfeksi
baris 2: menetapkan nilai x ke persentase persen awal yang tidak divaksinasi
baris 3: hitung kemiringan 0% dan 5%
baris 4: menyimpan nilai y dari baris. Ini adalah kelanjutan dari bagian 0% hingga 5%.
baris 5: menyimpan nilai y dari baris. Garis ini membentang sepanjang grafik.
baris 6: buat gambar
baris 7: plot grafik nilai x dan y dari persen yang terinfeksi, yang tidak divaksinasi.
baris 8: plot garis. Ini digunakan untuk menunjukkan bahwa itu tidak meningkat secara linier, tetapi secara eksponensial.
baris 9: Tetapkan judul untuk grafik.
baris 10-11: Tetapkan label x dan y untuk grafik.
Sekarang Anda seharusnya dapat melihat bahwa semakin besar persentase populasi yang tidak divaksinasi, semakin besar jumlah infeksi. Anda juga akan melihat bahwa sebagian besar titik yang berubah menjadi merah adalah titik hijau, menunjukkan bahwa vaksin memang membantu sampai taraf tertentu! Semoga Anda menyukai tutorial ini. Komentar jika Anda memiliki pertanyaan!
Langkah 15: Produk Akhir: Seperti Apa Simulasinya
Semua kode dapat ditemukan di sini
Direkomendasikan:
Cara Membuat RADAR Menggunakan Arduino untuk Proyek Sains - Proyek Arduino Terbaik: 5 Langkah
Cara Membuat RADAR Menggunakan Arduino untuk Proyek Sains | Proyek Arduino Terbaik: Hai teman-teman, dalam instruksi ini saya akan menunjukkan kepada Anda bagaimana membuat sistem radar luar biasa yang dibangun menggunakan arduino nano, proyek ini sangat ideal untuk proyek sains dan Anda dapat dengan mudah membuatnya dengan investasi dan peluang yang sangat sedikit jika memenangkan hadiah besar untuk
Otomatisasi Rumah Terkendali Suara (seperti Alexa atau Google Home, tidak perlu Wifi atau Ethernet): 4 Langkah
Otomatisasi Rumah Terkendali Suara (seperti Alexa atau Google Home, tidak diperlukan Wifi atau Ethernet): Ini pada dasarnya adalah relai yang dikendalikan arduino berbasis SMS dengan pengaturan asisten google untuk mengirim pesan pada instruksi suara. Ini sangat mudah dan murah dan berfungsi seperti iklan Alexa dengan Anda peralatan listrik yang ada (jika Anda memiliki smartp
Cara Mendapatkan Wifi Dari Jarak 4 KM atau 2,5 Mil!!! DIPERBARUI UNTUK KECEPATAN LEBIH CEPAT!!!!: 5 Langkah
Cara Mendapatkan Wifi Dari Jarak 4 KM atau 2,5 Mil!!! DIPERBARUI UNTUK KECEPATAN LEBIH CEPAT!!!!: Sudah bertahun-tahun sejak saya memasang posting ini dan saya sangat menghargai semua masukan dan minat yang Anda semua miliki dalam proyek ini! Setelah penelitian dan pengembangan, kami telah menemukan cara untuk membuat pekerjaan ini BAHKAN LEBIH BAIK. Anda tahu apa yang kami butuhkan? LEBIH BANYAK
Pembakar Bertenaga USB! Proyek Ini Dapat Membakar Melalui Plastik / Kayu / Kertas (Proyek yang menyenangkan Juga Harus Kayu yang Sangat Halus): 3 Langkah
Pembakar Bertenaga USB! Proyek Ini Dapat Membakar Plastik/ Kayu / Kertas (Proyek Menyenangkan Juga Harus Kayu Sangat Halus): JANGAN MEMBUAT INI MENGGUNAKAN USB!!!! saya menemukan bahwa itu dapat merusak komputer Anda dari semua komentar. komputer saya baik-baik saja tho. Gunakan pengisi daya telepon 600ma 5v. saya menggunakan ini dan berfungsi dengan baik dan tidak ada yang rusak jika Anda menggunakan steker pengaman untuk menghentikan daya
Bagaimana Mendapatkan Ipod Touch Anda (atau Iphone Jika Anda Benar-Benar Mengacaukannya) untuk Berhenti Menerjang Karena Kekurangan Memori: 3 Langkah
Bagaimana Mendapatkan Ipod Touch Anda (atau Iphone Jika Anda Benar-Benar Mengacaukannya) untuk Berhenti Menerjang Karena Kekurangan Memori: Hai, Pengguna ipod touch dan iphone. Ok, jadi saya yakin kalian semua memiliki pemahaman yang sedikit mendasar tentang cara kerja apple ipod, bukan? Anda membuka aplikasi. Aplikasi itu akan digunakan di mana saja antara mungkin di ipod touch 1G, 5-30MB dari yang tersedia