SIR模型(SIR Model)是一個用於模擬傳染病在群體中傳播的數學模型。它的名稱來自於三個變數:易感者(Susceptible, S)、感染者(Infectious, I)和康復者(Recovered, R)。這個模型首次由Kermack和McKendrick在1927年提出,是流行病學中最基本的模型之一。
- 易感者(S): 這是指在某一特定時刻,尚未被感染但有可能會被感染的個體數量。
- 感染者(I): 這是指在某一特定時刻,已被感染並能夠傳播疾病的個體數量。
- 康復者(R): 這是指在某一特定時刻,已經從疾病中康復的數量。
- 總人口固定(不會移出移入): 即$N = S(t) + I(t) + R(t)$ 是定值。
- 接觸機率固定: 假設每個個體與其他個體間接觸的機率相同
- 免疫性: 康復者不會二次感染
SIR 模型可以使用 ODE 來描述,方程如下:
其中
-
$\beta$ 是傳染率: 表示易感者和感染者接觸時的感染率 -
$\gamma$ 是康復率: 表示感染者恢復轉變成康復者的速率
- 再生數:
$R_0 = \frac{\beta}{\gamma}$ : 如果$R_0 > 1$ 代表疾病會在群體中擴散,反之如果$R_0 < 1$ 疾病會逐漸消失 - 疾病階段
- 初期: 感染者數量急速上升
- 高峰: 感染者達到高峰後開始下降
- 穩定階段: 感染者數量下降到 0,大部分人成為康復者
SIR 模型可以用來研究各種傳染病的傳播,例如 COVID-19,有助於理解疾病的流行特徵,評估疫苗、防疫政策的效果,並且預測疾病爆發趨勢和規模。
我們想要模擬並拓展 SIR 模型來探討傳染病在不同條件下的傳播動態,也就是說傳統的 SIR 模型只有三種人: 易感者、感染者和康復者,很明顯現實世界中並不僅只有這三種,為了更真實地反映傳染病在現實世界中的傳播動態,我們將在基本的 SIR 模型基礎上引入更多變數和參數。具體來說,我們將考慮以下擴展:
- 死亡率 (Mortality rate): 現實中,一些感染者可能會因為疾病嚴重而死亡,這群人不再轉為康復者,而是變成了死亡者。
- 再次確診率 (Reinfection Rate): 某些疾病可能不會產生持久的免疫效果,意味著康復者在一段時間後可能再次成為易感者。
其中:
這是個非常難解決的微分方程,於是我們想透過模擬的方式或者說數值方式解決。
- JAVA (JDE 19)
- JAVAFX (22)
- 給使用者設定參數 (總人口、傳染率、再感染率、康復率、模擬天數、初始三區域感染人數)
- 三種地區 (城市、小城市、鄉村)
- 模擬每天的人口分布 (健康者、感染者)
- 跑數據圖顯示 (總人口數、未感染者數、康復者數、感染者數)
定義共用參數
- 總人口數
- 感染率(%)
- 再感染率(%)
- 康復率(%)
- 死亡率(%)
- 模擬天數
- 城市的初始感染人數
- 郊區的初始感染人數
- 鄉村的初始感染人數
- 移動步數
private int
- 總人口數
- 感染率(%)
- 再感染率(%)
- 康復率(%)
- 死亡率(%)
- 模擬天數
- 城市的初始感染人數
- 郊區的初始感染人數
- 鄉村的初始感染人數
- 移動步數
public Parameter(int total_population, int infection_rate, int reinfection_rate,int recovery_rate, int mortality_rate, int moving_times)
:建構子,初始化物件的各個變數- 各變數的 Getter 和 Setter
定義輸入介面,給使用者設定可控參數。
需要輸入的參數
- 總人口數
- 感染率(%)
- 再感染率(%)
- 康復率(%)
- 死亡率(%)
- 模擬天數
- 城市的初始感染人數
- 郊區的初始感染人數
- 鄉村的初始感染人數
- 各參數的標籤 (Label)
- 各參數的輸入框(private TextField)
- 各參數的數值(private int)
- 錯誤提醒(private Label)
- 確認按扭(private Button)
public void start()
:初始化使用者輸入介面,顯示視窗private VBox paint_window()
:用Grid
配置參數的標籤和輸入框private void handle_enter_button_click()
:按下確認扭後取得各輸入框的數值並存入對應的變數, 如果輸入不符合的值則顯示錯誤提醒private void reset_field_borders()
:如果輸入正確,還原輸入框顏色private void highlight_invalid_fields()
:將輸入不符合型態的輸入格標記為紅色框- 各個參數的 getter 和 setter
當使用者輸入不符合格式的資料,顯示錯誤提醒
用來模擬每個人口的狀況、移動模擬、碰撞偵測、(康復、死亡、感染)模擬。
- 位置 (x, y)
- 狀態 (未感染者、康復者、感染者、死亡者)
- 感染率
- 是否在通道,還是在城市裡
總共分成了兩種情況: 在城市裡面走路、在通道裡面走路。
下一位置為
- R 為每個人走路的幅度
-
$\theta$ 是走下一步的角度 (隨機 0~360度)
則維持和通道平行的角度,一路走到另外一個城市不換角度。
因為人不會是單一個點,所以設定在範圍九宮格內,只要有接觸到感染者就會去判斷是否被感染
每一天過完,會把所有感染者拿出來判斷他們是否會康復、死亡或繼續保持感染。
用來畫出目前的模擬地圖,以及人口的分布地圖
初始各地區人口佔比
- 城市人口佔比: 60%
- 小城市人口佔比: 30%
- 鄉村人口佔比: 10%
設計理念: 大城市很多人地區又很大,小城市區域小但是人卻很多,鄉村跟小城市大小差不多,但是人很少。
- 邊界: 0
- 大城市: 1
- 小城市: 2
- 鄉村: 3
- 垂直通道: 4
- 平行通道: 5
- 其他(視為障礙不可走的地區): -1
- 未感染者+康復者: 1
- 感染者: 2
利用格點化圖的方式
pixelWriter.setColor(x,y,color)
地圖的話把邊界設成黑色,可行走地區是白色,不可行走地區是藍色,方便使用者觀看。
人口的畫把未感染者或康復者設成綠色,感染者則設成紅色,死亡者不會出現在地圖上。
顯示死亡人數(黑),健康人數(綠),康復人數(藍),感染人數(紅)的數據圖
- 死亡人數,健康人數,康復人數,感染人數(
private final XYChart.Series<Number, Number>
) - xy軸(
private NumberAxis
) - 數據圖(
private LineChart<Number, Number>
)
public DataChart(int total_days, int total_population)
:建構子,根據total_days
、total_population
初始化xy軸的尺度public void start()
:初始化數據圖,顯示視窗public void update_data(int day, int susceptible, int infection, int health, int total)
:更新day
的人數資料
設定各數據線的顏色和粗細、圖例符號和顏色
/* 設定各數據線的顏色和粗細 */
.chart-series-line.series0 {
-fx-stroke: blue;
-fx-stroke-width: 2px;
}
.chart-series-line.series1 {
-fx-stroke: red;
-fx-stroke-width: 2px;
}
.chart-series-line.series2 {
-fx-stroke: green;
-fx-stroke-width: 2px;
}
.chart-series-line.series3 {
-fx-stroke: black;
-fx-stroke-width: 2px;
}
/* 設定各個數據線的圖例符號和顏色 */
.chart-legend {
-fx-background-color: transparent;
-fx-padding: 10px;
-fx-border-color: transparent;
}
.chart-legend-item {
-fx-font-size: 14px;
-fx-text-fill: black;
-fx-padding: 1px;
}
.chart-legend-item-symbol.series0 {
-fx-background-color: blue;
}
.chart-legend-item-symbol.series1 {
-fx-background-color: red;
}
.chart-legend-item-symbol.series2 {
-fx-background-color: green;
}
.chart-legend-item-symbol.series3 {
-fx-background-color: black;
}
- (Chen, Yi-Cheng) A Time-dependent SIR model for COVID-19 with Undetectable Infected Persons
- (LIU, YIN-TZU) Study on the Change of the Number of Cases of Notifiable Infectious Diseases in the COVID-19 Epidemic Prevention Strategy – A Case of Taiwan