สารบัญ:

จะได้รับวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงผ่านการจำลองโรค 15 ขั้นตอน
จะได้รับวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงผ่านการจำลองโรค 15 ขั้นตอน

วีดีโอ: จะได้รับวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงผ่านการจำลองโรค 15 ขั้นตอน

วีดีโอ: จะได้รับวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงผ่านการจำลองโรค 15 ขั้นตอน
วีดีโอ: Back to School เปิดเทอมอย่างปลอดภัย : รู้สู้โรค 2024, กรกฎาคม
Anonim
จะได้รับการฉีดวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงโดยการจำลองโรค
จะได้รับการฉีดวัคซีนหรือไม่? โครงการสังเกตภูมิคุ้มกันฝูงโดยการจำลองโรค

ภาพรวมของโครงการ:

โครงการของเราสำรวจภูมิคุ้มกันฝูงและหวังว่าจะสนับสนุนให้ผู้คนได้รับการฉีดวัคซีนเพื่อลดอัตราการติดเชื้อในชุมชนของเรา โปรแกรมของเราจำลองว่าโรคแพร่ระบาดในประชากรอย่างไร โดยมีอัตราร้อยละของอัตราการฉีดวัคซีนและไม่ได้รับวัคซีนต่างกัน มันแสดงให้เห็นภูมิคุ้มกันของฝูงโดยแสดงให้เห็นว่าจำนวนประชากรที่ได้รับวัคซีนที่เพิ่มขึ้นสามารถลดจำนวนผู้ที่ได้รับผลกระทบได้อย่างไร

เราจำลองสิ่งนี้ใน Matlab โดยใช้แนวคิดทฤษฎีกราฟ ทฤษฎีกราฟเป็นวิธีทางคณิตศาสตร์ในการแสดงความสัมพันธ์ระหว่างวัตถุ ในทฤษฎีกราฟ กราฟมีจุดยอด (หรือโหนด) เชื่อมต่อกันด้วยขอบ (หรือเส้น) สำหรับโครงการของเรา โหนดคือบุคคลที่เกี่ยวข้อง และขอบคือการเชื่อมต่อ ตัวอย่างเช่น หากโหนดสองโหนดเชื่อมต่อกับขอบ แสดงว่าเป็น "เพื่อน" หรือมีรูปแบบการติดต่อซึ่งกันและกัน การติดต่อนี้เป็นช่องทางให้โรคแพร่กระจาย นี่คือเหตุผลที่เราใช้ทฤษฎีกราฟเพื่อสร้างแบบจำลองแนวคิดของเรา เนื่องจากเราต้องการดูว่าโรคแพร่กระจายไปในหมู่บุคคลที่เชื่อมโยงกันในประชากรอย่างไร

โครงการของเรายังเกี่ยวข้องกับวิธีมอนติคาร์โลด้วย วิธีมอนติคาร์โลคืออัลกอริธึมที่สร้างการสุ่มตัวอย่างซ้ำๆ เพื่อให้ได้ผลลัพธ์ที่เป็นตัวเลข ในโครงการของเรา เราใช้วิธีนี้เพื่อเรียกใช้การจำลองของเราหลายครั้งโดยเปลี่ยนเปอร์เซ็นต์ของการเริ่มต้นที่ไม่ได้รับการฉีดวัคซีนเพื่อดูอัตราที่ผู้คนติดเชื้อ

รหัสโครงการทั้งหมดถูกเชื่อมโยงที่ด้านล่าง!

เครดิต PC:

ลิงก์ Matlab ไปยังทฤษฎีกราฟ:

ขั้นตอนที่ 1: สร้างเมทริกซ์ที่อยู่ติดกัน

สร้างเมทริกซ์ที่อยู่ติดกัน
สร้างเมทริกซ์ที่อยู่ติดกัน
สร้างเมทริกซ์ที่อยู่ติดกัน
สร้างเมทริกซ์ที่อยู่ติดกัน

สร้างสคริปต์ใหม่ เราจะเรียกเราว่า 'infectionSim.m'

เรากำลังจะสร้างตัวแปร 'NUMOFPEOPLE' คุณสามารถกำหนดให้กับค่าจำนวนเต็มใดๆ นี่จะแสดงจำนวนคนในประชากรของคุณ

จากนี้ไปเราจะถือว่า

NUMOFPEOPLE = 20;

เริ่มต้นด้วยการใช้ฟังก์ชันทฤษฎีกราฟของ Matlab สำหรับกราฟแบบไม่บอกทิศทาง

หากคุณสนใจที่จะเรียนรู้เพิ่มเติม นี่คือลิงค์สำหรับให้คุณอ่านเชิงลึกเพิ่มเติมเกี่ยวกับเรื่องนี้

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

สร้างเมทริกซ์ที่อยู่ติดกัน

adjMatrix = ศูนย์ (NUMOFPEOPLE);

สิ่งนี้จะสร้างเมทริกซ์กำลังสองเป็น 0 วินาที แต่ละแถวในเมทริกซ์คือบุคคล แต่ละคอลัมน์ในเมทริกซ์คือบุคคลหรือเพื่อนที่บุคคลนั้นพบตลอดทั้งวัน

ดูรูปที่ 100 (ด้านบน) เพื่อช่วยให้เห็นภาพว่า adjMatrix เป็นอย่างไรสำหรับคน 20 คน

**จากนี้ไปเราจะถือว่า NUMOFPEOPLE เท่ากับ 20**

คุณสามารถลองพล็อตเมทริกซ์ที่อยู่ติดกันนี้ ต่อไปนี้เป็นข้อมูลเพิ่มเติมเล็กน้อยเกี่ยวกับการพล็อตเมทริกซ์ประเภทนี้

หมายเหตุ: เมทริกซ์ที่อยู่ติดกันทำงานอย่างไร

อดีต:

%ทำให้เมทริกซ์ที่อยู่ติดกัน

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] % การวางแผน g = กราฟ (a); %การใช้ฟังก์ชันกราฟ (ทฤษฎีกราฟ) รูปที่ (1); ชั่วโมง = พล็อต(g);

ดูรูปที่ 1 (ด้านบน) เพื่อดูวิธีเพิ่มขอบในเมทริกซ์ที่อยู่ติดกัน โดยใช้โค้ดใน "หมายเหตุ"

ขั้นตอนที่ 2: สร้างความสัมพันธ์

สร้างความสัมพันธ์
สร้างความสัมพันธ์

เมื่อสร้างผู้คนแล้ว (จุดยอดหรือโหนด) เราจำเป็นต้องสร้างเครือข่ายความสัมพันธ์ (เส้นหรือขอบของกราฟ) สิ่งนี้จะจำลองวิธีที่ผู้คนโต้ตอบและพบปะกับผู้อื่นตลอดทั้งวัน

สามารถทำได้หลายวิธี วิธีหนึ่งในการทำงานนี้ให้สำเร็จคือ กำหนดหมายเลขสุ่มให้กับแต่ละคนก่อน เพื่อกำหนดจำนวนคนที่แต่ละคนจะโต้ตอบด้วยในหนึ่งวัน

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

ซึ่งจะทำให้เมทริกซ์สุ่มจำนวนเต็ม 1 คูณ 20 แทนจำนวนการโต้ตอบที่แต่ละคนมีในหนึ่งวัน คอลัมน์ของเมทริกซ์นี้จะเป็นตัวเลขที่สอดคล้องกับแต่ละคน ตัวอย่างเช่น หากเรากำหนด littleFriendsPersonCanHave = 2 และ mostFriendsPersonCanHave = 5 ให้น้อยที่สุด เราจะได้รับค่าสุ่มระหว่าง 2 ถึง 5

มีปัญหากับ randi()? ในเทอร์มินัล พิมพ์

ช่วยแรนดี้

ต่อไป เราสร้างเมทริกซ์แบบสุ่ม (เรียกว่า "allFriendsmatrix") ของวิธีที่แต่ละคนในประชากรเชื่อมต่อ/โต้ตอบกันภายในประชากร

tempMatrix = ;

นับ = 0; allFriendsMatrix = ; สำหรับ k = 1: NUMOFPEOPLE ในขณะที่ length(tempMatrix) ~= numOfFriendsMatrix(k) count = นับ +1; temp = randi([1, NUMOFPEOPLE]); tempMatrix(นับ) = อุณหภูมิ; สิ้นสุดการล้างแต่ละรายการในขณะที่ length(tempMatrix) ~= 9 tempMatrix = [tempMatrix, NaN]; สิ้นสุด allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; นับ = 0; จบ

คำอธิบายเชิงลึกของรหัส:

ขั้นแรก เราสร้างเมทริกซ์ชั่วคราวที่ว่างเปล่าเพื่อเก็บรายชื่อเพื่อน/การโต้ตอบของแต่ละคน เรายังเริ่มต้นการนับ ซึ่งเพียงติดตามตำแหน่งที่จะเชื่อมต่อแบบสุ่มใหม่ใน tempMatrix for loops ทำงาน 20 ครั้งเพื่อให้สิ่งนี้เกิดขึ้นกับแต่ละคนในประชากร ลูปแรกจะทำงานจนกว่า tempMatrix ของแต่ละคนจะมีความยาวเท่ากันกับจำนวนการโต้ตอบที่กำหนดแบบสุ่ม ในลูปนี้ หมายเลขสุ่มที่ตรงกับบุคคลในประชากรจะถูกสร้างขึ้นและวางลงใน tempMatrix เนื่องจากความยาวของ tempMatrixes แต่ละอันแตกต่างกัน เราจึงจำเป็นต้องสร้างค่า NaN บางอย่างเพื่อให้เราสามารถเชื่อม tempMaticies เหล่านี้ทั้งหมดให้เป็นเมทริกซ์เดียว ('allFriendsMatrix') ส่วนที่สอง while loop แก้ปัญหานี้โดยการเพิ่ม NaN ลงใน tempMatrix แต่ละตัว while loop ถูกตั้งค่าให้ทำงาน 9 ครั้ง เนื่องจากเป็นตัวเลขที่มากกว่า 5 ซึ่งเป็นขอบเขตบนของเพื่อนที่บุคคลหนึ่งสามารถกำหนดได้ ค่า '9' เป็นตัวแปรและสามารถ/ต้องเปลี่ยนเมื่อ 'mostFriendsPersonCanHave' มากกว่า 9 โค้ดสามบรรทัดสุดท้าย (ไม่รวมส่วนท้าย) จะเพิ่ม tempMatrix ลงในแถวถัดไปของ 'allFriendsMatrix' จากนั้นจะล้าง tempMatrix และนับสำหรับบุคคลถัดไป

เอาท์พุต

นี่คือลักษณะเอาต์พุตสำหรับการรันครั้งแรกผ่านลูป for (ก่อนสามบรรทัดสุดท้าย)

tempMatrix = 16 8 17 16 13 NaN น่าน น่าน น่าน

allFriendsMatrix =

16 8 17 16 13 น่าน น่าน น่าน น่าน 8 8 2 7 11 น่าน น่าน น่าน น่าน น่าน 10 13 น่าน น่าน น่าน น่าน น่า น่า น่า น่า น่า น่า น่า น่าอยู่ 4 13 2 12 น่าน น่าน น่าน น่าน น่าน น่าน 17 10 9 3 1 น่าน น่าน น่าน น่าน น่าน 16 16 6 น่าน น่าน น่าน น่าน น่าน น่าน 3 8 17 17 14 น่าน น่าน น่าน น่าน น่าน 20 19 3 น่าน น่าน น่าน น่าน น่าน น่าน น่าน 13 10 น่าน น่าน น่าน น่า น่า น่า น่า น่า น่า น่า น่า น่าอยู่ 2 18 10 16 น่าน น่าน น่าน น่า น่า น่า น่า น่า น่า น่า น่าอยู่ 2 6 14 3 13 น่าน น่า น่า น่า น่า น่า น่า น่า น่า น่า น่าอยู่ น่า น่า น่า น่า น่า น่า น่า น่าอยู่ 8 16 14 8 น่า น่า น่า น่า น่า น่า รัก น่า น่า รัก 7 7 น่า น่า น่า น่า น่า รัก น่า รัก น่าน น่าน น่าน 5 18 น่าน น่าน น่าน น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า น่า รัก น่า น่า รัก น่า น่า รัก น่า น่า น่า รัก น่า น่า น่า รัก น่า รัก น่า น่า น่า รัก น่า รัก น่า น่า น่า รัก 1 7 น่า น่า น่า น่า น่า รัก น่า รัก

ถัดไป เพิ่มความสัมพันธ์เหล่านี้ใน adjMatrix

สำหรับแต่ละแถว = 1: NUMOFPEOPLE

สำหรับแต่ละCol = 1:9 ถ้า isnan(allFriendsMatrix(eachRow, eachCol)) == 0 adjMatrix(eachRow, allFriendsMatrix(eachRow, eachCol)) = 1; adjMatrix(allFriendsMatrix(eachRow, eachCol), eachRow) = 1; ปลาย ปลาย ปลาย

คำอธิบายรหัส

การวนซ้ำสองครั้งนี้จะผ่านแต่ละแถวและคอลัมน์ของ 'allFriendsMatrix' คำสั่ง if จะทำงานสำหรับค่าทั้งหมดที่ไม่ใช่ 'NaN' โดยทั่วไปจะสร้างขอบหรือเส้นของกราฟ ดังนั้นบรรทัดแรกที่จะทำคือคนที่ 1 ถึงคนที่ 16 และคนที่ 16 ถึงคนที่ 1 เพราะมันไม่บอกทาง 1 ต้องเปลี่ยนทั้งคู่! เราไม่สามารถมีเพียงขอบ 1 ถึง 16 และไม่ใช่ 16 ต่อ 1 พวกมันจะต้องสมมาตรเพื่อให้มันทำงานอย่างถูกต้องใน Matlab

ในการจำลองของเรา เรากำหนดว่าผู้คนไม่สามารถโต้ตอบกับตัวเองได้ เมื่อเราสุ่มค่า มีโอกาสที่เมทริกซ์ที่อยู่ติดกันจะมีข้อผิดพลาดนี้

มาแก้ไขด้วยรหัสต่อไปนี้:

สำหรับแต่ละ = 1: NUMOFPEOPLE

adjMatrix (แต่ละอัน) = 0; จบ

คำอธิบายรหัส

สำหรับลูปนี้ทำให้แน่ใจว่าบุคคลที่ 1 ไม่ได้เชื่อมต่อกับบุคคลที่ 1 บุคคลที่ 2 ไม่ได้เชื่อมต่อกับบุคคลที่ 2 ฯลฯ โดยทำให้ทั้งหมดเป็น 0 ดังที่คุณเห็นด้านล่างในส่วนผลลัพธ์ เรามีเส้นทแยงมุมของสี่เหลี่ยมจัตุรัส เมทริกซ์จากบนซ้ายไปล่างขวาเป็น 0 ทั้งหมด

เอาท์พุต

นี่คือ adjMatrix สุดท้ายสำหรับการจำลองปัจจุบันนี้ บัญชีนี้สำหรับเส้นทั้งหมดในกราฟ (รูปที่ 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

ดูรูปที่ 2 เพื่อดูกราฟของ 'adjMatrix'

ขั้นตอนที่ 3: เพิ่มสถิติโรค

ตอนนี้โปรแกรมของคุณสามารถสร้างกราฟด้วยกลุ่มคนสุ่มและสร้างความสัมพันธ์แบบสุ่ม เราต้องป้อนข้อมูลหรือสถิติของโรคเพื่อดูว่าปฏิสัมพันธ์เหล่านี้ภายในประชากรสามารถเพิ่มหรือลดการติดเชื้อได้อย่างไร

สร้างตัวแปรเหล่านี้:

unvacc %type: สองเท่า; โอกาสร้อยละของคนที่ไม่ได้รับวัคซีนจะไม่เจ็บป่วย

vacc % ประเภท: สองเท่า; โอกาสร้อยละของคนที่ฉีดวัคซีนไม่เจ็บป่วย unvacc_perc %type: double; เปอร์เซ็นต์ของประชากรที่ไม่ได้รับวัคซีน init_infect %type: int; เปอร์เซ็นต์ประชากรที่ได้รับการฉีดวัคซีน

ต่อไปเราต้องทำการคำนวณ

เรากำลังจะสร้าง 'infectionMat' ซึ่งเป็นเมทริกซ์ 3*NUMOFPEOPLE

vacc_perc = 1-unvacc_perc;

การติดเชื้อ Mat = น่าน (3, NUMOFPEOPLE); จำนวน = รอบ (vacc_perc * NUMOFPEOPLE); การติดเชื้อ Mat(1, 1:number) = vacc; การติดเชื้อMat(1, number+1:end) = unvacc; การติดเชื้อMat(2, 1:end) = 0; การติดเชื้อ Mat(2, 1:init_infect) = 1;

คำอธิบายรหัส

บรรทัดที่ 1: เปอร์เซ็นต์ของประชากรที่ไม่ได้รับวัคซีนคำนวณ

บรรทัดที่ 2: สร้างเมทริกซ์จำนวนคน 3*N

บรรทัดที่ 3: หาจำนวนคนที่ได้รับการฉีดวัคซีนจากเปอร์เซ็นต์ที่ได้รับการฉีดวัคซีน

บรรทัดที่ 4: สำหรับผู้ได้รับวัคซีน ให้สร้างภูมิคุ้มกันที่เกี่ยวข้องกับการรับวัคซีน ค่านี้กำหนดจากการวิจัยเกี่ยวกับโรค

บรรทัดที่ 5: สำหรับประชากรที่เหลือ (ผู้ที่ไม่ได้รับวัคซีน) ให้เปอร์เซ็นต์ภูมิคุ้มกันแก่พวกเขา ค่านี้กำหนดจากการวิจัยเกี่ยวกับโรค

บรรทัดที่ 6: เริ่มแรกตั้งค่าให้ทุกคนไม่ติดเชื้อ

บรรทัดที่ 7: สำหรับจำนวนผู้ติดเชื้อในตอนแรก ให้กรอกข้อมูลในคอลัมน์คู่แรกตามลำดับ

ตอนนี้เราได้ตั้งค่าพารามิเตอร์ทั้งหมดสำหรับการจำลองโรคแล้ว เราจะสุ่มโอกาสที่บุคคล (ทั้งที่ได้รับการฉีดวัคซีนและไม่ได้รับการฉีดวัคซีน) จะติดเชื้อหรือไม่ สิ่งนี้จะทำในขั้นตอนต่อไปโดยกำหนดค่าสุ่มระหว่าง 0 ถึง 1 ให้กับแต่ละคนในแถวที่สามของ 'infectionMat' นี้

ขั้นตอนที่ 4: สุ่มโอกาสที่ผู้ที่ได้รับวัคซีนและไม่ได้รับการฉีดวัคซีนจะติดเชื้อได้

ถัดไป กำหนดหมายเลขสุ่มให้แต่ละคน ซึ่งจะใช้ในภายหลังเพื่อพิจารณาว่าบุคคลนั้นติดเชื้อหรือไม่

สำหรับ w = 1:length(infectionMat)

การติดเชื้อMat(3, w) = rand; จบ

คำอธิบายรหัส

สิ่งนี้สำหรับลูปเกี่ยวข้องกับแถวที่สามของ 'infectionMat' ที่สร้างขึ้นในขั้นตอนสุดท้าย 'rand' กำหนดค่าระหว่าง 0 ถึง 1 ให้กับแต่ละดัชนีของแถวที่ 3

เอาท์พุต

ตอนนี้การติดเชื้อ Mat เสร็จสมบูรณ์แล้ว! โดยมีประชากรที่ฉีดวัคซีน 100% และติดเชื้อครั้งแรก 1 คน

การติดเชื้อเสื่อ =

คอลัมน์ 1 ถึง 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.0869 0.5489 0.3177 0.9927 0.7236 0.5721 0.7172 0.9766 0.4270 0.9130 0.8973 0.8352 คอลัมน์ 13 ถึง 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

แถวที่ 1: โอกาสร้อยละที่จะไม่ติดโรค

แถวที่ 2: ติดเชื้อหรือไม่ติดเชื้อ (ค่าบูลีน)

แถวที่ 3: เบอร์ที่ใช้ตรวจว่าคนที่ไม่ติดเชื้อจะติดเชื้อหรือไม่ ถ้าเจอคนติดเชื้อ หากผู้ไม่ติดเชื้อพบผู้ติดเชื้อ ตัวเลขนี้มากกว่าตัวเลขในแถวที่ 1 (สำหรับคอลัมน์เดียวกัน) แสดงว่าติดเชื้อ เราจะเขียนโค้ดฟังก์ชันนี้ในขั้นตอนที่ 7

ขั้นตอนที่ 5: สร้างเมทริกซ์ของผู้ที่ไม่ได้รับวัคซีนและติดเชื้อจากข้อมูลเบื้องต้น

สร้างเมทริกซ์ 2 ตัวที่เรียกว่า "matrixUnvacc" และ "matrixInfected" ที่เก็บผู้ติดเชื้อทั้งหมดจากการติดเชื้อ Mat ข้อมูลนี้จะถูกนำมาใช้เพื่อให้เราสามารถกำหนดสีให้กับกราฟของผู้ที่ติดเชื้อ ไม่ได้รับการฉีดวัคซีน หรือได้รับการฉีดวัคซีน ซึ่งช่วยให้เห็นภาพผลกระทบของบุคคลที่ไม่ได้รับวัคซีนเทียบกับผู้ที่ไม่ได้รับวัคซีน

เคลียร์แต่ละอัน

matrixInfected = ; matrixUnvacc = ; สำหรับ h= 1:length(infectionMat) ถ้า infectionMat(1, h) == unvacc matrixUnvacc = [matrixUnvacc, h]; end end for person = 1: NUMOFPEOPLE ifการติดเชื้อMat(2, person) == 1 matrixInfected = [matrixInfected, person]; ปลาย ปลาย

คำอธิบายรหัส

สร้างเมทริกซ์ว่างสองชุดเพื่อเก็บจำนวนผู้ที่ไม่ได้รับวัคซีนและผู้ติดเชื้อตามลำดับ ทั้งสำหรับลูปรัน 20 ครั้ง และหากคำสั่ง if เป็นที่พอใจ จำนวนนั้นจะถูกเพิ่มลงในเมทริกซ์ที่ถูกต้อง

เอาท์พุต

matrixUnvacc =

เมทริกซ์ติดเชื้อ =

[1]

ขั้นตอนที่ 6: พล็อตกราฟเริ่มต้น

พล็อตกราฟเริ่มต้น
พล็อตกราฟเริ่มต้น

ต่อไปเราจะพลอตเมทริกซ์ที่อยู่ติดกัน

g = กราฟ (adjMatrix);

รูปที่ (1) p = พล็อต (g, 'NodeColor', 'b', 'MarkerSize', 7); ไฮไลต์ (p, matrixUnvacc, 'NodeColor', 'g') ไฮไลต์ (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; title(['เปอร์เซ็นต์ของคนที่ไม่ได้รับวัคซีน: ', num2str(title_unvacc), '%']); หยุดชั่วคราว (ความเร็ว)

คำอธิบายรหัส

ทฤษฎีกราฟใน Matlab สร้างขึ้นในฟังก์ชัน เมื่อเราใช้ฟังก์ชัน graph() เราสามารถแปล 'adjMatrix' เป็นกราฟที่ไม่มีทิศทางจริงได้ จากนั้นเราต้องสร้างพล็อตโดยใช้ฟังก์ชัน plot() เพื่อดูว่าหน้าตาเป็นอย่างไร เราตั้งค่า plot() นี้เป็นตัวแปรเพื่อให้เราสามารถจัดการและเปลี่ยนสีของพล็อตได้ง่ายขึ้นตลอดการจำลอง ทุกคน (หรือโหนด) ถูกกำหนดเป็นสี 'สีน้ำเงิน' ในขั้นต้น ถัดไป ผู้ไม่ได้รับวัคซีนทั้งหมดจะถูกตั้งค่าเป็น 'สีเขียว' ผู้ติดเชื้อจะถูกตั้งค่าเป็นสีแดง ชื่อเรื่องถูกกำหนดตามค่าเปอร์เซ็นต์ที่แน่นอนของผู้ไม่ได้รับวัคซีนที่กำลังทดสอบ ฟังก์ชันหยุดชั่วคราว () หยุดการทำงานของ MatLab ชั่วคราว เราผ่านตัวแปรความเร็วที่กระจายซึ่งคำนวณเป็นวินาที

ดูภาพ (ด้านบน) เพื่อดูกราฟรหัสสีแบบสุ่ม

เรียนรู้เพิ่มเติมเกี่ยวกับฟังก์ชัน highlight() ใน MatLab

ขั้นตอนที่ 7: จำลองความก้าวหน้าของการติดเชื้อ

ต่อไป เราต้องค้นหาว่าใครติดเชื้อหลังจากการโต้ตอบ (บันทึกไว้ใน adjMatrix) และอัปเดตกราฟเมื่อมีคนติดเชื้อ

ใช้ adjMatrix เพื่อกำหนดว่าคนใดบ้างที่ติดเชื้อหลังจากการโต้ตอบกับผู้คนในหนึ่งวัน

สำหรับแต่ละแถว = 1:length(adjMatrix)

ifการติดเชื้อMat(2, eachRow) == 1 for eachCol = 1:length(adjMatrix) if adjMatrix(eachRow, eachCol) == 1 % eachRow = คน % eachCol = เพื่อนของเขา % เพื่อนของแต่ละคน และดูว่าติดเชื้อหรือไม่. ถ้าการติดเชื้อMat(3, eachCol) >การติดเชื้อMat(1, eachCol)การติดเชื้อMat(2, eachCol) = 1; ไฮไลต์ (p, eachCol, 'NodeColor', 'r') หยุดชั่วคราว (ความเร็ว) สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด สิ้นสุด

for วนซ้ำผ่านแต่ละบุคคล เป็นการตรวจสอบว่าถ้าบุคคลนั้นติดเชื้อ มันจะตรวจสอบบุคคล/เพื่อนแต่ละคนที่พวกเขาโต้ตอบด้วย และตรวจสอบว่าระดับภูมิคุ้มกันของเพื่อนนั้นมากกว่าความแรงของโรคหรือไม่ นี่คือที่มาของ 'infectionMat' ที่เราสร้างไว้ก่อนหน้านี้ เปรียบเทียบแถวที่ 1 และแถวที่ 3 ของแต่ละคอลัมน์ของเพื่อน และถ้าแถวที่ 3 มากกว่า แสดงว่าเพื่อนไม่มีภูมิคุ้มกันสูงพอที่จะรอดจากโรคและติดเชื้อในที่สุด นอกจากนี้เรายังเปลี่ยนสีโดยใช้ไฮไลต์ () เป็นสีแดงหากพวกเขาติดเชื้อ

ตอนนี้รหัสของคุณสำหรับการจำลองควรใช้งานได้! และสำหรับประชากรทุกขนาด เพียงแค่เปลี่ยน NUMOFPEOPLE!

ขั้นตอนที่ 8: ใช้ทฤษฎีมอนติคาร์โล

เพื่อก้าวไปอีกขั้นหนึ่งและดึงข้อมูลจากโปรแกรมจำลองของเรา ('infectionSim.m') เราต้องการคำนวณและสร้างกราฟแนวโน้มในเปอร์เซ็นต์ของผู้ไม่ได้รับวัคซีนที่ติดเชื้อ และเปอร์เซ็นต์ของผู้ที่ได้รับวัคซีนที่ติดเชื้อ เราตั้งสมมติฐานว่าเปอร์เซ็นต์ของผู้ที่ได้รับวัคซีนที่ติดเชื้อควรต่ำกว่าเปอร์เซ็นต์ของผู้ไม่ได้รับวัคซีนที่ติดเชื้อมาก

ขั้นตอนที่ 9: สร้างไฟล์ ('infectionSim.m') ด้วยการจำลองให้เป็นฟังก์ชัน

ในการเรียกใช้ Monte Carlo เราต้องการเรียกใช้การจำลองหลายครั้งและรวบรวมข้อมูลเพื่อให้เราสามารถใช้สิ่งนั้นเพื่อสร้างกราฟเปอร์เซ็นต์ของผู้ที่ติดเชื้อ

ฟังก์ชั่นสามารถตั้งค่าได้ดังนี้:

เอาต์พุตของฟังก์ชัน =การติดเชื้อSim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, ความเร็ว)

แสดงความคิดเห็นเกี่ยวกับตัวแปรในการจำลองของคุณ เนื่องจากตอนนี้คุณกำลังส่งผ่านสิ่งเหล่านี้ผ่านไฟล์หลัก (เราจะเริ่มเขียนสิ่งนี้ในขั้นตอนที่ 12):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

ตัวแปรใหม่

ความเร็ว

จะถูกกำหนดในไฟล์หลัก (Monte_Carlo.m)

หมายเหตุ: อย่าลืมจุดสิ้นสุดที่ด้านล่างของไฟล์ฟังก์ชันเพื่อสิ้นสุดฟังก์ชัน!

ขั้นตอนที่ 10: คำนวณเปอร์เซ็นต์ของผู้ที่ติดเชื้อและไม่ได้รับการฉีดวัคซีน

ซึ่งจะคำนวณเปอร์เซ็นต์ของผู้ที่ไม่ได้รับวัคซีนที่ติดเชื้อ รหัสนี้จะอยู่ที่ด้านล่างของไฟล์ 'infectionSim.m'

number_of_unvacc = 0;

number_of_infec_unvacc = 0; % คำนวณเปอร์เซ็นต์ของคนที่ไม่ได้รับวัคซีนที่ติดเชื้อ x = 1:length(infectionMat) ถ้าการติดเชื้อMat(1, x) == unvacc number_of_unvacc = number_of_unvacc+1; จบถ้าการติดเชื้อMat(1, x) == unvacc & infectionMat(2, x) == 1 number_of_infec_unvacc = number_of_infec_unvacc +1; เปอร์เซ็นต์สิ้นสุดสิ้นสุด_of_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

คำอธิบายรหัส

ใน for loop จะวนซ้ำมากกว่า NUMOFPEOPLE ครั้ง แต่ละครั้งที่หมายเลขในแผ่นการติดเชื้อตรงกับหมายเลข unvacc (เช่น 0.95 == 0.95) จำนวนคนที่ไม่ได้รับการฉีดวัคซีนจะเพิ่มขึ้น 1 ทุกครั้งที่จำนวนในแผ่นติดเชื้อตรงกับหมายเลข unvacc และติดเชื้อ จำนวนผู้ติดเชื้อและไม่ได้รับวัคซีนเพิ่มขึ้น 1 คน บรรทัดสุดท้ายแบ่งจำนวนผู้ติดเชื้อที่ไม่ได้รับวัคซีนด้วยจำนวนคนที่ไม่ได้รับวัคซีนทั้งหมด จากนั้นคำนวณเปอร์เซ็นต์จากสิ่งนี้

ท้าทาย:

ลองคำนวณเปอร์เซ็นต์คนรับวัคซีนที่ติดเชื้อ! (คำแนะนำ: มันคล้ายกับโค้ดด้านบนนี้มาก อย่างไรก็ตาม ตัวแปรบางตัวมีการเปลี่ยนแปลงและมีการปรับเปลี่ยนชื่อ)

ถัดไปจะคำนวณเปอร์เซ็นต์ของผู้ติดเชื้อตามจำนวนประชากรทั้งหมด:

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

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

คำอธิบายรหัส

ผลรวมสะสมคำนวณโดยใช้แถวที่สองของการติดเชื้อ Mat ซึ่งเก็บ 1 และ 0 ขึ้นอยู่กับว่าบุคคลนั้นติดเชื้อหรือไม่เนื่องจากฟังก์ชัน cumsum() ให้เมทริกซ์กลับมา เราจึงนำค่าสุดท้ายในเมทริกซ์ ('pre_per_infect(1, NUMOFPEOPLE)') ซึ่งควรเป็นผลรวมจริงของค่าทั้งหมดจาก 'infectionMat(2,:)' โดยการหารผลรวมด้วย NUMOFPEOPLE และคูณด้วย 100 เราจะได้เปอร์เซ็นต์สุดท้ายของการติดเชื้อในประชากรทั้งหมด

ขั้นตอนที่ 11: สร้างตัวแปรเอาต์พุตในฟังก์ชัน 'infectionSim.m' ของคุณ

ผลลัพธ์ = [per_infect, เปอร์เซ็นต์_of_unvacc_and_infec, เปอร์เซ็นต์_of_vacc_and_infec];

คำอธิบายรหัส

เก็บข้อมูลนี้ไว้ในเอาต์พุต ซึ่งจะถูกส่งกลับไปยัง main (Monte_Carlo.m) เมื่อเรียกใช้ฟังก์ชันและทำงานเสร็จ ข้อมูลนี้ใช้เพื่อสร้างกราฟคะแนนร้อยละของผู้ติดเชื้อที่ได้รับวัคซีนและไม่ได้รับวัคซีน

ฟังก์ชัน 'infectionSim.m' ของคุณน่าจะเสร็จสิ้นแล้ว! แต่มันจะไม่ทำงานเพราะเรายังต้องเขียนหลัก!

ขั้นตอนที่ 12: สร้างเมนูเพื่อรับเงื่อนไขเบื้องต้นของการจำลองจากผู้ใช้

จำว่าเราพูดตัวแปรอย่างไร

ความเร็ว

จะถูกสร้างขึ้นและส่งผ่านฟังก์ชั่นหลักหรือไม่? เราจำเป็นต้องได้รับค่าที่จะส่งผ่านไปยังฟังก์ชัน หมายเหตุ ลำดับของค่าเมื่อเรียกใช้ฟังก์ชันสำคัญ!

เริ่มต้นด้วยการขอให้ผู้ใช้พิมพ์คำตอบลงในเทอร์มินัล

> เลือกโรค หมายเหตุ เป็นกรณีสำคัญ >> ไอกรน >> ไข้หวัดใหญ่ >> หัด >> โรคที่เลือก: ไข้หวัดใหญ่ >> เลือกขนาดประชากร >> 20 >> 200 >> จำนวนประชากรที่เลือก: 20 >> เลือกความเร็วของการจำลอง >> เร็ว >> ช้า >> เลือกความเร็ว: เร็ว

รหัสด้านล่างนี้ถามผู้ใช้ว่าต้องการดูโรคอะไร

disp('เลือกโรค สังเกตตัวพิมพ์เล็กและตัวพิมพ์ใหญ่')

fprintf('โรคไอกรน\nไข้หวัดใหญ่\nโรคหัด\n') โรค = ข้อมูลเข้า ('โรคที่เลือก: ', 's'); ถ้าเท่ากัน (โรค 'ไอกรน') vacc =.85; โอกาสร้อยละ 15 ที่จะติดโรคได้ =.20; โอกาสร้อยละ 80 ที่จะเกิดโรคอื่นถ้าไม่เท่ากัน (โรค 'ไข้หวัดใหญ่') vacc =.75; โอกาสร้อยละ 25 ที่จะเป็นโรค unvacc =.31; โอกาสเกิดโรคอื่นร้อยละ 69 ถ้าเท่ากัน (โรค 'หัด') vacc =.97; โอกาสร้อยละ 3 ที่จะติดโรคได้ =.10; โอกาสติดโรคร้อยละ 90

คำอธิบายรหัส:

ฟังก์ชัน disp() จะพิมพ์คำสั่งไปยังหน้าจอและพิมพ์ตัวเลือกต่างๆ ออกมาด้วย โรคจะได้รับมอบหมายตามนั้น เวอร์ชันนี้ไม่ได้ระบุการป้อนข้อมูลที่ไม่ถูกต้องในขณะนี้ การป้อนข้อมูลที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดและหยุดโปรแกรมอย่างสมบูรณ์ แต่ละโรคมีค่า vacc และ unvacc ที่เกี่ยวข้อง ค่าเหล่านี้ไม่ได้สุ่ม เราได้ค่าเหล่านี้จากการค้นคว้าสถิติเกี่ยวกับโรค

ต่อไป เราต้องถามผู้ใช้ว่าต้องการทดสอบขนาดประชากรมากหรือน้อยสำหรับโรคที่เลือก

disp('เลือกขนาดของประชากร')

fprintf('20\n200\n') speed = input('จำนวนประชากรที่เลือก: ', 's'); ถ้าเท่ากัน (ความเร็ว '20') ประชากร_size = 20; elseif เท่ากัน (ความเร็ว '200') ประชากร_size = 200; จบ

คำอธิบายรหัส

สิ่งนี้จะพิมพ์คำสั่งไปยังผู้ใช้และขอให้ผู้ใช้ป้อนขนาดของประชากรที่ต้องการทดสอบ เวอร์ชันนี้ไม่ได้นับว่ามีการป้อนข้อมูลที่ไม่ถูกต้องในขณะนี้ การป้อนข้อมูลที่ไม่ถูกต้องจะทำให้เกิดข้อผิดพลาดและหยุดโปรแกรมอย่างสมบูรณ์ เลือก 20 เนื่องจากเป็นกลุ่มตัวอย่างขนาดเล็กที่ยังให้แนวคิดที่ดีว่าการติดเชื้อแพร่กระจายไปทั่วประชากรกลุ่มเล็กๆ ได้อย่างไร 200 คนถูกเลือกเป็นตัวเลือกที่ใหญ่กว่า เพราะ 200 จุดที่พล็อตบนกราฟแทบไม่มีจุดเหลื่อมกัน ดังนั้นทุกอย่างจึงสามารถเห็นและแยกแยะได้ง่าย

ต่อไป เราต้องหาความเร็วของการจำลอง

disp('เลือกความเร็วของการจำลอง')

fprintf('Fast\nSlow\n') speed = input('เลือกความเร็ว: ', 's'); ถ้าเท่ากัน (ความเร็ว 'เร็ว') sim_speed = 0; elseif เท่ากัน (ความเร็ว 'ช้า') sim_speed = 0.25; จบ

คำอธิบายรหัส

กระบวนการนี้เหมือนกับการหาชนิดของโรคและขนาดของประชากร เพื่อความรวดเร็วจะไม่มีการหยุดชั่วคราว และสำหรับช้า จะมีความล่าช้า 0.25 วินาทีในลูป for เมื่อเรียกใช้การจำลอง

ยอดเยี่ยม! ตอนนี้เรามีอินพุตทั้งหมดจากผู้ใช้ที่เราต้องการแล้ว! มาดูการรวบรวมข้อมูลสำหรับเปอร์เซ็นต์ต่างๆ ของผู้ไม่ได้รับวัคซีนกัน

ขั้นตอนที่ 13: เลือก % ของผู้ไม่ได้รับวัคซีน และคำนวณค่าเฉลี่ยของผู้ไม่ได้รับวัคซีนและผู้ติดเชื้อเป็นเปอร์เซ็นต์ที่เลือก

รหัสนี้มีไว้สำหรับ 0% ของผู้ไม่ได้รับวัคซีน

% ------- %0 ไม่ได้รับวัคซีน ------------

per_infect_av_0 = ; เปอร์เซ็นต์_of_unvacc_and_infec_av_0 = ; สำหรับฉัน = 1:20 ออก = การติดเชื้อSim(unvacc, vacc,ประชากร_size, 0, 1, sim_speed); per_infect_av_0 = [per_infect_av_0, ออก (1, 1)]; เปอร์เซ็นต์_of_unvacc_and_infec_av_0 = [เปอร์เซ็นต์_of_unvacc_and_infec_av_0, ออก(1, 2)]; end average_infected_0 = ค่าเฉลี่ย (per_infect_av_0); Average_unvacc_and_infected_0 = ค่าเฉลี่ย (เปอร์เซ็นต์_of_unvacc_and_infec_av_0);

คำอธิบายรหัส:

for วนซ้ำ 20 ครั้ง เอาต์พุตจากฟังก์ชันการติดเชื้อSim() ถูกเก็บไว้ในออก ทุกครั้งที่ for loop ทำงาน เปอร์เซ็นต์ของการติดเชื้อในประชากรทั้งหมดจะถูกเพิ่มไปยังเมทริกซ์ 'per_infect_av_0' นอกจากนี้ เปอร์เซ็นต์ของผู้ที่ไม่ได้รับวัคซีนและการติดเชื้อจะเพิ่มเข้าไปในเมทริกซ์ 'percentage_of_unvacc_and_infec_av_0' ในแต่ละครั้ง ในสองบรรทัดสุดท้าย เมทริกซ์ที่กล่าวถึงข้างต้นทั้งสองนี้จะถูกหาค่าเฉลี่ยและเก็บไว้ในตัวแปร โดยสรุป เปอร์เซ็นต์จะถูกเก็บไว้สำหรับแต่ละการจำลอง ค่าเฉลี่ย และกราฟ Monte Carlo ใช้เพื่อแสดงค่าเฉลี่ยของการจำลองและแสดงผล สำหรับวัตถุประสงค์ในการทดลองของเรา เราเลือกที่จะเรียกใช้การจำลอง 20 ครั้งและหาค่าเฉลี่ยของค่าเหล่านั้น

ท้าทาย:

ทำซ้ำสำหรับเปอร์เซ็นต์ทั้งหมดที่คุณต้องการทดสอบ! ซึ่งสามารถทำได้โดยการเปลี่ยนชื่อตัวแปรตามจำนวนเปอร์เซ็นต์ เราทดสอบสำหรับ 0%, 5%, 10%, 20%, 30% และ 50%

คำใบ้:

บรรทัดเดียวที่ต้องเปลี่ยนในโค้ดจริงคือ

ออก = การติดเชื้อซิม (unvacc, vacc, จำนวนประชากร, 0, 1, sim_speed);

เปลี่ยนศูนย์เป็นเปอร์เซ็นต์ในรูปแบบทศนิยม ตัวอย่างเช่น สำหรับการจำลองที่ไม่ได้รับวัคซีน 5% ควรแทนที่ 0 ด้วย 0.5

ขั้นตอนที่ 14: กราฟ: 'แนวโน้มการติดเชื้อใน Vs. ที่ไม่ได้รับการฉีดวัคซีน ฉีดวัคซีนโรคเฉพาะ'

นี่คือรหัสเพื่อสร้างกราฟของแนวโน้มการติดเชื้อในบุคคลที่ไม่ได้รับวัคซีนเทียบกับบุคคลที่ไม่ได้รับวัคซีน

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]; ความชัน = (average_infected_5-average_infected_0)/5; line_y = [average_infected_0, (ความชัน*50)+average_infected_0]; line_x = [0, 50]; รูปที่ (2) พล็อต (graph_mat_x, graph_mat_y); บรรทัด (line_x, line_y, 'Color', 'red', 'LineStyle', '--'); title(['Trend in Unvaccination for ', โรค]); xlabel('เปอร์เซ็นต์ของการเริ่มต้นไม่ได้รับวัคซีน'); ylabel('เปอร์เซ็นต์ของการติดเชื้อขั้นสุดท้าย')

คำอธิบายรหัส

บรรทัดที่ 1: กำหนดค่า y ให้กับค่าเฉลี่ยของเปอร์เซ็นต์ที่ติดเชื้อ

บรรทัดที่ 2: กำหนดค่า x ให้กับเปอร์เซ็นต์ของเปอร์เซ็นต์เริ่มต้นที่ไม่ได้รับการฉีดวัคซีน

บรรทัดที่ 3: คำนวณความชัน 0% และ 5%

บรรทัดที่ 4: เก็บค่า y ของบรรทัด นี่คือความต่อเนื่องของส่วน 0% ถึง 5%

บรรทัดที่ 5: เก็บค่า y ของบรรทัด เส้นนี้ครอบคลุมความยาวของกราฟ

บรรทัดที่ 6: สร้างรูป

บรรทัดที่ 7: วาดกราฟค่า x และ y ของเปอร์เซ็นต์ที่ติดเชื้อซึ่งไม่ได้รับการฉีดวัคซีน

บรรทัดที่ 8: พล็อตบรรทัด ใช้เพื่อแสดงว่ามันไม่ได้เพิ่มขึ้นเป็นเส้นตรง แต่เพิ่มขึ้นแบบทวีคูณ

บรรทัดที่ 9: ตั้งชื่อให้กับกราฟ

บรรทัดที่ 10-11: ตั้งค่าป้ายกำกับ x และ y สำหรับกราฟ

ตอนนี้คุณควรจะเห็นว่ายิ่งประชากรไม่ได้รับการฉีดวัคซีนมากขึ้นเท่าใด การติดเชื้อก็จะยิ่งมากขึ้นเท่านั้น คุณจะเห็นว่าจุดส่วนใหญ่ที่เปลี่ยนเป็นสีแดงเป็นจุดสีเขียว แสดงว่าวัคซีนช่วยได้ในระดับหนึ่ง! หวังว่าคุณจะชอบบทช่วยสอนนี้ แสดงความคิดเห็นหากคุณมีคำถามใด ๆ !

ขั้นตอนที่ 15: ผลิตภัณฑ์ขั้นสุดท้าย: การจำลองมีลักษณะอย่างไร

รหัสทั้งหมดสามารถพบได้ที่นี่

แนะนำ: