Բովանդակություն:

Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով. 15 քայլ
Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով. 15 քայլ

Video: Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով. 15 քայլ

Video: Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով. 15 քայլ
Video: Մարդ-շուն հարաբերությունների համաէվոլյուցիան շների աչքերով | ՄԻ ԿՏՈՐ 2024, Հուլիսի
Anonim
Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով
Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով

Նախագծի ակնարկ

Մեր նախագիծը ուսումնասիրում է նախիրների անձեռնմխելիությունը և հույս ունի խրախուսել մարդկանց պատվաստումներ կատարել `մեր համայնքներում վարակի մակարդակը նվազեցնելու համար: Մեր ծրագիրը նմանակում է, թե ինչպես է հիվանդությունը վարակում բնակչությանը ՝ պատվաստված և չպատվաստված տարբեր տոկոսադրույքներով: Այն ցույց է տալիս նախիրների անձեռնմխելիությունը ՝ ցույց տալով, թե ինչպես է պատվաստված բնակչության ավելացած թիվը կարող նվազեցնել տուժած մարդկանց թիվը:

Մենք դա մոդելավորում ենք Matlab- ում ՝ օգտագործելով գրաֆիկայի տեսության հասկացությունները: Գրաֆիկական տեսությունը առարկաների միջև հարաբերությունները ներկայացնելու մաթեմատիկական միջոց է: Գրաֆների տեսության մեջ գրաֆիկներն ունեն գագաթներ (կամ հանգույցներ), որոնք կապված են եզրերով (կամ գծերով): Մեր նախագծի համար հանգույցները շահագրգիռ անձինք են, իսկ եզրերը `նրանց կապերը: Օրինակ, եթե երկու հանգույց կապված են եզրով, ապա դա նշանակում է, որ նրանք «ընկերներ» են կամ շփման ինչ -որ ձև ունեն միմյանց հետ: Այս շփումը հիվանդության տարածման միջոց է: Ահա թե ինչու մենք օգտագործեցինք գրաֆների տեսությունը `մեր հայեցակարգը մոդելավորելու համար, քանի որ ցանկանում էինք տեսնել, թե ինչպես են հիվանդությունները տարածվում պոպուլյացիայի մեջ կապ ունեցող անհատների միջև:

Մեր նախագիծը ներառում է նաև Մոնտե Կառլոյի մեթոդը: Մոնտե Կառլոյի մեթոդը ալգորիթմներ են, որոնք ստեղծում են կրկնակի պատահական նմուշառում ՝ թվային արդյունքներ ստանալու համար: Մեր նախագծում մենք օգտագործում ենք այս մեթոդը `մեր սիմուլյացիան մի քանի անգամ գործարկելու համար` փոխելով նախնական չպատվաստվածների տոկոսը `տեսնելով մարդկանց վարակման արագությունը:

Projectրագրի բոլոր ծածկագրերը կապված են ներքևում:

ԱՀ վարկ ՝

Matlab հղում Գրաֆիկայի տեսությանը ՝

Քայլ 1: Ստեղծեք հարևանության մատրիցա

Ստեղծեք հարևանության մատրիցա
Ստեղծեք հարևանության մատրիցա
Ստեղծեք հարևանության մատրիցա
Ստեղծեք հարևանության մատրիցա

Ստեղծեք նոր սցենար: Մենք մտադիր ենք մերն անվանել «վարակի Sim.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 = գրաֆիկ (ա); %օգտագործելով գրաֆիկի գործառույթը (գրաֆի տեսություն) նկարը (1); h = հողամաս (g);

Տե՛ս Նկար 1 (վերևում) ՝ տեսնելու, թե ինչպես կարելի է եզրեր ավելացնել հարակից մատրիցում ՝ օգտագործելով «Նշում» -ի ծածկագիրը:

Քայլ 2: Ստեղծեք հարաբերություններ:

Ստեղծեք հարաբերություններ
Ստեղծեք հարաբերություններ

Այժմ, երբ մարդիկ (գագաթները կամ հանգույցները) ստեղծվում են, մենք պետք է ստեղծենք հարաբերությունների ցանց (գրաֆիկի տողեր կամ եզրեր): Սա կ մոդելավորի, թե ինչպես են մարդիկ շփվում և հանդիպում այլ մարդկանց հետ մեկ օրվա ընթացքում:

Դա կարելի է անել բազմաթիվ եղանակներով: Այս առաջադրանքն ավարտելու եղանակներից մեկն այն է, որ յուրաքանչյուր անձին առաջին հերթին տրվի պատահական համար `որոշելու, թե յուրաքանչյուր մարդ օրական քանի մարդու հետ է շփվելու:

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

Սա կազմում է պատահական ամբողջ թվերի 1 -ից 20 մատրիցա, որը ներկայացնում է յուրաքանչյուր մարդու օրական փոխազդեցությունների քանակը: Այս մատրիցայի սյուները կլինեն յուրաքանչյուր անձին համապատասխան թիվը: Օրինակ, եթե մենք նշանակենք նվազագույնըFriendsPersonCanHave = 2 և mostFriendsPersonCanHave = 5, մենք կստանանք պատահական արժեքներ 2 -ից 5 -ի միջև:

Դժվարություններ ունե՞ք randi () - ի հետ: Տերմինալում մուտքագրեք

օգնել Ռանդիին

Հաջորդը, մենք կազմում ենք պատահականացված մատրիցա (որը կոչվում է «allFriendsmatrix») այն մասին, թե ինչպես է բնակչության յուրաքանչյուր անձ կապվում/փոխազդում բնակչության ներսում:

tempMatrix = ;

հաշվել = 0; allFriendsMatrix = ; k = 1 -ի համար. temp = randi ([1, NUMOFPEOPLE]); tempMatrix (հաշվարկ) = ջերմաստիճան; վերջը մաքրել յուրաքանչյուրը մինչ երկարությունը (tempMatrix) ~ = 9 tempMatrix = [tempMatrix, NaN]; վերջ allFriendsMatrix = [allFriendsMatrix; tempMatrix]; tempMatrix = ; հաշվել = 0; վերջ

Կոդի խորը բացատրություն

Սկզբում մենք ստեղծում ենք դատարկ ժամանակավոր մատրիցա `յուրաքանչյուր անձի ընկերների/փոխազդեցության ցուցակը պահելու համար: Մենք նաև նախաստորագրում ենք հաշվարկը, որը պարզապես հետևում է, թե որտեղ պետք է կպցնել նոր պատահական կապը tempMatrix- ում: For- ի օղակները գործում են 20 անգամ, այնպես որ դա տեղի է ունենում բնակչության յուրաքանչյուր առանձին անձի համար: Առաջին while հանգույցն աշխատում է մինչև յուրաքանչյուր անձի tempMatrix- ը պատահական նշանակված փոխազդեցությունների նույն երկարությունն է: Այս հանգույցում ստեղծվում է բնակչության թվին համապատասխանող պատահական թիվ և տեղադրվում է tempMatrix- ում: Քանի որ tempMatrixes- ի յուրաքանչյուրի երկարությունները տարբեր են, մենք պետք է ստեղծենք NaN- ի որոշ արժեքներ, որպեսզի կարողանանք այս բոլոր tempMaticies- ը միացնել մեկ մատրիցայի մեջ ('allFriendsMatrix'): Երկրորդ while loop- ը լուծում է այս խնդիրը `յուրաքանչյուր tempMatrix- ում ավելացնելով NaN's: Իսկ while օղակը պետք է գործարկվեր 9 անգամ, քանի որ այն 5 -ից մեծ թիվ է, որը ընկերների վերին սահմանն էր, որին կարող էր տրվել մարդ: «9» արժեքը փոփոխական է և կարող է/պետք է փոխվի, երբ «mostFriendsPersonCanHave» - ը մեծ է 9 -ից: Կոդի վերջին երեք տողերը (բացառությամբ վերջի) ավելացնում է tempMatrix- ը «allFriendsMatrix» - ի հաջորդ տողում: Այնուհետև այն մաքրում է tempMatrix- ը և հաշվում հաջորդ անձի համար:

Ելք

Ահա թե ինչպիսին պետք է լինի ելքը for loop- ի միջոցով առաջին վազքի համար (վերջին երեք տողերից առաջ):

tempMatrix = 16 8 17 16 13 NaN NaN NaN NaN

allFriendsMatrix =

16 8 17 16 13 NaN NaN NaN NaN NaN 8 8 2 7 11 NaN NaN NaN NaN 10 13 NaN NaN NaN NaN NaN NaN NaN 11NN 2 17 NaN NaN NaN NaN NaN NaN 10 12 NaN NaN NaN NaN NaN NaN NaN 4 13 2 12 NaN NaN NaN NaN NaN NaN 17 10 9 3 1 NaN 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 NaN 13 10 NaN NaN NaN NaN NaN NaN NaN 2N 18 10 16 NaN NaN NaN NaN NaN NaN 2 6 14 3 13 NaN NaN NaN NaN NaN 8 16 14 8 NaN 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 1N NaN NaN NaN NaN NaN NaN NaN NaN 16 7 13 10 1 NaN NaN NaN NaN

Հաջորդը, ավելացրեք այս հարաբերությունները adjMatrix- ին:

յուրաքանչյուր տողի համար = 1: NUMOFPEOPLE

eachCol = 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 %տեսակը ՝ կրկնակի; տոկոսային հավանականությունը, որ չպատվաստված մարդիկ չեն հիվանդանա

պատվաստանյութ %տեսակը ՝ կրկնակի; պատվաստված մարդկանց հիվանդությունը չստանալու տոկոսը unvacc_perc %տեսակը ՝ կրկնակի; բնակչության տոկոսը չպատվաստված init_infect %տեսակը: int; բնակչության տոկոսը պատվաստված է

Հաջորդը, մենք պետք է որոշ հաշվարկներ կատարենք:

Մենք պատրաստելու ենք «վարակիՄատ», որը 3*NUMOFPEOPLE մատրիցա է:

vac_perc = 1-unvacc_perc;

վարակ Mat = նան (3, NUMOFPEOPLE); համար = կլոր (vacc_perc * NUMOFPEOPLE); վարակ Mat (1, 1: համար) = պատվաստանյութ; վարակի Mat (1, թիվ+1: վերջ) = unvacc; վարակ Mat (2, 1: վերջ) = 0; վարակի Mat (2, 1: init_infect) = 1;

Կոդի բացատրություն

տող 1. Հաշվարկված է չպատվաստված բնակչության տոկոսը

տող 2. ստեղծել 3*N թվով մարդկանց մատրիցա

տող 3. պարզեք պատվաստված մարդկանց թիվը տոկոսից

տող 4. պատվաստված մարդկանց համար նրանց տվեք անձեռնմխելիություն ՝ կապված պատվաստանյութ ունենալու հետ: Այս արժեքը նշանակվում է ՝ հիմնվելով հիվանդության վերաբերյալ հետազոտությունների վրա:

տող 5. բնակչության մնացած մասի համար (չպատվաստված անձինք) նրանց տվեք տոկոսի անձեռնմխելիությունը: Այս արժեքը նշանակվում է ՝ հիմնվելով հիվանդության վերաբերյալ հետազոտությունների վրա:

տող 6. սկզբնական շրջանում սահմանել բոլոր մարդկանց վարակված չլինելը:

տող 7. սկզբնապես վարակված մարդկանց թվի համար համապատասխանաբար լրացրեք առաջին զույգ սյունակները:

Այժմ, երբ մենք սահմանել ենք հիվանդության մոդելավորման բոլոր պարամետրերը, մենք պատրաստվում ենք պատահականացնել այն հնարավորությունը, թե արդյոք անձը (թե պատվաստված, թե չպատվաստված) վարակվելու է: Սա արվում է հաջորդ քայլին ՝ 0 -ից 1 -ի միջև պատահական արժեքներ վերագրելով այս «վարակման» երրորդ շարքի յուրաքանչյուր անձի:

Քայլ 4. Պատահականացրեք հավանականությունը, որ պատվաստված և չպատվաստված անձը կարող է վարակվել:

Հաջորդը, յուրաքանչյուր անձին նշանակեք պատահական համար, որը հետագայում կօգտագործվի ՝ որոշելու ՝ վարակվա՞ծ է արդյոք մարդը, թե՞ ոչ:

w = 1 համար: երկարություն (վարակ

վարակի Mat (3, w) = rand; վերջ

Կոդի բացատրություն

Սա loop- ի համար վերաբերում է վերջին քայլում ստեղծված «վարակի վարակի» երրորդ շարքին: «rand» - ը 3 -րդ տողի յուրաքանչյուր ինդեքսին տալիս է 0 -ից 1 արժեք:

Ելք

infeMat- ն այժմ ավարտված է: Սա 100% պատվաստում ունեցող և սկզբնական վարակված 1 բնակչության դեպքում էր:

վարակ Mat =

Սյուներ 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.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», որոնք պահպանում են վարակված բոլոր վարակվածներին վարակվածությունից: Սա կօգտագործվի այնպես, որ մենք կարողանանք գունավոր կոդավորել վարակված, չպատվաստված կամ պատվաստված մարդկանց գրաֆիկը ՝ օգնելով պատկերացնել չպատվաստվածների և պատվաստված անձանց ազդեցությունը:

մաքրել յուրաքանչյուրը

matrixInfected = ; matrixUnvacc = ; համար h = 1: երկարություն (վարակՄատ), եթե վարակ վերջը անձի համար = 1. NUMOFPEOPLE if վարակի Mat (2, անձ) == 1 matrixInfected = [matrixInfected, person]; վերջ վերջ

Կոդի բացատրություն

Ստեղծեք երկու դատարկ մատրիցա ՝ համապատասխանաբար չպատվաստված և վարակված մարդկանց թիվը պահելու համար: Օղակների համար երկուսն էլ գործում են 20 անգամ, և եթե if հայտարարությունը բավարարված է, ապա թիվը ավելացվում է ճիշտ մատրիցին:

Ելք

matrixUnvacc =

matrixInfected =

[1]

Քայլ 6: Հողամասի սկզբնական գրաֆիկ:

Հողամասի սկզբնական գրաֆիկ
Հողամասի սկզբնական գրաֆիկ

Հաջորդը մենք պատրաստվում ենք գծել հարակից մատրիցը:

g = գրաֆիկ (adjMatrix);

նկար (1) p = գծապատկեր (g, 'NodeColor', 'b', 'MarkerSize', 7); ընդգծում (p, matrixUnvacc, 'NodeColor', 'g') highlight (p, matrixInfected, 'NodeColor', 'r') title_unvacc = unvacc_perc*100; վերնագիր (['Չպատվաստված մարդկանց տոկոսը.', num2str (title_unvacc), '%']); դադար (արագություն)

Կոդի բացատրություն

Գրաֆիկական տեսությունը Matlab- ում կառուցել է գործառույթներ: Երբ օգտագործում ենք գրաֆիկի () գործառույթը, մենք ի վիճակի ենք «adjMatrix» - ը թարգմանել իրական չուղղորդված գրաֆիկի: Այնուհետև մենք պետք է սյուժե ստեղծենք ՝ օգտագործելով plot () գործառույթը, որպեսզի իրականում տեսնենք, թե ինչպիսին է այն: Մենք այս սյուժեն () դնում ենք փոփոխականի վրա, որպեսզի կարողանանք ավելի հեշտությամբ շահարկել և փոխել սյուժեի գույները սիմուլյացիայի ընթացքում: Բոլոր մարդիկ (կամ հանգույցները) ի սկզբանե դրված են «կապույտ» գույնի վրա: Հաջորդը, բոլոր չպատվաստված մարդիկ սահմանում են «կանաչ» գույնը: Հետո վարակված մարդկանց վրա դրվում է «կարմիր» գույնը: Վերնագիրը սահմանվում է ըստ փորձարկվող չպատվաստված մարդկանց որոշակի տոկոսային արժեքի: Դադար () գործառույթը ժամանակավորապես դադարեցնում է MatLab- ի կատարումը: Մենք անցնում ենք տարածված փոփոխական արագությամբ, որը հաշվարկվում է վայրկյանների ընթացքում:

Տեսեք նկարը (վերևում) `պատահական գույնով ծածկագրված գրաֆիկ տեսնելու համար:

Իմացեք ավելին MatLab- ի highlight () գործառույթի մասին:

Քայլ 7: Նմանակիր վարակի առաջընթացը:

Հաջորդը մենք պետք է պարզենք, թե ով է վարակվում փոխազդեցություններից հետո (գրանցվում է adjMatrix- ում) և թարմացնում գրաֆիկը, երբ ինչ -որ մեկը վարակվում է:

Օգտագործեք adjMatrix- ը ՝ որոշելու, թե որ մարդիկ են վարակված մեկ օրվա ընթացքում մարդկանց հետ շփվելուց հետո:

յուրաքանչյուր տողի համար = 1: երկարություն (adjMatrix)

եթե infecMat (2, յուրաքանչյուր տող) == 1 յուրաքանչյուրի համար = 1: երկարություն (adjMatrix), եթե adjMatrix (everyRow, eachCol) == 1 % eachRow = անձը % eachCol = նրա ընկերը % յուրաքանչյուր անձի ընկերը և տեսեք, արդյոք նրանք վարակվա՞ծ են. եթե վարակըՄատ (3, յուրաքանչյուրԿոլ)> վարակիՄատ (1, յուրաքանչյուրԿոլ) վարակիՄաթ (2, յուրաքանչյուրԿոլ) = 1; ընդգծում (p, eachCol, 'NodeColor', 'r') դադար (արագություն) վերջ, վերջ, վերջ, վերջ, վերջ

For for loop- ը անցնում է յուրաքանչյուր անձի միջոցով: Այն ստուգում է, որ եթե անձը վարակված է, նա կստուգի մարդկանցից/ընկերներից յուրաքանչյուրին, ում հետ նրանք շփվել են, և կստուգի, թե արդյոք ընկերոջ անձեռնմխելիության մակարդակն ավելի մեծ է, քան հիվանդության ուժը: Հենց այստեղ է, որ գործում է ավելի վաղ ստեղծված «վարակակիրը»: Ընկերոջ յուրաքանչյուր սյունակի 1 -ին և 3 -րդ շարքերը համեմատվում են, և եթե 3 -րդ շարքն ավելի մեծ է, նշանակում է, որ ընկերը բավական բարձր անձեռնմխելիություն չուներ հիվանդությունից խուսափելու համար և ի վերջո վարակվում է: Մենք նաև փոխում ենք գույնի ՝ նշելով () կարմիրը, եթե վարակվում են:

Այժմ մոդելավորման ձեր կոդը պետք է աշխատի: և բնակչության ցանկացած չափի համար պարզապես փոխեք NUMOFPEOPLE- ը:

Քայլ 8. Օգտագործեք Մոնտե Կառլոյի տեսությունը:

Այս մեկ քայլն ավելի առաջ տանելու և մեր սիմուլյատորից տվյալներ հանելու համար («վարակի Sim. M»), մենք ուզում էինք հաշվարկել և գծագրել վարակված չպատվաստված մարդկանց տոկոսների և վարակվածների տոկոսների միտումը: Մենք ենթադրում ենք, որ վարակված պատվաստված մարդկանց տոկոսը պետք է շատ ավելի ցածր լինի, քան վարակված չպատվաստված մարդկանց տոկոսը:

Քայլ 9. Ստեղծեք ֆայլը («վարակի Sim. M.m») սիմուլյացիայի միջոցով գործառույթի մեջ:

Մոնտե Կառլոն աշխատեցնելու համար մենք կցանկանայինք մի քանի անգամ գործարկել սիմուլյացիան և կուտակել տվյալներ, որպեսզի կարողանանք օգտագործել դա վարակված մարդկանց տոկոսների գրաֆիկի համար:

Գործառույթը կարող է ստեղծվել այսպես.

գործառական ելք = վարակ Sim (unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect, speed)

Մեկնաբանեք ձեր մոդելավորման փոփոխականները, քանի որ այժմ դրանք փոխանցում եք հիմնական ֆայլով (մենք կսկսենք դա գրել 12 -րդ քայլում):

unvacc, vacc, NUMOFPEOPLE, unvacc_perc, init_infect

Նոր փոփոխական

արագություն

կնշանակվի հիմնական ֆայլում (Monte_Carlo.m):

Նշում. Գործառույթը ավարտելու համար մի մոռացեք գործառույթի ֆայլի ներքևի վերջը:

Քայլ 10. Հաշվեք վարակված չպատվաստված և պատվաստված մարդկանց տոկոսը:

Սա հաշվարկում է վարակված չպատվաստված մարդկանց տոկոսը: Այս ծածկագիրը գտնվում է «infeSim.m» ֆայլի ներքևում:

համարի_վինվակ = 0;

թիվ_infec_unvacc = 0; %-ը հաշվարկում է չպատվաստված մարդկանց տոկոսը, ովքեր վարակվել են x = 1: ավարտել, եթե վարակը լինի (Mat, 1, x) == unvacc & վերջի ավարտը_unvacc_and_infec = (number_of_infec_unvacc / number_of_unvacc)*100;

Կոդի բացատրություն

For loop- ում այն կշրջվի NUMOFPEOPLE անգամից ավելի: Ամեն անգամ, երբ վարակի մեջ թիվը համապատասխանում է անպատվաստված թվին (այսինքն ՝ 0.95 == 0.95), ապա չպատվաստված մարդկանց թիվը կավելանա 1 -ով: վարակվածների և չպատվաստվածների թիվն ավելանում է 1 -ով: Վերջին տողը բաժանում է վարակված, չպատվաստված մարդկանց թիվը չպատվաստվածների ընդհանուր թվի վրա: Հետո տոկոսը հաշվարկվում է սրանից:

Մարտահրավեր

Փորձեք հաշվարկել վարակված մարդկանց պատվաստվածների տոկոսը: (Հուշում. Այն շատ նման է վերը նշված կոդին, սակայն որոշ փոփոխականներ փոխվում են և անունները ճշգրտվում են):

Հաջորդը հաշվարկվում է վարակվածների տոկոսը `հիմնվելով ընդհանուր բնակչության վրա.

pre_per_infect = cumsum (վարակի Mat (2,:));

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

Կոդի բացատրություն

Կուտակային գումարը հաշվարկվում է վարակի երկրորդ շարքի միջոցով, որը պահպանում է 1 -ը և 0 -ը ՝ կախված վարակված անձի, թե ոչ:Քանի որ cumsum () ֆունկցիան հետ է տալիս մատրիցա, մենք վերցնում ենք մատրիցի վերջին արժեքը ('pre_per_infect (1, NUMOFPEOPLE)', որը պետք է լինի 'infeMat (2,:)' բոլոր արժեքների իրական գումարը: Բաժանելով գումարը NUMOFOEPLE- ի վրա և այն բազմապատկելով 100 -ով, մենք ստանում ենք ընդհանուր բնակչության վարակվածների վերջնական տոկոսը:

Քայլ 11: Ստեղծեք ելքային փոփոխական ձեր գործառույթում «վարակված Sim.m.m»

ելք = [մեկ_ վարակի, տոկոսի_ունվացքի_ և_ինֆեկտի, տոկոսային_վակկ_ի_ և վարակի];

Կոդի բացատրություն

Պահեք այս տեղեկատվությունը ելքի մեջ, որը հետ կուղարկվի հիմնական (Monte_Carlo.m) գործառույթը կանչելուց և գործարկելուց հետո: Այս տվյալները օգտագործվում են պատվաստված և չպատվաստվածների վարակվածների տոկոսի միավորների գծագրման համար:

Ձեր «infeSim.m» գործառույթը պետք է կատարվի հիմա: Այնուամենայնիվ, այն չի գործարկվի, քանի որ մենք դեռ պետք է գրենք հիմնականը:

Քայլ 12: Ստեղծեք ընտրացանկ ՝ օգտվողից մոդելավորման սկզբնական պայմանները ստանալու համար:

Հիշեք, թե ինչպես ասացինք փոփոխականը

արագություն

կստեղծվի՞ և կանցնի՞ հիմնական գործառույթով: Մենք պետք է ստանանք արժեքներ ՝ գործառույթին փոխանցելու համար: Ուշադրություն դարձրեք, գործառույթները կանչելիս արժեքների կարգը կարևոր է:

Սկսեք ՝ օգտվողին խնդրելով որոշ պատասխաններ մուտքագրել տերմինալում:

> Ընտրեք հիվանդություն: Նկատի ունեցեք, որ այն մեծատառերով է >> Pertussis >> Գրիպ >> Կարմրուկ >> Հիվանդություն Ընտրված է. Գրիպ >> Ընտրեք բնակչության չափը: >> 20 >> 200 >> Ընտրված բնակչությունը. 20 >> Ընտրեք մոդելավորման արագությունը: >> Արագ >> Դանդաղ >> Ընտրված արագությունը. Արագ

Ստորև բերված այս ծածկագիրը օգտվողին հարցնում է, թե ինչ հիվանդություն է նա ցանկանում դիտարկել:

disp («Ընտրիր հիվանդություն: Նշիր, որ այն զգայուն է գործերի նկատմամբ»)

fprintf ('Pertussis / nFlu / n Կարմրուկ / n') հիվանդություն = մուտքագրում ('Ընտրված հիվանդություն.', 's'); եթե անհավասար (հիվանդություն, «Pertussis») պատվաստանյութ =.85; %15 %հիվանդություն unvacc = 0,20; %80 տոկոսով հիվանդանալու հավանականությունը այլապես անհավասար է (հիվանդություն, «Գրիպ») պատվաստանյութ =.75; 25 %հիվանդություն unvacc = 0,31; %69 տոկոսով հիվանդանալու հավանականությունը այլապես անհավասար է (հիվանդություն, «կարմրախտ») պատվաստանյութ =.97; %Unvacc հիվանդանալու 3 %հավանականություն =.10; 90 %հավանականությամբ հիվանդությունը վերջանում է

Կոդի բացատրություն

Dis () գործառույթը տպում է հայտարարությունը էկրանին, ինչպես նաև տպում է տարբեր ընտրանքներ: Հիվանդությունը կնշանակվի համապատասխանաբար: Այս տարբերակը ներկայումս հաշվի համար չէ անվավեր մուտքագրում: Անվավեր մուտքագրումը կստեղծի սխալ և ամբողջությամբ կդադարեցնի ծրագիրը: Յուրաքանչյուր հիվանդություն ունի դրա հետ կապված պատվաստանյութ և ոչ պատվաստանյութ: Այս արժեքները պատահական չեն: Այս արժեքները մենք ստացել ենք հիվանդությունների վերաբերյալ վիճակագրության ուսումնասիրությունից:

Հաջորդը, մենք պետք է օգտագործողին հարցնենք, թե արդյոք նա ցանկանում է փորձարկել մեծ կամ փոքր բնակչության չափը իրենց ընտրած հիվանդության համար:

disp («Ընտրեք բնակչության չափը»)

fprintf ('20 / n200 / n ') արագություն = մուտքագրում (' Բնակչությունը ընտրված է ',' s '); եթե անհավասար (արագություն, '20') բնակչության չափ = 20; elseif անհավասար (արագություն, '200') բնակչության չափ = 200; վերջ

Կոդի բացատրություն

Սա տպում է հայտարարություն օգտվողին և խնդրում է օգտագործողին մուտքագրել բնակչության ինչ չափի է ցանկանում ստուգել: Այս տարբերակը ներկայումս հաշվի համար չէ անվավեր մուտքագրում: Անվավեր մուտքագրումը կստեղծի սխալ և ամբողջությամբ կդադարեցնի ծրագիրը: 20 -ն ընտրվել է, քանի որ դա փոքր ընտրանքի չափ է, որը դեռ լավ պատկերացում է տալիս, թե ինչպես է վարակը տարածվում փոքր բնակչության շրջանում: 200 մարդ ընտրվեց որպես ավելի մեծ տարբերակ, քանի որ գրաֆիկի վրա դրված 200 միավորը գրեթե միավորների համընկնում ունեին, այնպես որ ամեն ինչ հեշտությամբ կարելի էր տեսնել և տարբերակել միմյանցից:

Հաջորդը, մենք պետք է գտնենք մոդելավորման արագությունը:

disp («Ընտրեք մոդելավորման արագություն»)

fprintf ('Արագ / n Դանդաղ / n') արագություն = մուտքագրում ('Արագությունը ընտրված է', 's'); եթե հավասար է (արագություն, «արագ») sim_speed = 0; elseif անհավասար (արագություն, «Դանդաղ») sim_speed = 0.25; վերջ

Կոդի բացատրություն

Այս գործընթացը նույնն էր, ինչ հիվանդության տեսակը և բնակչության չափը ստանալը: Արագության համար դադար չի լինի: իսկ դանդաղ, սիմուլյացիան վարելիս կլինի loop- ի 0,25 վայրկյան ուշացում:

Հիանալի! Այժմ մենք ունենք մեզ անհրաժեշտ օգտվողի բոլոր մուտքերը: Եկեք անցնենք չպատվաստված մարդկանց տարբեր տոկոսների տվյալների հավաքագրմանը:

Քայլ 13. Ընտրեք չպատվաստված մարդկանց տոկոսը և հաշվարկեք չպատվաստված և վարակվածների միջին տոկոսը ընտրված տոկոսով:

Այս ծածկագիրը չպատվաստված մարդկանց 0% -ի համար է:

% ------- % 0 Չպատվաստված ------------

per_infect_av_0 = ; տոկոսային_ունվացք_ և_ինֆեկ_ավ_0 = ; i = 1:20- ի համար = վարակ Sim, per_infect_av_0 = [per_infect_av_0, դուրս (1, 1)]; տոկոսային_վինվակկ_ և_ինֆեկ_ավ_0 = [տոկոս_են_վերկակ_ և_ինֆեկ_ավ_0, դուրս (1, 2)]; վերջ միջին_ինֆեկտիվ_0 = միջին (per_infect_av_0); average_unvacc_and_infected_0 = միջին (միջին_unvacc_and_infec_av_0);

Կոդի բացատրություն

For for loop- ը գործարկվում է 20 անգամ: Ֆունկցիայի ելքը ՝ infeSim (), պահվում է դրսում: Ամեն անգամ, երբ for loop- ն աշխատում է, ապա ընդհանուր բնակչության մեջ վարակվածների տոկոսն ավելանում է մատրիցային ՝ «per_infect_av_0»: Բացի այդ, չպատվաստվածների և վարակվածների տոկոսը նույնպես ամեն անգամ ավելացվում է «տոկոսային_ունվակկ_ և_ինֆեկ_ավ_0» մատրիցի մեջ: Վերջին երկու տողերում այս երկու, վերը նշված մատրիցաները միջինացվում են միջինում և պահվում են փոփոխականների մեջ: Ամփոփելով ՝ տոկոսները պահվում են յուրաքանչյուր մոդելավորման համար, միջինացվում և գծագրվում: Մոնտե Կառլոն օգտագործվում է սիմուլյացիայի վարման և արդյունքի ցուցադրման միջին արժեքը ցույց տալու համար: Մեր փորձնական նպատակների համար մենք ընտրում ենք սիմուլյացիան 20 անգամ գործարկել և միջինացնել այդ արժեքները:

Մարտահրավեր

Կրկնեք այն բոլոր տոկոսների համար, որոնք ցանկանում եք ստուգել: Դա կարելի է անել ՝ փոփոխական անունները փոխելով ըստ տոկոսային թվերի: Մենք փորձարկեցինք 0%, 5%, 10%, 20%, 30%և 50%:

Հուշում.

Միակ տողը, որը պետք է փոխվի փաստացի ծածկագրում, դա է

դուրս = վարակ Sim

Փոխեք զրոյի տոկոսը տասնորդական տեսքով: Օրինակ, 5% չպատվաստված մոդելավորման դեպքում 0 -ը պետք է փոխարինվի 0.5 -ով:

Քայլ 14: Գրաֆիկ. «Վարակման միտումը չպատվաստվածների դեմ Պատվաստված հատուկ հիվանդության համար '

Սա այն ծածկագիրն է, որը թույլ է տալիս գրաֆիկ կազմել վարակման միտումն անպատվաստված անձանց և չպատվաստված անձանց մոտ:

graph_mat_y = [միջին_ վարակված_0, միջին_վարակված_5, միջին_վարակված_10, միջին_վարակված_20, միջին_վարակված_30, միջին_վարակված_50];

graph_mat_x = [0, 5, 10, 20, 30, 50]; թեքություն = (միջին_վարակված_5-միջին_վարակված_0)/5; line_y = [միջին_ վարակված_0, (թեքություն*50)+միջին_վարակված_0]; line_x = [0, 50]; գործիչ (2) գծապատկեր (գրաֆիկ_մատ, x_ գրաֆիկ_մաս); տող (line_x, line_y, 'Գույն', 'կարմիր', 'LineStyle', '-'); վերնագիր (['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. Վերջնական արտադրանք. Ինչպիսի՞ն է մոդելավորումը

Ամբողջ ծածկագիրը կարելի է գտնել այստեղ

Խորհուրդ ենք տալիս: