Isi kandungan:

Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Domba Melalui Simulasi Penyakit: 15 Langkah
Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Domba Melalui Simulasi Penyakit: 15 Langkah

Video: Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Domba Melalui Simulasi Penyakit: 15 Langkah

Video: Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Domba Melalui Simulasi Penyakit: 15 Langkah
Video: 栗本慎一郎『パンツを捨てるサル』全 2024, Julai
Anonim
Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Kawanan Melalui Simulasi Penyakit
Untuk Mendapat Vaksinasi atau Tidak? Projek Mengamati Kekebalan Kawanan Melalui Simulasi Penyakit

Gambaran keseluruhan Projek:

Projek kami meneroka kekebalan kawanan dan berharap dapat mendorong orang untuk mendapatkan vaksinasi untuk mengurangkan kadar jangkitan di komuniti kami. Program kami mensimulasikan bagaimana penyakit menjangkiti populasi dengan peratusan kadar vaksin dan vaksin yang berbeza. Ini menunjukkan kekebalan kawanan dengan menunjukkan bagaimana peningkatan jumlah populasi yang divaksin dapat menurunkan jumlah orang yang terkena.

Kami memodelkannya di Matlab menggunakan konsep teori grafik. Teori grafik adalah kaedah matematik untuk mewakili hubungan antara objek. Dalam teori grafik, grafik mempunyai bucu (atau nod) yang dihubungkan oleh tepi (atau garis). Untuk projek kami, nod adalah individu yang berkenaan dan ujungnya adalah sambungannya. Sebagai contoh, jika dua nod dihubungkan dengan tepi maka itu bermaksud mereka "kawan" atau mempunyai beberapa bentuk hubungan antara satu sama lain. Kenalan ini adalah cara penyebaran penyakit. Inilah sebabnya mengapa kami menggunakan teori grafik untuk memodelkan konsep kami kerana kami ingin melihat bagaimana penyakit merebak di kalangan individu yang berkaitan dalam satu populasi.

Projek kami juga melibatkan Kaedah Monte Carlo. Kaedah Monte Carlo adalah algoritma yang membuat persampelan rawak berulang untuk menerima hasil berangka. Dalam projek kami, kami menggunakan kaedah ini untuk menjalankan simulasi kami beberapa kali mengubah peratus awal tidak divaksinasi untuk melihat kadar di mana orang dijangkiti.

Semua kod projek dipautkan di bahagian bawah!

Kredit PC:

Pautan matlab ke Teori Grafik:

Langkah 1: Buat Matriks Adjacency

Buat Matriks Adjacency
Buat Matriks Adjacency
Buat Matriks Adjacency
Buat Matriks Adjacency

Buat skrip baru. Kita akan memanggil 'jangkitanSim.m' kita.

Kami akan membuat pemboleh ubah 'NUMOFPEOPLE'. Anda boleh menetapkannya ke nilai integer. Ini akan mewakili jumlah orang dalam populasi anda.

Mulai sekarang, kita akan menganggap bahawa

BILANGAN = 20;

Mulakan pertama dengan menggunakan fungsi teori grafik Matlab untuk graf yang tidak diarahkan.

Sekiranya anda berminat untuk mempelajari lebih lanjut, berikut adalah pautan untuk anda membaca lebih mendalam mengenainya.

www.mathworks.com/help/matlab/math/directed-and-undirected-graphs.html

Membuat matriks adjacency.

adjMatrix = sifar (NUMOFPEOPLE);

Ini akan membuat matriks persegi 0s. Setiap baris dalam matriks adalah satu orang. Setiap lajur dalam matriks adalah orang atau rakan yang ditemuinya sepanjang hari.

Lihat Gambar 100 (di atas) untuk membantu menggambarkan penampilan adjMatrix untuk 20 orang.

** Mulai sekarang kita akan menganggap NUMOFPEOPLE sama dengan 20. **

Anda boleh mencuba memetakan matriks adjacency ini. Berikut adalah sedikit lagi maklumat mengenai merancang jenis matriks ini.

Nota: Bagaimana matriks adjacency berfungsi.

Cth:

% membuat matriks bersebelahan

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]% memplot g = graf (a); % menggunakan fungsi graf (teori grafik) rajah (1); h = plot (g);

Lihat Gambar 1 (di atas) untuk melihat cara menambahkan tepi dalam matriks adjacency, menggunakan kod dalam "Catatan".

Langkah 2: Buat Hubungan

Buat Hubungan
Buat Hubungan

Sekarang orang (bucu atau simpul) diciptakan, kita perlu membuat rangkaian hubungan (garis atau tepi grafik). Ini akan mensimulasikan bagaimana orang berinteraksi dan bertemu dengan orang lain sepanjang hari.

Ini boleh dilakukan dengan pelbagai cara. Salah satu cara untuk menyelesaikan tugas ini adalah terlebih dahulu memberikan nombor rawak kepada setiap orang untuk menentukan berapa banyak orang yang akan berinteraksi dalam sehari.

numOfFriendsMatrix = randi ([paling sedikitFriendsPersonCanHave, mostFriendsPersonCanHave], 1, NUMOFPEOPLE);

Ini menjadikan 1 hingga 20 matriks bilangan bulat rawak yang mewakili bilangan interaksi setiap orang dalam sehari. Lajur matriks ini adalah nombor yang sesuai dengan setiap orang. Contohnya, jika kita menetapkan paling sedikitFriendsPersonCanHave = 2 dan mostFriendsPersonCanHave = 5, kita akan mendapat nilai rawak antara 2 dan 5.

Mengalami masalah dengan randi ()? Di terminal, taip

menolong randi

Seterusnya, kami membuat matriks rawak (disebut "allFriendsmatrix") bagaimana setiap orang dalam populasi terhubung / berinteraksi dalam populasi.

tempMatrix = ;

kiraan = 0; allFriendsMatrix = ; untuk k = 1: NUMOFPEOPLE sementara panjang (tempMatrix) ~ = numOfFriendsMatrix (k) kiraan = hitung +1; temp = randi ([1, NUMOFPEOPLE]); tempMatrix (kiraan) = temp; akhir masing-masing kosong sementara panjang (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; tamatkan semuaFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; kiraan = 0; akhir

Penjelasan mendalam mengenai kod:

Mula-mula kita membuat matriks sementara kosong untuk menyimpan senarai rakan / interaksi setiap orang. Kami juga menginisialisasi kiraan, yang hanya mencatat tempat untuk melekatkan sambungan rawak baru di tempMatrix. Gelung berfungsi 20 kali sehingga ini berlaku untuk setiap individu dalam populasi. Gelung sementara yang pertama berjalan sehingga tempMatrix setiap orang sama panjangnya dengan bilangan interaksi yang diberikan secara rawak. Dalam gelung ini, nombor rawak yang sesuai dengan orang dalam populasi dihasilkan dan dimasukkan ke dalam tempMatrix. Kerana panjang setiap tempMatrixes berbeza, kita perlu membuat beberapa nilai NaN sehingga kita dapat menggabungkan semua tempMaticies ini menjadi satu matriks ('allFriendsMatrix'). Gelung sementara kedua menyelesaikan masalah ini dengan menambahkan NaN ke dalam setiap tempMatrix. Gelung sementara ditetapkan untuk berjalan 9 kali kerana ia adalah angka yang lebih besar daripada 5, yang merupakan batas atas rakan yang dapat ditugaskan oleh seseorang. Nilai '9' berubah-ubah dan boleh / mesti diubah apabila 'mostFriendsPersonCanHave' lebih besar daripada 9. Tiga baris terakhir kod (tidak termasuk akhir) menambahkan tempMatrix ke baris berikutnya 'allFriendsMatrix'. Kemudian ia membersihkan tempMatrix dan mengira orang seterusnya.

Pengeluaran

Seperti inilah output yang akan dihasilkan untuk pertama kali melalui gelung untuk (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 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 NaN 16 7 13 10 1 NaN NaN NaN NaN

Seterusnya, tambahkan hubungan ini ke adjMatrix.

untuk masing-masingRow = 1: NUMOFPEOPLE

untuk masing-masingCol = 1: 9 jika isnan (allFriendsMatrix (eachRow, eachCol)) == 0 adjMatrix (eachRow, allFriendsMatrix (eachRow, eachCol)) = 1; adjMatrix (allFriendsMatrix (eachRow, eachCol), eachRow) = 1; hujung hujung hujung

Penjelasan Kod

Double for loop ini melalui setiap baris dan lajur 'allFriendsMatrix'. Pernyataan if akan dijalankan untuk semua nilai yang bukan 'NaN'. Pada dasarnya ia akan membuat tepi atau garis grafik. Jadi baris pertama yang akan dibuat adalah orang 1 hingga orang 16 dan orang 16 ke orang 1. Oleh kerana ia tidak diarahkan, 1 mesti diubah untuk kedua-duanya! Kita tidak boleh hanya mempunyai kelebihan 1 hingga 16 dan bukan 16 hingga 1. Mereka mesti simetri agar dapat berjalan dengan baik di Matlab.

Dalam simulasi kami, kami menetapkan bahawa orang tidak dapat berinteraksi dengan diri mereka sendiri. Apabila kami mengacak nilai, ada kemungkinan matriks bersebelahan kami mempunyai ralat ini.

Mari perbaiki ini dengan kod berikut:

untuk setiap = 1: NUMOFPEOPLE

adjMatrix (masing-masing, masing-masing) = 0; akhir

Penjelasan Kod

Ini untuk gelung memastikan bahawa orang 1 tidak terhubung dengan orang 1, orang 2 tidak terhubung dengan orang 2, dan lain-lain dengan menjadikan semuanya 0. Seperti yang anda lihat di bawah di bahagian output, kita mempunyai pepenjuru segiempat sama matriks dari kiri atas ke kanan bawah adalah semua 0.

Pengeluaran

Ini adalah adjMatrix terakhir untuk simulasi semasa ini. Ini merangkumi semua garis dalam grafik (Gambar 2).

adjMatrix =

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 bahawa program anda dapat membuat grafik dengan sekumpulan orang rawak dan membuat hubungan rawak, kami perlu memasukkan maklumat atau statistik penyakit untuk melihat bagaimana interaksi ini dalam populasi dapat meningkatkan atau mengurangkan jangkitan.

Buat pemboleh ubah berikut:

jenis% unvacc: berganda; peratus kemungkinan orang yang tidak divaksinasi tidak mendapat penyakit

jenis% vaksin: berganda; peratus peluang orang yang diberi vaksin tidak mendapat penyakit unvacc_perc% type: double; peratus populasi yang tidak divaksin init_infect% type: int; peratus penduduk yang diberi vaksin

Seterusnya kita perlu melakukan beberapa pengiraan.

Kami akan membuat 'jangkitanMat' yang merupakan matriks 3 * NUMOFPEOPLE.

vacc_perc = 1-unvacc_perc;

jangkitanMat = nan (3, NUMOFPEOPLE); nombor = bulat (vacc_perc * NUMOFPEOPLE); jangkitanMat (1, 1: nombor) = vaksin; jangkitanMat (1, nombor + 1: akhir) = unvacc; jangkitanMat (2, 1: akhir) = 0; jangkitanMat (2, 1: init_infect) = 1;

Penjelasan Kod

baris 1: Peratus penduduk yang tidak divaksin dikira

baris 2: buat matriks bilangan orang 3 * N

baris 3: ketahui jumlah orang yang divaksin dari peratusan yang divaksin

baris 4: untuk orang yang diberi vaksin, beri mereka kekebalan yang berkaitan dengan pemberian vaksin. Nilai ini diberikan berdasarkan kajian mengenai penyakit ini.

baris 5: untuk penduduk yang lain (orang yang tidak divaksinasi), berikan mereka kekebalan peratus. Nilai ini diberikan berdasarkan kajian mengenai penyakit ini.

baris 6: pada mulanya menetapkan semua orang agar tidak dijangkiti.

baris 7: untuk jumlah orang yang awalnya dijangkiti, isikan pasangan lajur pertama dengan sewajarnya.

Sekarang kita telah menetapkan semua parameter untuk simulasi penyakit, kita akan mengacak peluang apakah orang tersebut (baik yang divaksin maupun yang tidak divaksinasi) dijangkiti. Ini dilakukan pada langkah seterusnya dengan memberikan nilai rawak antara 0 dan 1 kepada setiap orang di baris ketiga 'jangkitanMat' ini.

Langkah 4: Rawak Kemungkinan Orang yang Diovaksinasi dan Tidak Bervaksin Dapat Berjangkit

Seterusnya, berikan setiap orang nombor rawak, ini akan digunakan kemudian untuk menentukan sama ada orang itu dijangkiti atau tidak.

untuk w = 1: panjang (jangkitanMat)

jangkitanMat (3, w) = rand; akhir

Penjelasan kod

Ini untuk gelung berkaitan dengan baris ketiga 'jangkitanMat' yang dibuat pada langkah terakhir. 'rand' memberikan nilai antara 0 dan 1 untuk setiap indeks baris 3.

Pengeluaran

jangkitanMat kini selesai! Ini berlaku dengan populasi dengan pelalian 100% dan 1 orang pada awalnya dijangkiti.

jangkitanMat =

Lajur 1 hingga 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,0869 0,5489 0,3177 0,9927 0,7236 0,5721 0,7172 0,9766 0,4270 0,9130 0,8973 0,8352 ruangan 13 hingga 20 0,7500 0,7500 0,7500 0,7500 0,7500 0,7500 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: Peratus peluang untuk TIDAK mendapat penyakit

baris 2: Jangkitan atau tidak dijangkiti (nilai boolean)

baris 3: Nombor yang digunakan untuk memeriksa sama ada orang yang tidak dijangkiti dijangkiti jika mereka berjumpa dengan orang yang dijangkiti. Sekiranya orang yang tidak dijangkiti berjumpa dengan orang yang dijangkiti, nombor ini lebih besar daripada nombor di baris 1 (untuk lajur yang sama), maka mereka dijangkiti. Kami akan menetapkan fungsi ini pada langkah 7.

Langkah 5: Buat Matriks Orang yang Tidak Diuji dan Dijangkiti Dari Maklumat Awal

Buat 2 matriks yang disebut "matrixUnvacc" dan "matrixInfected" yang menyimpan semua orang yang dijangkiti dari jangkitanMat. Ini akan digunakan agar kita dapat memberi kode warna pada grafik mereka yang dijangkiti, tidak divaksinasi, atau divaksinasi, membantu memvisualisasikan kesan individu yang tidak divaksin berbanding yang divaksinasi.

membersihkan masing-masing

matrixInfected = ; matrixUnvacc = ; untuk h = 1: panjang (jangkitanMat) jika jangkitanMat (1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; hujung akhir untuk orang = 1: NUMOFPEOPLE jika jangkitanMat (2, orang) == 1 matriksInfected = [matrixInfected, person]; hujung akhir

Penjelasan Kod

Buat dua matriks kosong untuk menyimpan bilangan orang yang tidak divaksinasi dan dijangkiti. Kedua-dua untuk gelung dijalankan 20 kali dan jika pernyataan if berpuas hati, maka nombor tersebut akan ditambahkan ke matriks yang betul.

Pengeluaran

matrixUnvacc =

matrixInfected =

[1]

Langkah 6: Grafkan Permulaan Plot

Graf Permulaan Plot
Graf Permulaan Plot

Seterusnya kita akan merancang matriks adjacency.

g = graf (adjMatrix);

rajah (1) p = plot (g, 'NodeColor', 'b', 'MarkerSize', 7); sorotan (p, matrixUnvacc, 'NodeColor', 'g') sorotan (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc * 100; tajuk (['Peratus orang yang tidak divaksinasi:', num2str (title_unvacc), '%']); jeda (kelajuan)

Penjelasan kod

Teori grafik di Matlab telah membina fungsi. Apabila kita menggunakan fungsi grafik (), kita dapat menterjemahkan 'adjMatrix' menjadi grafik yang tidak diarahkan. Kita kemudian harus membuat plot menggunakan fungsi plot () untuk benar-benar melihat seperti apa. Kami menetapkan plot ini () ke pemboleh ubah supaya kami dapat memanipulasi dan mengubah warna plot dengan lebih mudah sepanjang simulasi. Semua orang (atau nod) pada mulanya ditetapkan pada warna 'biru'. Seterusnya, semua orang yang tidak divaksinasi ditetapkan dengan warna 'hijau'. Orang yang dijangkiti kemudian ditetapkan ke warna 'merah'. Tajuk ditetapkan mengikut nilai peratusan tertentu dari orang yang tidak diuji yang diuji. Fungsi jeda () menghentikan pelaksanaan MatLab buat sementara waktu. Kami melalui kelajuan berubah yang disebarkan yang dikira dalam beberapa saat.

Lihat gambar (di atas) untuk melihat graf berkod warna rawak.

Ketahui lebih lanjut mengenai fungsi sorotan () di MatLab.

Langkah 7: Simulasikan Perkembangan Jangkitan

Seterusnya kita perlu mengetahui siapa yang dijangkiti selepas interaksi (direkodkan dalam adjMatrix) dan mengemas kini grafik apabila seseorang dijangkiti.

Gunakan adjMatrix untuk menentukan orang yang dijangkiti selepas interaksi mereka dengan orang dalam sehari.

untuk masing-masingRow = 1: panjang (adjMatrix)

jika jangkitanMat (2, eachRow) == 1 untuk masing-masingCol = 1: panjang (adjMatrix) jika adjMatrix (masing-masingRow, masing-masingCol) == 1% eachRow = orang% eachCol = rakannya% rakan setiap orang dan lihat apakah mereka dijangkiti. jika jangkitanMat (3, masing-masingCol)> jangkitanMat (1, masing-masingCol) jangkitanMat (2, masing-masingCol) = 1; sorotan (p, masing-masingCol, 'NodeColor', 'r') jeda (kelajuan) hujung hujung hujung akhir

Gelung untuk gelung melalui setiap orang. Ia memeriksa bahawa jika orang itu dijangkiti, ia akan memeriksa setiap orang / rakan mereka yang berinteraksi dengannya dan memeriksa apakah tahap imuniti rakan itu lebih besar daripada kekuatan penyakit ini. Di sinilah 'jangkitanMat' yang kita buat sebelumnya dimainkan. Baris 1 dan 3 setiap lajur rakan dibandingkan dan jika baris ke-3 lebih besar, ini bermaksud bahawa rakan itu tidak mempunyai kekebalan yang cukup tinggi untuk melepaskan diri dari penyakit dan akhirnya dijangkiti. Kami juga berubah menjadi warna menggunakan highlight () menjadi merah jika mereka dijangkiti.

Sekarang kod anda untuk simulasi mesti berfungsi! dan untuk sebilangan besar populasi, ubah NUMOFPEOPLE!

Langkah 8: Gunakan Teori Monte Carlo

Untuk melangkah lebih jauh dan mengekstrak data dari simulator kami ('infeksiSim.m'), kami ingin mengira dan menandakan arah aliran peratus orang yang tidak mendapat vaksin yang dijangkiti dan peratus orang yang divaksin yang dijangkiti. Kami membuat hipotesis bahawa peratus orang yang divaksin yang dijangkiti harus jauh lebih rendah daripada peratus orang yang tidak divaksinasi yang dijangkiti.

Langkah 9: Buat Fail ('jangkitanSim.m') Dengan Simulasi Menjadi Fungsi

Untuk menjalankan Monte Carlo, kami ingin menjalankan simulasi berkali-kali dan mengumpulkan data sehingga kami dapat menggunakannya untuk membuat grafik peratusan orang yang dijangkiti.

Fungsi boleh disiapkan seperti ini:

output output = jangkitanSim (unvacc, vaksin, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Komen pemboleh ubah dalam simulasi anda kerana sekarang anda meneruskannya melalui fail utama (kami akan mula menulis ini pada langkah 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Pemboleh ubah baru

kepantasan

akan ditugaskan dalam fail utama (Monte_Carlo.m).

Catatan: Jangan lupa akhir di bahagian bawah fail fungsi untuk mengakhiri fungsi!

Langkah 10: Hitung Peratusan Orang yang Tidak Berpvaksin dan Vaksin yang Telah Berjangkit

Ini mengira peratusan orang yang tidak mendapat vaksin yang dijangkiti. Kod ini terdapat di bahagian bawah fail 'infectionSim.m'.

nombor_of_unvacc = 0;

nombor_of_infec_unvacc = 0; % mengira peratusan orang yang tidak divaksinasi yang dijangkiti x = 1: panjang (jangkitanMat) jika jangkitanMat (1, x) == nombor unvacc_of_unvacc = number_of_unvacc + 1; berakhir jika jangkitanMat (1, x) == unvacc & jangkitanMat (2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; peratusan akhir akhir_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc) * 100;

Penjelasan kod

Dalam gelung untuk, ia akan berulang sebanyak NUMOFPEOPLE kali. Setiap kali nombor dalam jangkitanMat sepadan dengan nombor yang tidak vacc (iaitu 0,95 == 0,95), maka jumlah orang yang tidak divaksinasi akan meningkat sebanyak 1. Setiap kali bilangan dalam jangkitanMat sesuai dengan nombor yang tidak tervakum dan mereka dijangkiti, bilangan yang dijangkiti dan tidak divaksin meningkat sebanyak 1. Baris terakhir membahagikan bilangan orang yang dijangkiti dan tidak divaksinasi dengan jumlah orang yang tidak divaksinasi. Kemudian peratusan dikira dari ini.

Cabaran:

Cuba hitung peratusan vaksin orang yang dijangkiti! (Petunjuk: sangat serupa dengan kod di atas, namun beberapa pemboleh ubah diubah dan nama disesuaikan.)

Seterusnya peratus orang yang dijangkiti berdasarkan jumlah populasi dikira:

pre_per_infect = cumsum (jangkitanMat (2,:));

per_infect = (pre_per_infect (1, NUMOFPEOPLE) / NUMOFPEOPLE) * 100;

Penjelasan kod

Jumlah kumulatif dikira menggunakan baris kedua jangkitanMat, yang menyimpan 1s dan 0s bergantung pada apakah orang itu dijangkiti atau tidak. Oleh kerana fungsi cumsum () memberikan kembali matriks, kita mengambil nilai terakhir dalam matriks ('pre_per_infect (1, NUMOFPEOPLE)'), yang seharusnya merupakan jumlah sebenar semua nilai dari 'infeksiMat (2,:)'. Dengan membagi jumlahnya dengan NUMOFPEOPLE dan mengalikannya dengan 100, kita mendapat peratusan terakhir yang dijangkiti dalam jumlah populasi.

Langkah 11: Buat Pemboleh ubah Output dalam Fungsi Anda 'jangkitanSim.m'

output = [per_infect, percent_of_unvacc_and_infec, peratus_of_vacc_and_infec];

Penjelasan kod

Simpan maklumat ini dalam output, yang akan dikirim kembali ke utama (Monte_Carlo.m) ketika fungsi dipanggil dan selesai dijalankan. Data ini digunakan untuk membuat grafik titik peratusan orang yang dijangkiti yang diberi vaksin dan tidak divaksinasi.

Fungsi 'jangkitanSim.m' anda harus dilakukan sekarang! Namun, ia tidak akan berjalan kerana kita masih perlu menulis yang utama!

Langkah 12: Buat Menu untuk Mendapatkan Syarat Permulaan Simulasi Dari Pengguna

Ingat bagaimana kita mengatakan pemboleh ubah

kepantasan

akan dibuat dan dilalui fungsi utama? Kita perlu mendapatkan nilai untuk meneruskan fungsi tersebut. Perhatikan, urutan nilai ketika memanggil fungsi itu penting!

Mulakan dengan meminta pengguna memasukkan beberapa jawapan ke terminal.

> Pilih penyakit. Perhatikan bahawa peka huruf besar kecil >> Pertusis >> Selsema >> Campak >> Penyakit Terpilih: Selesema >> Pilih saiz populasi. >> 20 >> 200 >> Populasi yang dipilih: 20 >> Pilih kelajuan simulasi. >> Cepat >> Lambat >> Kelajuan yang dipilih: Cepat

Kod di bawah ini menanyakan kepada pengguna penyakit apa yang ingin mereka alami.

disp ('Pilih penyakit. Perhatikan itu peka huruf besar-kecil')

fprintf ('Pertussis / nFlu / nMeasles / n') penyakit = input ('Penyakit Terpilih:', 's'); jika tidak sama (penyakit, 'Pertussis') vaksin =.85; % 15 peratus kemungkinan terkena penyakit unvacc =.20; 80% peluang mendapat penyakit lain jika tidak sama (penyakit, 'Flu') vaksin =.75; % 25 peratus kemungkinan terkena penyakit unvacc =.31; 69% kemungkinan mendapat penyakit lain jika tidak sama (penyakit, 'Campak') vaksin =.97; % 3 peratus kemungkinan mendapat penyakit unvacc =.10; % 90 peratus kemungkinan penyakit berakhir

Penjelasan kod:

Fungsi disp () mencetak pernyataan ke layar dan juga mencetak pelbagai pilihan. Penyakit ini akan ditetapkan dengan sewajarnya. Versi ini tidak memperhitungkan input yang tidak betul. Input yang tidak betul akan menghasilkan ralat dan menghentikan program sepenuhnya. Setiap penyakit mempunyai nilai vaksin dan unvacc yang berkaitan dengannya. Nilai-nilai ini TIDAK rawak. Kami mendapat nilai-nilai ini dari meneliti statistik mengenai penyakit.

Seterusnya, kita perlu bertanya kepada pengguna apakah mereka ingin menguji ukuran populasi yang besar atau kecil untuk penyakit yang mereka pilih.

disp ('Pilih saiz populasi.')

fprintf ('20 / n200 / n ') speed = input (' Populasi yang dipilih: ',' s '); jika isequal (kelajuan, '20') populasi_size = 20; otherif isequal (speed, '200') populasi_size = 200; akhir

Penjelasan kod

Ini mencetak pernyataan kepada pengguna dan meminta pengguna memasukkan berapa jumlah populasi yang ingin diuji. Versi ini tidak memperhitungkan input yang tidak betul. Input yang tidak betul akan menghasilkan ralat dan menghentikan program sepenuhnya. 20 dipilih kerana ukuran sampel kecil yang masih memberikan idea yang baik tentang bagaimana jangkitan menyebar ke seluruh populasi kecil. 200 orang dipilih sebagai pilihan yang lebih besar kerana 200 titik yang dicantumkan pada grafik hampir tidak mempunyai tumpang tindih titik sehingga semuanya dapat dilihat dan dibezakan dengan mudah antara satu sama lain.

Seterusnya, kita perlu mencari kelajuan simulasi.

disp ('Pilih kelajuan simulasi.')

fprintf ('Fast / nSlow / n') speed = input ('Kecepatan dipilih:', 's'); jika sama (kelajuan, 'Cepat') sim_speed = 0; otherif isequal (speed, 'Slow') sim_speed = 0.25; akhir

Penjelasan kod

Proses ini sama seperti mendapatkan jenis penyakit dan jumlah populasi. Untuk cepat, tidak akan ada jeda. dan untuk lambat, akan ada jeda 0.25 saat dalam loop untuk menjalankan simulasi.

Hebat! Sekarang kita mempunyai semua input dari pengguna yang kita perlukan! Mari kita terus mengumpulkan data untuk peratusan orang yang tidak divaksin yang berbeza.

Langkah 13: Pilih% Orang yang Tidak Bervaksin dan Hitung Purata Orang yang Tidak Diuji dan Dijangkiti untuk Peratus yang Dipilih

Kod ini adalah untuk 0% orang yang tidak divaksinasi.

% -------% 0 Tanpa Vaksin ------------

per_infect_av_0 = ; peratusan_of_unvacc_and_infec_av_0 = ; untuk i = 1:20 out = jangkitanSim (unvacc, vacc, pop_size, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, keluar (1, 1)]; peratus_of_unvacc_and_infec_av_0 = [peratus_of_unvacc_and_infec_av_0, keluar (1, 2)]; akhir rata-rata_infected_0 = min (per_infect_av_0); rata-rata_unvacc_and_infected_0 = min (peratus_of_unvacc_and_infec_av_0);

Penjelasan kod:

Gelung untuk dijalankan 20 kali. Output dari fungsi, infeksi Sim (), disimpan di luar. Setiap kali loop for dijalankan, maka peratusan yang dijangkiti dalam jumlah populasi ditambahkan ke matriks, 'per_infect_av_0'. Selain itu, peratusan tidak divaksinasi dan dijangkiti juga ditambahkan setiap kali ke dalam matriks 'percent_of_unvacc_and_infec_av_0'. Dalam dua baris terakhir, kedua-dua matriks yang disebutkan di atas kemudian rata-rata dan disimpan dalam pemboleh ubah. Ringkasnya, peratusan disimpan untuk setiap simulasi, rata-rata, dan grafik. Monte Carlo digunakan untuk menunjukkan nilai rata-rata menjalankan simulasi dan menunjukkan hasilnya. Untuk tujuan eksperimen kami, kami memilih untuk menjalankan simulasi 20 kali dan nilai rata-rata nilai tersebut.

Cabaran:

Ulangi untuk semua peratusan yang ingin anda uji! Ini dapat dilakukan dengan menukar nama pemboleh ubah mengikut angka peratusan. Kami menguji 0%, 5%, 10%, 20%, 30%, dan 50%.

Petunjuk:

Satu-satunya garis yang mesti diubah dalam kod sebenarnya adalah

out = jangkitanSim (unvacc, vaksin, populasi_size, 0, 1, sim_speed);

Tukar sifar hingga peratus dalam bentuk perpuluhan. Sebagai contoh, untuk simulasi 5% tanpa vaksin, 0 harus diganti dengan 0,5.

Langkah 14: Grafik: 'Trend Jangkitan pada Vaksin Tidak Bervaksin. Vaksin untuk Penyakit yang Ditentukan '

Ini adalah kod untuk membuat grafik trend jangkitan pada orang yang tidak divaksin berbanding orang yang tidak divaksinasi.

graph_mat_y = [rata-rata_infeksi_0, rata-rata_infeksi_5, rata-rata_infeksi_10, rata-rata_infeksi_20, rata-rata_infeksi_30, rata-rata_infeksi_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; cerun = (purata_infeksi_5-rata-rata_infeksi_0) / 5; line_y = [rata-rata_infeksi_0, (cerun * 50) + rata-rata_infeksi_0]; line_x = [0, 50]; rajah (2) plot (graph_mat_x, graph_mat_y); line (line_x, line_y, 'Color', 'red', 'LineStyle', '-'); tajuk (['Trend in Unvaccination for', penyakit]); xlabel ('Peratusan Awal Tidak Dipvaksinasi'); ylabel ('Peratus Akhir Terinfeksi')

Penjelasan kod

baris 1: memberikan nilai y kepada purata peratus yang dijangkiti

baris 2: menetapkan nilai x kepada peratusan peratus awal yang tidak divaksinasi

baris 3: hitung cerun 0% dan 5%

baris 4: menyimpan nilai-nilai garis. Ini adalah kesinambungan dari bahagian 0% hingga 5%.

baris 5: menyimpan nilai-nilai garis. Garis ini merangkumi panjang graf.

baris 6: buat angka

baris 7: plotkan graf x dan nilai y dari peratus yang dijangkiti, yang tidak divaksinasi.

baris 8: plot garis. Ini digunakan untuk menunjukkan bahawa ia tidak meningkat secara linear, tetapi secara eksponensial.

baris 9: Tetapkan tajuk untuk grafik.

baris 10-11: Tetapkan label x dan y untuk graf.

Sekarang anda seharusnya dapat melihat bahawa semakin besar peratusan penduduk yang tidak divaksinasi, semakin banyak jumlah jangkitan. Anda juga akan melihat bahawa sebahagian besar titik yang berubah menjadi merah adalah titik hijau, yang menunjukkan bahawa vaksin membantu sehingga tahap tertentu! Harap anda menyukai tutorial ini. Komen jika anda mempunyai sebarang pertanyaan!

Langkah 15: Produk Akhir: Seperti apa Simulasi

Semua kod boleh didapati di sini

Disyorkan: