Daftar Isi:

Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit: 15 Langkah
Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit: 15 Langkah

Video: Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit: 15 Langkah

Video: Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit: 15 Langkah
Video: Empat Juta Tenaga Kesehatan Diutamakan untuk Mendapatkan Vaksin Covid-19 Dosis Keempat 2024, November
Anonim
Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit
Untuk Mendapatkan Vaksinasi atau Tidak? Proyek Pengamatan Herd Immunity Melalui Simulasi Penyakit

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 Matriks Kedekatan
Buat Matriks Kedekatan
Buat Matriks Kedekatan
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

Buat Hubungan
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

Plot Grafik Awal
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: