İçindekiler:

Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi: 15 Adım
Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi: 15 Adım

Video: Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi: 15 Adım

Video: Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi: 15 Adım
Video: Corona ile Savaşanlar Demo Günü 2024, Kasım
Anonim
Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi
Aşı Olmak ya da Olmamak? Hastalık Simülasyonu ile Sürü Bağışıklığının Gözlenmesi Projesi

Projeye Genel Bakış:

Projemiz, sürü bağışıklığını araştırıyor ve topluluklarımızdaki enfeksiyon oranlarını azaltmak için insanları aşı olmaya teşvik etmeyi umuyor. Programımız, farklı aşılanmış ve aşılanmamış oran yüzdeleriyle bir hastalığın bir popülasyonu nasıl etkilediğini simüle eder. Aşılanan nüfusun artmasının etkilenen insan sayısını nasıl azaltabileceğini göstererek sürü bağışıklığını gösterir.

Bunu Matlab'da çizge teorisi kavramlarını kullanarak modelliyoruz. Grafik teorisi, nesneler arasındaki ilişkileri temsil etmenin matematiksel bir yoludur. Grafik teorisinde, grafiklerin kenarlar (veya çizgiler) ile birbirine bağlanan köşeleri (veya düğümleri) vardır. Projemiz için düğümler ilgili bireylerdir ve kenarlar onların bağlantılarıdır. Örneğin, iki düğüm bir uçla bağlantılıysa, bu onların "arkadaş" oldukları veya birbirleriyle bir tür temasları olduğu anlamına gelir. Bu temas, hastalığın yayılmasının bir yoludur. Bu nedenle konseptimizi modellemek için grafik teorisini kullandık çünkü bir popülasyonda birbirine bağlı bireyler arasında hastalığın nasıl yayıldığını görmek istedik.

Projemiz ayrıca Monte Carlo Metodu'nu da içermektedir. Monte Carlo yöntemi, sayısal sonuçlar almak için tekrarlanan rastgele örnekleme oluşturan algoritmalardır. Projemizde, insanların enfekte olma oranını görmek için ilk aşılanmamışların yüzdesini değiştirerek simülasyonumuzu birkaç kez çalıştırmak için bu yöntemi kullanıyoruz.

Tüm proje kodu altta bağlantılıdır!

PC Kredisi:

Grafik Teorisine Matlab bağlantısı:

Adım 1: Bitişiklik Matrisi Oluşturun

Bitişiklik Matrisi Oluştur
Bitişiklik Matrisi Oluştur
Bitişiklik Matrisi Oluştur
Bitişiklik Matrisi Oluştur

Yeni bir komut dosyası oluşturun. Bizimkine 'infectionSim.m' diyeceğiz.

Bir 'NUMOFPEOPLE' değişkeni oluşturacağız. Herhangi bir tamsayı değerine atayabilirsiniz. Bu, popülasyonunuzdaki insan sayısını temsil edecektir.

Şu andan itibaren, bunu varsayacağız

SAYIKİŞİ = 20;

İlk olarak, yönsüz bir grafik için Matlab'ın çizge teorisi fonksiyonlarını kullanarak başlayın.

Daha fazlasını öğrenmekle ilgileniyorsanız, bu konuda daha ayrıntılı okumanız için bir bağlantı burada.

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

Bir komşuluk matrisi oluşturuldu.

adjMatrix = sıfırlar(NUMOFPEOPLE);

Bu, 0'lardan oluşan bir kare matris oluşturacaktır. Matristeki her satır bir kişidir. Matristeki her sütun, kişinin gün boyunca tanıştığı bir kişi veya arkadaştır.

20 kişi için adjMatrix'in nasıl göründüğünü görselleştirmeye yardımcı olması için Şekil 100'e (yukarıda) bakın.

**Bu noktadan sonra NUMOFPEOPLE'ın 20'ye eşit olduğunu varsayacağız.**

Bu komşuluk matrisini çizmeyi deneyebilirsiniz. İşte bu tür matrislerin çizilmesi hakkında biraz daha bilgi.

Not: Komşuluk matrisi nasıl çalışır.

Eski:

%bitişik matrisi yapma

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] %çizim g = grafik(a); % grafik fonksiyonunu kullanarak (grafik teorisi) şekil(1); h = arsa(g);

"Not" bölümündeki kodu kullanarak komşuluk matrisine kenarların nasıl ekleneceğini görmek için Şekil 1'e (yukarıda) bakın.

Adım 2: İlişkiler Oluşturun

İlişkiler Oluşturun
İlişkiler Oluşturun

Artık insanlar (köşeler veya düğümler) oluşturulduğuna göre, bir ilişkiler ağı (grafiğin çizgileri veya kenarları) oluşturmamız gerekiyor. Bu, insanların bir gün boyunca nasıl etkileşime girdiğini ve diğer insanlarla nasıl tanıştığını simüle edecektir.

Bu birçok yolla yapılabilir. Bu görevi tamamlamanın bir yolu, her bir kişinin bir günde kaç kişiyle etkileşime gireceğini belirlemek için önce her kişiye rastgele bir sayı atamaktır.

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

Bu, her kişinin bir günde sahip olduğu etkileşim sayısını temsil eden 1'e 20 rastgele tamsayı matrisi yapar. Bu matrisin sütunları, her bir kişiye karşılık gelen sayı olacaktır. Örneğin, en azFriendsPersonCanHave = 2 ve çoğuFriendsPersonCanHave = 5'i atarsak, 2 ile 5 arasında rastgele değerler alırız.

randi() ile ilgili sorun mu yaşıyorsunuz? Terminalde, yazın

randi'ye yardım et

Daha sonra, popülasyondaki her bir kişinin popülasyon içinde nasıl bağlantılı/etkileşim içinde olduğuna dair rastgele bir matris ("allFriendsmatrix" olarak adlandırılır) yaparız.

tempMatrix = ;

sayı = 0; allFriendsMatrix = ; için k = 1:NUMOFPEOPLE while length(tempMatrix) ~= numOfFriendsMatrix(k) count = count +1; temp = randi([1, NUMOFPEOPLE]); tempMatrix(sayım) = temp; end her birini temizle while length(tempMatrix) ~= 9 tempMatrix = [tempMatrix, NaN]; allFriendsMatrix'i sonlandır = [allFriendsMatrix; tempMatrix]; tempMatrix = ; sayı = 0; son

Kodun ayrıntılı açıklaması:

İlk önce her kişinin arkadaş/etkileşim listesini tutmak için boş bir geçici matris oluşturuyoruz. Ayrıca, yeni rastgele bağlantının tempMatrix'te nereye yapıştırılacağını takip eden sayımı da başlatıyoruz. For döngüleri 20 kez çalıştırılır, böylece bu, popülasyondaki her bir kişi için gerçekleşir. İlk while döngüsü, her kişinin tempMatrix'i rastgele atanan etkileşim sayısıyla aynı uzunlukta olana kadar çalışır. Bu döngüde, popülasyondaki kişiye karşılık gelen rastgele bir sayı üretilir ve tempMatrix'e yerleştirilir. TempMatrix'lerin her birinin uzunlukları farklı olduğundan, tüm bu tempMaticies'i tek bir matriste ('allFriendsMatrix') birleştirebilmek için bazı NaN değerleri oluşturmamız gerekiyordu. İkinci while döngüsü, her bir tempMatrix'e NaN'ler ekleyerek bu sorunu çözer. while döngüsü, bir kişinin atanabileceği arkadaşların üst sınırı olan 5'ten büyük bir sayı olduğu için 9 kez çalışacak şekilde ayarlandı. '9' değeri değişkendir ve 'mostFriendsPersonCanHave' 9'dan büyük olduğunda değiştirilebilir/değiştirilmelidir/değiştirilmelidir/değiştirilmelidir/değiştirilmelidir. Kodun son üç satırı (son hariç) tempMatrix'i 'allFriendsMatrix'in sonraki satırına ekler. Sonra tempMatrix'i temizler ve bir sonraki kişi için sayılır.

Çıktı

Bu, for döngüsü boyunca ilk çalıştırmada (son üç satırdan önce) çıktının nasıl görünmesi gerektiğidir.

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

tümArkadaşlarMatrisi =

16 8 17 16 13 NaN NaN NaN NaN 8 8 2 7 11 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 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 10 19 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

Ardından, bu ilişkileri adjMatrix'e ekleyin.

herSatır için = 1:NUMOFPEOPLE

for herCol = 1:9 if isnan(allFriendsMatrix(eachRow, EachCol)) == 0 adjMatrix(eachRow, allFriendsMatrix(eachRow, EachCol)) = 1; adjMatrix(allFriendsMatrix(eachRow, eachCol), eachRow) = 1; son son son

Kod Açıklama

Bu double for döngüsü, 'allFriendsMatrix'in her satırından ve sütunundan geçer. if ifadesi 'NaN' olmayan tüm değerler için çalışacaktır. Temel olarak grafiğin kenarlarını veya çizgilerini oluşturacaktır. Yani bunun yapacağı ilk satır 1. kişi ile 16. kişi ve 16. kişi 1. kişidir. Yönsüz olduğundan, her ikisi için de 1 değiştirilmelidir! Sadece 1'den 16'ya ve 16'dan 1'e kadar kenarlara sahip olamayız. Matlab'da düzgün çalışması için simetrik olmaları gerekir.

Simülasyonumuzda, insanların kendileriyle etkileşime giremeyeceğini belirledik. Değerleri rastgele seçtiğimizde, bitişik matrisimizin bu hatalara sahip olma olasılığı vardır.

Bunu aşağıdaki kodla düzeltelim:

her biri için = 1:NUMOFPEOPLE

adjMatrix(her biri, her biri) = 0; son

Kod Açıklama

Bu for döngüsü hepsini 0 yaparak 1. kişinin 1. kişiye, 2. kişinin 2. kişiye bağlı olmamasını sağlar. sol üstten sağ alta kadar olan matrislerin hepsi 0'dır.

Çıktı

Bu, mevcut simülasyon için son adjMatrix'tir. Bu, grafikteki tüm çizgileri hesaba katar (Şekil 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

'adjMatrix' grafiğini görmek için Şekil 2'ye bakın.

Adım 3: Hastalık İstatistiklerini ekleyin

Artık programınız bir dizi rastgele insanla bir grafik oluşturabildiğine ve rastgele ilişkiler oluşturabildiğine göre, bir popülasyondaki bu etkileşimlerin enfeksiyonu nasıl artırabileceğini veya azaltabileceğini görmek için hastalığın bilgilerini veya istatistiklerini girmemiz gerekiyor.

Bu değişkenleri oluşturun:

unvacc %type: çift; aşılanmamış kişilerin hastalığa yakalanmama yüzdesi

vacc %type: çift; aşılanmış kişilerin hastalığa yakalanmama yüzdesi unvacc_perc %type: double; aşılanmamış nüfus yüzdesi init_infect %type: int; aşılanan nüfus yüzdesi

Daha sonra bazı hesaplamalar yapmamız gerekiyor.

3*NUMOFPEOPLE matris olan bir 'infectionMat' yapacağız.

vacc_perc = 1-unvacc_perc;

enfeksiyonMat = nan(3, NUMOFPEOPLE); sayı = round(vacc_perc * NUMOFPEOPLE); enfeksiyonMat(1, 1:sayı) = vacc; enfeksiyonMat(1, sayı+1:son) = unvacc; enfeksiyonMat(2, 1:son) = 0; enfeksiyonMat(2, 1:init_infect) = 1;

Kod Açıklama

1. satır: Hesaplanan aşılanmamış nüfus yüzdesi

2. satır: 3*N sayıda insan matrisi oluşturun

3. satır: aşılanan yüzdeden aşılanan kişi sayısını bulun

4. satır: aşılı kişiler için, onlara aşı olmayla bağlantılı bir bağışıklık kazandırın. Bu değer, hastalıkla ilgili araştırmalara dayalı olarak atanır.

satır 5: nüfusun geri kalanı için (aşılanmamış kişiler), onlara yüzde bağışıklık verin. Bu değer, hastalıkla ilgili araştırmalara dayalı olarak atanır.

satır 6: başlangıçta tüm insanları enfekte olmayacak şekilde ayarlayın.

7. satır: Başlangıçta enfekte olan kişi sayısı için ilk birkaç sütunu buna göre doldurun.

Artık hastalık simülasyonu için tüm parametreleri belirlediğimize göre, kişinin (hem aşılı hem de aşısız) enfekte olup olmama şansını rastgele belirleyeceğiz. Bu, bir sonraki adımda, bu 'infectionMat'in üçüncü satırındaki her kişiye 0 ile 1 arasında rastgele değerler atayarak yapılır.

Adım 4: Aşılı ve Aşısız Bir Kişinin Enfekte Olma Şansını Rastgele Belirleyin

Ardından, her kişiye rastgele bir sayı atayın, bu daha sonra kişinin enfekte olup olmadığını belirlemek için kullanılacaktır.

w = 1:uzunluk(infectionMat) için

enfeksiyonMat(3, w) = rand; son

Kod açıklaması

Bu for döngüsü, son adımda oluşturulan 'infectionMat'in üçüncü satırıyla ilgilidir. 'Rand', 3. satırın her dizinine 0 ile 1 arasında bir değer atar.

Çıktı

enfeksiyonMat şimdi tamamlandı! Bu, %100 aşılanmış ve 1 kişi başlangıçta enfekte olmuş bir popülasyondaydı.

enfeksiyonMat =

1'den 12'ye kadar olan sütunlar 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.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.7500 0.7500 0.7500 0.7500 0.7500 0.8973 0.7500 ile 0.7500 0.8973 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

1. sıra: Hastalığa yakalanmama yüzdesi

2. satır: Etkilenmiş veya etkilenmemiş (boole değeri)

3. sıra: Enfekte olmayan bir kişinin enfekte bir kişiyle karşılaştığında enfekte olup olmadığını kontrol etmek için kullanılan sayı. Enfekte olmayan kişi enfekte kişiyle karşılaşırsa, bu sayı satır 1'deki sayıdan (aynı sütun için) daha büyüktür, o zaman bu kişi enfekte olur. Bu işlevi 7. adımda kodlayacağız.

Adım 5: İlk Bilgilerden Aşılanmamış ve Enfekte Olan Kişilerin Matrislerini Oluşturun

"matrixUnvacc" ve "matrixInfected" olarak adlandırılan ve enfeksiyon bulaşmış tüm kişileri enfeksiyonMat'tan depolayan 2 matris oluşturun. Bu, enfekte olmuş, aşılanmamış veya aşılanmış kişilerin grafiğini renkle kodlayabilmemiz için kullanılacak ve aşısız ve aşılı bireylerin etkisini görselleştirmeye yardımcı olacaktır.

her birini temizle

matrixInfected = ; matrixUnvacc = ; h= 1:uzunluk(infectionMat) için enfeksiyonMat(1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1:NUMOFPEOPLE iffectionMat(2, person) == 1 matrixInfected = [matrixInfected, person]; son son

Kod Açıklama

Sırasıyla aşılanmamış ve enfekte olan kişilerin sayısını saklamak için iki boş matris oluşturun. Her iki for döngüsü de 20 kez çalışır ve if ifadesi karşılanırsa sayı doğru matrise eklenir.

Çıktı

matrisUnvacc =

matrixInfected =

[1]

Adım 6: İlk Grafiği Çizin

Arsa İlk Grafiği
Arsa İlk Grafiği

Daha sonra komşuluk matrisini çizeceğiz.

g = grafik(adjMatrix);

şekil(1) p = arsa(g, 'NodeColor', 'b', 'MarkerSize', 7); Highlight(p, matrixUnvacc, 'NodeColor', 'g') Highlight(p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title(['Aşılanmamış kişilerin yüzdesi: ', num2str(title_unvacc), '%']); duraklat(hız)

Kod açıklaması

Matlab'daki grafik teorisi, yerleşik işlevlere sahiptir. graph() işlevini kullandığımızda, 'adjMatrix'i gerçek bir yönsüz grafiğe çevirebiliriz. Daha sonra neye benzediğini görmek için plot() işlevini kullanarak bir grafik oluşturmamız gerekir. Simülasyon boyunca grafiğin renklerini daha kolay işleyebilmemiz ve değiştirebilmemiz için bu plot()'u bir değişkene ayarladık. Tüm insanlar (veya düğümler) başlangıçta 'mavi' renge ayarlanır. Daha sonra, aşılanmamış tüm insanlar 'yeşil' renge ayarlanır. Enfekte kişiler daha sonra 'kırmızı' renge ayarlanır. Başlık, test edilen aşılanmamış kişilerin belirli yüzde değerine göre belirlenir. Pause() işlevi, MatLab yürütmesini geçici olarak durdurur. Saniye cinsinden hesaplanan yayılma hızı değişkeninden geçiyoruz.

Rastgele renk kodlu bir grafik görmek için resme (yukarıdaki) bakın.

MatLab'deki vurgu() işlevi hakkında daha fazla bilgi edinin.

Adım 7: Enfeksiyonun İlerlemesini Simüle edin

Daha sonra, etkileşimlerden sonra (adjMatrix'te kaydedilmiştir) kimin bulaştığını bulmamız ve birine virüs bulaştığında grafiği güncellememiz gerekiyor.

Bir gün içinde insanlarla etkileşimlerinden sonra hangi kişilerin enfekte olduğunu belirlemek için adjMatrix'i kullanın.

herSatır için = 1:uzunluk(adjMatrix)

iffectionMat(2, EachRow) == 1 for herCol = 1:length(adjMatrix) if adjMatrix(eachRow, EachCol) == % 1 EveryRow = kişi % HerCol = arkadaşı % her kişinin arkadaşı ve virüs bulaşıp bulaşmadığına bakın. if enfeksiyonunMat(3, herbirCol) > enfeksiyonunMat(1, herCol) enfeksiyonunMat(2, herbirCol) = 1; vurgulama(p, herCol, 'NodeColor', 'r') duraklatma(hız) bitiş bitiş bitiş bitiş

For döngüsü, her bir kişinin içinden geçer. Kişinin enfekte olup olmadığını kontrol eder, etkileşimde bulunduğu her kişiyi/arkadaşını kontrol eder ve arkadaşının bağışıklık seviyesinin hastalığın gücünden daha yüksek olup olmadığını kontrol eder. İşte burada daha önce yarattığımız 'infectionMat' devreye giriyor. Arkadaşın her sütununun 1. ve 3. sırası karşılaştırılır ve 3. sıra daha büyükse, arkadaşın hastalıktan kaçmak için yeterince yüksek bağışıklığa sahip olmadığı ve nihayetinde enfekte olduğu anlamına gelir. Ayrıca, virüs bulaşırlarsa, vurgu() işlevini kullanarak rengi kırmızıya değiştiririz.

Şimdi simülasyon için kodunuz çalışmalı! ve her büyüklükteki nüfus için NUMOFPEOPLE'ı değiştirmeniz yeterli!

Adım 8: Monte Carlo Teorisini Kullanın

Bunu bir adım daha ileri götürmek ve simülatörümüzden ('infectionSim.m') veri çıkarmak için, aşılanmamış ve enfekte olan kişilerin yüzdesi ve aşılı kişilerin enfekte olan yüzdesi olarak trendi hesaplamak ve grafiğini çizmek istedik. Enfekte olan aşılı kişilerin yüzdesinin, enfekte olan aşısız kişilerin yüzdesinden çok daha düşük olması gerektiğini varsayıyoruz.

Adım 9: Dosyayı ('infectionSim.m') Simülasyonla Bir Fonksiyona Dönüştürün

Monte Carlo'yu çalıştırmak için simülasyonu birden çok kez çalıştırmak ve veri toplamak istiyoruz, böylece bunu enfekte olan kişilerin yüzdelerini grafikte kullanmak için kullanabiliriz.

İşlev şu şekilde kurulabilir:

işlev çıktısı = enfeksiyonSim(unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, hız)

Simülasyonunuzdaki değişkenleri yorumlayın, çünkü artık bunları ana dosyadan geçiriyorsunuz (12. adımda bunu yazmaya başlayacağız):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

yeni değişken

hız

ana dosyada (Monte_Carlo.m) atanacaktır.

Not: Fonksiyonu sonlandırmak için fonksiyon dosyasının en altındaki bitişi unutmayınız!

Adım 10: Enfekte Olan Aşısız ve Aşılı Kişilerin Yüzdesini Hesaplayın

Bu, enfekte olan aşılanmamış kişilerin yüzdesini hesaplar. Bu kod, 'infectionSim.m' dosyasının en altında yer alır.

number_of_unvacc = 0;

number_of_infec_unvacc = 0; %, enfeksiyonMat(1, x) == unvacc number_of_unvacc = number_of_unvacc+1; ise x = 1:length(infectionMat) için enfekte olan aşılanmamış kişilerin yüzdesini hesaplar son ise enfeksiyonMat(1, x) == unvacc & enfeksiyonMat(2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; bitiş yüzde_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Kod açıklaması

for döngüsünde, NUMOFPEOPLE kez döngü yapacaktır. EnfeksiyonMat'taki sayı unvacc numarasına her karşılık geldiğinde (yani 0.95 == 0.95), o zaman aşılanmamış kişi sayısı 1 artar. enfekte ve aşısızların sayısı 1 artar. Son satır, enfekte, aşısız insan sayısını toplam aşısız insan sayısına böler. Daha sonra yüzde bundan hesaplanır.

Meydan okuma:

Enfekte olan kişilerin aşılanmış yüzdesini hesaplamaya çalışın! (İpucu: yukarıdaki koda çok benzer, ancak bazı değişkenler değiştirilir ve adlar ayarlanır.)

Daha sonra toplam nüfusa göre enfekte olan kişilerin yüzdesi hesaplanır:

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

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

Kod açıklaması

Kümülatif toplam, kişinin enfekte olup olmadığına bağlı olarak 1'leri ve 0'ları saklayan enfeksiyon Mat'ın ikinci satırı kullanılarak hesaplanır.cumsum() işlevi bir matrisi geri verdiği için, matristeki son değeri ('pre_per_infect(1, NUMOFPEOPLE)') alırız, bu 'infectionMat(2,:)' içindeki tüm değerlerin gerçek toplamı olmalıdır. Toplamı NUMOFPEOPLE'a bölüp 100 ile çarparak, toplam nüfustaki son enfekte yüzdesini elde ederiz.

Adım 11: 'infectionSim.m' İşlevinizde bir Çıktı Değişkeni Oluşturun

çıktı = [per_infect, 20%_of_unvacc_and_infec, yüzde_of_vacc_and_infec];

Kod açıklaması

Bu bilgiyi, işlev çağrıldığında ve çalıştırıldığında ana (Monte_Carlo.m) dosyasına geri gönderilecek olan çıktıda saklayın. Bu veriler, aşılı ve aşısız olanların enfekte yüzdelerinin grafiğini çıkarmak için kullanılır.

'infectionSim.m' işleviniz şimdi yapılmalıdır! Ancak, çalışmayacak çünkü hala ana yazmamız gerekiyor!

Adım 12: Kullanıcıdan Simülasyonun Başlangıç Koşullarını Almak İçin Bir Menü Oluşturun

Değişkeni nasıl söylediğimizi hatırla

hız

oluşturulacak ve ana işlevden geçirilecek mi? Fonksiyona geçmek için değerleri elde etmemiz gerekiyor. Not, işlevi çağırırken değerlerin sırası önemlidir!

Kullanıcıdan terminale bazı cevaplar yazmasını isteyerek başlayın.

> Bir hastalık seçin. Büyük/küçük harfe duyarlı olduğunu unutmayın >> Boğmaca >> Grip >> Kızamık >> Seçilen Hastalık: Grip >> Nüfusun boyutunu seçin. >> 20 >> 200 >> Seçilen popülasyon: 20 >> Simülasyonun hızını seçin. >> Hızlı >> Yavaş >> Seçilen hız: Hızlı

Aşağıdaki kod, kullanıcıya hangi hastalığı incelemek istediğini sorar.

disp('Bir hastalık seçin. Büyük/küçük harf duyarlı olduğunu unutmayın')

fprintf('Boğmaca\nGrip\nKızamık\n') hastalık = input('Seçilen Hastalık: ', 's'); if isequal(hastalık, 'Boğmaca') vacc =.85; %15 hastalık kapma olasılığı aşısız =.20; Eğer eşitse(hastalık, 'Grip') hastalığa yakalanma olasılığı %80 vacc =.75; %25 hastalık kapma olasılığı aşısız =.31; %69 başka bir durumda hastalığa yakalanma şansı eşittir(hastalık, 'Kızamık') vacc =.97; %3 hastalık aşılanmama şansı =.10; Hastalığı bitirme şansı yüzde 90

Kod açıklaması:

disp() işlevi, ifadeyi ekrana yazdırır ve ayrıca farklı seçenekleri yazdırır. Hastalık buna göre atanacaktır. Bu sürüm şu anda geçersiz girişi hesaba katmamaktadır. Geçersiz giriş bir hata üretecek ve programı tamamen durduracaktır. Her hastalığın kendisiyle ilişkili vacc ve unvacc değerleri vardır. Bu değerler rastgele DEĞİLDİR. Bu değerleri hastalıklarla ilgili istatistik araştırmalarından elde ettik.

Ardından, kullanıcıya seçtikleri hastalık için büyük veya küçük bir popülasyon boyutunu test etmek isteyip istemediğini sormamız gerekiyor.

disp('Nüfus boyutunu seçin.')

fprintf('20\n200\n') speed = input('Seçilen popülasyon: ', 's'); if isequal(hız, '20') popülasyon_boyutu = 20; elseif isequal(hız, '200') popülasyon_boyutu = 200; son

Kod açıklaması

Bu, kullanıcıya bir ifade yazdırır ve kullanıcıdan test etmek istediği popülasyonun boyutunu girmesini ister. Bu sürüm şu anda geçersiz girişi hesaba katmamaktadır. Geçersiz giriş bir hata üretecek ve programı tamamen durduracaktır. 20, enfeksiyonun küçük bir popülasyona nasıl yayıldığına dair hala iyi bir fikir veren küçük bir örnek boyutu olduğu için seçildi. 200 kişi daha büyük seçenek olarak seçildi, çünkü grafikte çizilen 200 nokta, neredeyse hiç çakışma noktasına sahip değildi, böylece her şey kolayca görülebiliyor ve birbirinden ayırt edilebiliyordu.

Ardından, simülasyonun hızını bulmamız gerekiyor.

disp('Simülasyon hızını seçin.')

fprintf('Hızlı\nYavaş\n') hız = input('Seçilen hız: ', 's'); if isequal(hız, 'Hızlı') sim_speed = 0; elseif isequal(hız, 'Yavaş') sim_speed = 0.25; son

Kod açıklaması

Bu süreç, hastalığın türünü ve nüfus büyüklüğünü elde etmekle aynıydı. Hızlı için duraklama olmayacak. ve yavaş için, simülasyon çalıştırılırken for döngüsünde 0,25 saniyelik bir gecikme olacaktır.

Harika! Artık ihtiyacımız olan kullanıcıdan gelen tüm girdilere sahibiz! Aşılanmamış kişilerin farklı yüzdeleri için veri toplamaya geçelim.

Adım 13: Aşılanmamış Kişilerin Yüzdesini Seçin ve Seçilen Yüzde için Aşılanmamış ve Enfekte Ortalamasını Hesaplayın

Bu kod aşılanmamış kişilerin %0'ı içindir.

% ------- %0 Aşılanmamış ------------

per_infect_av_0 = ; yüzde_of_unvacc_and_infec_av_0 = ; için i = 1:20 çıkış = enfeksiyonSim(unvacc, vacc, popülasyon_boyutu, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, out(1, 1)]; yüzde_of_unvacc_and_infec_av_0 = [percentage_of_unvacc_and_infec_av_0, out(1, 2)]; son ortalama_infected_0 = ortalama(per_infect_av_0); ortalama_unvacc_and_infected_0 = ortalama(percentage_of_unvacc_and_infec_av_0);

Kod açıklaması:

For döngüsü 20 kez çalıştırılır. EnfeksiyonSim() fonksiyonunun çıktısı, dışarıda saklanır. for döngüsü her çalıştığında, toplam popülasyondaki virüslülerin yüzdesi 'per_infect_av_0' matrisine eklenir. Ek olarak, aşılanmamış ve enfekte olanların yüzdesi de 'percentage_of_unvacc_and_infec_av_0' matrisine eklenir. Son iki satırda, yukarıda bahsedilen bu iki matrisin ortalaması alınır ve değişkenlerde saklanır. Özetlemek gerekirse, yüzdeler her simülasyon için saklanır, ortalaması alınır ve grafiklendirilir. Monte Carlo, bir simülasyon çalıştırmanın ve sonucun ortalama değerini göstermek için kullanılır. Deneysel amaçlarımız için simülasyonu 20 kez çalıştırmayı ve bu değerlerin ortalamasını almayı seçiyoruz.

Meydan okuma:

Test etmek istediğiniz tüm yüzdeler için tekrarlayın! Bu, değişken adlarını yüzde sayılarına göre değiştirerek yapılabilir. %0, %5, %10, %20, %30 ve %50 için test ettik.

İpucu:

Gerçek kodda değiştirilmesi gereken tek satır

out = enfeksiyonSim(unvacc, vacc, popülasyon_boyutu, 0, 1, sim_speed);

Sıfırı ondalık biçimde yüzde olarak değiştirin. Örneğin, %5 aşısız simülasyon için 0, 0,5 ile değiştirilmelidir.

Adım 14: Grafik: 'Aşılanmamış Vs. Belirtilen Hastalık için aşılanmış

Bu, aşılanmamış kişilerde ve aşılanmamış kişilerde enfeksiyon eğiliminin grafiğini yapmak için kullanılan koddur.

graph_mat_y = [average_infected_0, vasat_infected_5, vasat_infected_10, vasat_infected_20, vasat_infected_30, vasat_infected_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; eğim = (average_enfected_5-average_infected_0)/5; line_y = [average_enfected_0, (eğim*50)+average_enfected_0]; line_x = [0, 50]; şekil(2) plot(graph_mat_x, graph_mat_y); line(line_x, line_y, 'Renk', 'kırmızı', 'LineStyle', '--'); title(['Aşılanmama Trendi', hastalık]); xlabel('İlk Aşılanmamış Yüzdesi'); ylabel('Son Etkilenenlerin Yüzdesi')

Kod açıklaması

1. satır: enfekte yüzde ortalamalarına y değerleri atanır

satır 2: ilk aşılanmamış yüzde yüzdesine x değerleri atanır

3. satır: %0 ve %5'in eğimini hesaplayın

satır 4: satırın y değerlerini saklayın. Bu, %0 ila %5 bölümünün devamıdır.

satır 5: satırın y değerlerini saklayın. Bu çizgi grafiğin uzunluğunu kapsar.

6. satır: şekil oluştur

7. satır: aşılanmamış enfekte olmuş yüzdelerin x ve y değerlerinin grafiğini çizin.

satır 8: çizgiyi çizin. Bu, doğrusal olarak değil, üstel olarak arttığını göstermek için kullanılır.

9. satır: Grafiğin başlığını ayarlayın.

satır 10-11: Grafik için x ve y etiketlerini ayarlayın.

Şimdi, aşılanmamış nüfusun yüzdesi ne kadar fazlaysa, enfeksiyon miktarının o kadar büyük olduğunu görebilmeniz gerekir. Ayrıca kırmızıya dönen noktaların çoğunun yeşil noktalar olduğunu göreceksiniz, bu da aşının bir dereceye kadar yardımcı olduğunu gösteriyor! Umarım bu öğreticiyi beğenmişsinizdir. Herhangi bir sorunuz varsa yorum yapın!

Adım 15: Nihai Ürün: Simülasyon Nasıl Görünüyor

Tüm kod burada bulunabilir

Önerilen: