Բովանդակություն:
- Քայլ 1: Ստեղծեք հարևանության մատրիցա
- Քայլ 2: Ստեղծեք հարաբերություններ:
- Քայլ 3: Ավելացրեք հիվանդությունների վիճակագրություն:
- Քայլ 4. Պատահականացրեք հավանականությունը, որ պատվաստված և չպատվաստված անձը կարող է վարակվել:
- Քայլ 5. Ստեղծեք նախնական տեղեկատվությունից չպատվաստված և վարակված մարդկանց մատրիցաներ:
- Քայլ 6: Հողամասի սկզբնական գրաֆիկ:
- Քայլ 7: Նմանակիր վարակի առաջընթացը:
- Քայլ 8. Օգտագործեք Մոնտե Կառլոյի տեսությունը:
- Քայլ 9. Ստեղծեք ֆայլը («վարակի Sim.M.m») սիմուլյացիայի միջոցով գործառույթի մեջ:
- Քայլ 10. Հաշվեք վարակված չպատվաստված և պատվաստված մարդկանց տոկոսը:
- Քայլ 11: Ստեղծեք ելքային փոփոխական ձեր գործառույթում «վարակված Sim.m.m»
- Քայլ 12: Ստեղծեք ընտրացանկ ՝ օգտվողից մոդելավորման սկզբնական պայմանները ստանալու համար:
- Քայլ 13. Ընտրեք չպատվաստված մարդկանց տոկոսը և հաշվարկեք չպատվաստված և վարակվածների միջին տոկոսը ընտրված տոկոսով:
- Քայլ 14: Գրաֆիկ. «Վարակման միտումը չպատվաստվածների դեմ Պատվաստված հատուկ հիվանդության համար '
- Քայլ 15. Վերջնական արտադրանք. Ինչպիսի՞ն է մոդելավորումը
Video: Պատվաստվել, թե ոչ նախիրների անձեռնմխելիության դիտարկումը հիվանդությունների մոդելավորման միջոցով. 15 քայլ
2024 Հեղինակ: John Day | [email protected]. Վերջին փոփոխված: 2024-01-30 09:51
Նախագծի ակնարկ
Մեր նախագիծը ուսումնասիրում է նախիրների անձեռնմխելիությունը և հույս ունի խրախուսել մարդկանց պատվաստումներ կատարել `մեր համայնքներում վարակի մակարդակը նվազեցնելու համար: Մեր ծրագիրը նմանակում է, թե ինչպես է հիվանդությունը վարակում բնակչությանը ՝ պատվաստված և չպատվաստված տարբեր տոկոսադրույքներով: Այն ցույց է տալիս նախիրների անձեռնմխելիությունը ՝ ցույց տալով, թե ինչպես է պատվաստված բնակչության ավելացած թիվը կարող նվազեցնել տուժած մարդկանց թիվը:
Մենք դա մոդելավորում ենք 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. Վերջնական արտադրանք. Ինչպիսի՞ն է մոդելավորումը
Ամբողջ ծածկագիրը կարելի է գտնել այստեղ
Խորհուրդ ենք տալիս:
Blynk հավելվածի միջոցով Nodemcu- ի միջոցով ինտերնետի միջոցով կառավարում. 5 քայլ
Blynk հավելվածի միջոցով Nodemcu- ի միջոցով ինտերնետի միջոցով կառավարելը. Բարև բոլորին, այսօր մենք ձեզ ցույց կտանք, թե ինչպես կարող եք վերահսկել LED- ը սմարթֆոնի միջոցով ինտերնետում
ԷՍԳ -ի ազդանշանային մոդելավորման ձեռքբերում LTSpice- ի միջոցով. 7 քայլ
LTSpice- ի միջոցով ԷԿԳ ազդանշանի ձեռքբերում. Սրտի պոմպային ունակությունը էլեկտրական ազդանշանների գործառույթ է: Բժիշկները կարող են կարդալ այս ազդանշանները ԷՍԳ -ի վրա `սրտի տարբեր խնդիրներ ախտորոշելու համար: Մինչև ազդանշանը կլինիկական մասնագետի կողմից պատշաճ կերպով պատրաստելը, այն պետք է պատշաճ կերպով զտվի և ուժեղացվի
LED Cube մոդելավորման ծրագիր `5 քայլ
LED Cube մոդելավորման ծրագրակազմ. Ես գրեթե ավարտեցի 8x8x8 LED խորանարդի կառուցումը և դրա հետ միասին եկավ այս ծրագրաշարը ԱՀ -ի համար: Այն օգնում է ձեզ ստեղծել անիմացիաներ և դրանք մոդելավորում է 2D էկրանին ՝ նախքան դրանք 3D բեռնվելը: Չկա (դեռ) աջակցություն
Բույսերի հիվանդությունների հայտնաբերում Qualcomm Dragonboard 410c- ով ՝ 4 քայլ
Բույսերի հիվանդությունների հայտնաբերում Qualcomm Dragonboard 410c- ով: Բարև բոլորին, մենք մասնակցում ենք Գյուտարար ապագան Dragonboard 410c մրցույթին, որը հովանավորվում է Embarcados, Linaro և Baita- ի կողմից: AVOID նախագիծ (Agro View Disease) և հայտնաբերել դիրքը
Տնական Studio Strobe Rig հովանոցային սեղմակով և մոդելավորման լույսով. 6 քայլ (նկարներով)
Տնական Studio Strobe Rig With Umbrella Clamp and Modeling Light. Ես շատ ժամանակ կոտրված եմ եղել, բայց միշտ ցանկացել եմ ունենալ ստուդիական ստրոբներ, որպեսզի հեշտությամբ դիմանկարներ անեմ, բայց ծախսերն ինձ համար անհասանելի են: Բարեբախտաբար, ես հասկացա, թե ինչպես պատրաստել սեղմիչ, որն օգտագործում է տաք կոշիկի ժապավեններ (դրանք կարող եք տեղադրել