芥川龍之介が「蜘蛛の糸」を発表して百年。高二の秋の文化祭,クラスの仮装行列のテーマが 蜘蛛の糸だった。お釈迦様の極楽タワーの竹を近所から切り出し,地獄の焔と煙の絵を描いた。犍陀多に続いて蜘蛛の糸(登山部の赤いザイル)に群がる地獄の亡者だったころ。
2024年8月28日水曜日
スーパーシミュレーター
2023年4月23日日曜日
ブランコの物理
人間の体を3つの線質量要素で表現し,上半身と下肢の角度をそれぞれ変数として導入したラグランジアンを考えている。このとき,これらの身体の角度については,何通りかのあらかじめ定められたモデルの周期運動だとしている。遊具のブランコは、ブランコ本体とそれを揺らす人間からなる動的な結合振動子系である。本研究では、上半身の自然な動きの初期段階がブランコの連続的なポンピングに与える影響を分析するモデルを提案し、3種類の長さのブランコで10人の参加者が実際にポンピングした際の運動データを用いて検証する。研究の結果から、スイングが垂直位置(中点)にあり、振幅が小さい時に前方へ移動する際、最大リーンバックの初期段階が発生し、最大振幅のポンピングが予測された。振幅が大きくなるにつれて、最適な初期段階はサイクルの初期段階、すなわちスイングの軌道の後端に向かって徐々に移動する。モデルの予測に従って、参加者全員が、スイングの振幅が大きくなるにつれて上半身の動作の初期位相が早くなることが確認された。この結果から、スイングする人は、上半身の動作の頻度と初期位相を適切に調整することで、ブランコを効果的にポンピングすることができると考えられる。
Do[s0 = Pi/6*0; w0 = Pi; m1 = 1; m2 = 1;λ = Pi/12; ν = 0.05/Pi; ε = 0.95 + i*0.01; δ = Pi/8*0;m[t_] := (m1 + m2)/20 * Cos[ε w0 t + δ];sol = NDSolve[{(m1 + m2) s''[t] == -w0^2 *( (m1 + m[t]) * (Sin[s[t] + λ + ν * s'[t])+ (m2 - m[t]) * (Sin[s[t] - λ + ν * s'[t])),s[0] == s0, s'[0] == 0}, s, {t, 0, 60}];s /. sol[[1]];f[t_] := s[t] /. sol[[1]];g[t_] := s'[t] /. sol[[1]];h[i] = Plot[f[t], {t, 0, 30}, AspectRatio -> 1/2,PlotRange -> {-0.6, 0.6}, PlotStyle -> Hue[0.08*i]],{i, 0, 7}]
2023年2月19日日曜日
弾道ミサイルの軌道(6)
g = 0.0098; R = 6350; τ= 86; p = 0.75;a = 0.0446; s = 86.5 Degree; T = 3960;(* g = 0.0098; R = 6350; τ = 87; p = 0.75; a= 0.0446; s = 45 Degree; T = 5100; *)fr[t_, τ_] := a*Sin[s]*HeavisideTheta[τ - t]ft[t_, τ_] := a*Cos[s]*r[t]*HeavisideTheta[τ - t]fm[t_, τ_] := -p/(τ - p*t)*HeavisideTheta[τ - t]sol = NDSolve[{r''[t] == -fm[t, τ]*r'[t] + h[t]^2/r[t]^3 -g R^2/r[t]^2 + fr[t, τ], r[0] == R, r'[0] == 0,h'[t] == -fm[t, τ]*h[t] + ft[t, τ], h[0] == 0}, {r, h},{t, 0, T}]f[t_] := r[t] /. sol[[1, 1]]d[t_] := h[t] /. sol[[1, 2]]Plot[{6350, f[t]}, {t, 0, T}]Plot[{f[t + 1] - f[t], d[t]*R/f[t]^2, d[t]/f[t]},{t, 0, T}, PlotRange -> {-4, 8}]tyx[T_] := {T, f[T] - R, NIntegrate[R d[t]/f[t]^2 , {t, 0, T}]}v[T_] := Sqrt[(f[T] - f[T - 1])^2 + (R d[T]/f[T]^2)^2]{tyx[T], v[T]/0.340}g0 = ParametricPlot[{NIntegrate[R d[t]/f[t]^2 , {t, 0, tt}],f[tt] - R}, {tt, 0, T}]
燃焼時間τが86秒,燃料重量比が0.75,燃焼加速度が 0.0446km/s^2,投射角が86.5度である。これで飛行時間を与えると,飛行距離と最高高度と落下時速度が概ね再現できる。万有引力は距離の2乗に反比例し,コリオリ力や空気抵抗は無視,地球の形を考慮して2次元極座標で質量が変化する1段ロケットの微分方程式を解いている。
燃焼時間τを87秒にして,投射角を45度にすれば,飛行時間が5100秒で飛行距離は14,600km,落下時速度はマッハ24になる。このときペイロードはほとんど変化させていない。燃料重量比は同じで燃焼時間を1秒のばしただけだ。
2022年8月23日火曜日
SIDRモデル(2)
SIDRモデル(1)からの続き
牧野さんの例では,感染期間/免疫消失期間が1/100 と小さくなる場合が示されていた。そこで,これに対応するケースの計算をしてみた。
R = 5; \[Gamma] = 13; \[Beta] = R/\[Gamma]; \[Alpha] = 130*10;基本再生産数と免疫消失期間を前回のそれぞれ2.5倍,10倍にしている。
sol = NDSolve[{
x'[t] == \[Beta] x[t] (1 - x[t] - y[t] - z[t]) - x[t]/\[Gamma],
y'[t] == 0.9987*x[t]/\[Gamma] - y[t]/\[Alpha],
z'[t] == 0.0013*x[t]/\[Gamma],
x[0] == 0.01, y[0] == 0, z[0] == 0}, {x, y, z}, {t, 0, 3000}];
fx[t_] := x[t] /. sol[[1, 1]]
fy[t_] := y[t] /. sol[[1, 2]]
fz[t_] := z[t] /. sol[[1, 3]]
Plot[fx[t], {t, 0, 3000}, PlotRange -> {0, 0.5}]
Plot[fz[t], {t, 0, 3000}, PlotRange -> {0, 0.01}]
2022年8月22日月曜日
SIDRモデル(1)
エンデミックからの続き (参考:感染症の数理シミュレーション(2))
西浦博さんが紹介している既知のSIRSモデルは,年齢構造や平均余命まで考慮した精緻なモデルだが,一般ピープルがその振る舞いを試してみるには大層なので,単純なSIDRモデルを考えてみた。本質的に,牧野淳一郎さんが最近計算したモデルと等価であり,念のため死亡者数をちょっと取り出しただけだ。
R = 2; \[Gamma] = 13; \[Beta] = R/\[Gamma]; \[Alpha] = 130;
sol = NDSolve[{
x'[t] == \[Beta] x[t] (1 - x[t] - y[t] - z[t]) - x[t]/\[Gamma],
y'[t] == 0.9987 * x[t]/\[Gamma] - y[t]/\[Alpha],
z'[t] == 0.0013 * x[t]/\[Gamma],
x[0] == 0.01, y[0] == 0, z[0] == 0}, {x, y, z}, {t, 0, 1000}]
fx[t_] := x[t] /. sol[[1, 1]]
fy[t_] := y[t] /. sol[[1, 2]]
fz[t_] := z[t] /. sol[[1, 3]]
Plot[fx[t], {t, 0, 1000}, PlotRange -> {0, 0.2}]
2022年7月18日月曜日
手計算による第7波ピーク予測(1)
新型コロナウィルスオミクロンBA.5株(BA.4はどこに行った?)による感染者数がこのところ急増している。その一方で,近鉄大和西大寺や祇園祭は人であふれているらしい。
京大の西浦博さんは過去の経験で懲りたのか,ポルトガルの分析グラフを解説するだけで,本邦の数値予測をマスコミには見せていない。KEKの野尻美保子さんも仕事先のヨーロッパで感染して忙しいらしく,以前のような感染者の重症度重み付きグラフを出していない。
名古屋工業大学のグループによるAI予測の結果が,7月8日にNHKで取り上げられていた。それによれば,東京では7月25日に18,000人のピークを迎えるという。実際には,7月15日に19,000人であり,たった1週間先もまともに推定できていなかった。感染症数理モデルの専門家をよんでこないとだめじゃないの。タイトルにAIがあればよいという発想がアウトだ。
そんなわけで,素人が,費用0円,手計算で第7波のピークを予測することにする。
2022年5月17日火曜日
越中大門
越中大門は富山県射水市にある北陸本線の駅だ。北陸新幹線の開通後は,並行在来線の廃止にともなって第3セクターのあいのかぜ富山鉄道が運営している。
ところで,Unreal Engine 5 は,エピックゲームズというアメリカのコンピュータゲーム・ソフトウェアの開発会社がつくった,ゲームエンジンである。3次元コンピュータグラフィックス生成用のプログラムを3Dエンジンとよんでいたが,この延長上の概念に相当する。
Unreal Engine 5 は2020年に発表された。この機能を利用して,Lorentz Dragoというイタリアの3D環境アーティストが個人でモデリング,テクスチャリング,ライティング,アニメーションのすべてを手がけたものが,越中大門の駅の3DCGアニメーションだ。YouTube で2分49秒のコンテンツだけれど,見た目にはまったく現実の駅を撮影したものといわれてもわからない。途中で昼のシーンが急に夜に変わったところではじめてコンピュータによる合成画像だと気付く。
この技術がメタバースに組み込まれると,視覚上はほとんど現実と区別のつかない仮想世界体験が得られるかもしれない。
越中大門は,子どものころ母の実家の滑川まで里帰りするとき,蒸気機関車が牽引する鈍行列車で通過したなじみ深い駅だ。当時の北陸本線の駅を確認すると次のようになっていて,越中大門はちょうど金沢と滑川の中間あたりにある。
(現IRいしかわ鉄道)金沢−東金沢−森本−津幡−倶利迦羅−(現あいの風とやま鉄道)石動−福岡−西高岡−高岡−越中大門−小杉−呉羽−富山−東富山−水橋−東滑川−滑川
ものごころついてから小学校5-6年ごろまで通ったのだが,西高岡,東富山,東滑川はあまり記憶に残っていない。東滑川はまだ開業していなかったかもしれない。北陸線の電化が進んで蒸気機関車が廃止になるころには,里帰りについていくこともなくなってしまった。
何度かトンネルをくぐるのだが,そのたびに蒸気機関車の煙が入らないよう窓を閉めていた。高岡駅のホームなどで母がアイスクリームを買いに降りるのだが,時間内に帰ってこられるかどうかドキドキしながら待っている小学生であった。
2021年9月14日火曜日
太陽自転
千葉大学の堀田英之准教授と名古屋大学の草野完也教授が,スーパーコンピュータ富岳を用いて太陽内部の熱対流・磁場を精密に計算することによって,太陽では赤道が北極・南極(極地方)よりも速く自転するという基本自転構造(差動回転) を,世界で初めて人工的な仮説を用いずに再現することに成功した。
これまでのスーパーコンピュータ京では計算可能な解像度が1億点だったのが,富岳では54億点の超高解像度計算が可能となった。これにより,太陽内部の磁場のエネルギーが乱流のエネルギーの最大2倍以上という従来の常識(乱流エネルギーに比べて磁場エネルギーは十分小さい)を破る結果が得られ,同時に,赤道が極より速く回転する差動回転を初めて再現することができた。
京と富岳ではスーパーコンピュータ高速化のためのプログラミング技術がかなり異なるのでそれを克服したのが重要だった。その上で,計算メッシュ数を増やすことによって本質的に異なった物理が得られ,「熱対流の難問」と呼ばれる長年の謎を解決したという興味深い結果だ。
2021年7月21日水曜日
MCMCへの道(3)
MCMCへの道(2)からの続き
次は,MCMC法#3マルコフ連鎖である。昼食のメニューが3種類に限られていて,なおかつ当日のメニュー選択の確率が,前日のメニューだけによって定まるという例があげられていた。はい,この例は非常によくわかる。
問題は,Juliaの配列と行列の扱いだ。MahthematicaはすべてListと考えればよいのでわかりやすかったが,Juliaでは型として,ArrayもMatrixもある。見様見真似でとりあえずコードを書いたのだけれど,まだ十分理解できていない。このため,3x3行列の配列であるbをベクトルvにかけて得られる配列の転置ができなかったので,手動で転置している。#using LinearAlgebra
using Plots
x=[zeros(3) for i in 1:11]
y=[zeros(11) for i in 1:3]
#
a=[0.2 0.1 0.3 ; 0.2 0.6 0.5 ; 0.6 0.3 0.2]
b=[zeros(3,3) for i in 1:11]
b[1]=[1 0 0 ; 0 1 0 ; 0 0 1]
v=[0.3,0.2,0.5]
#
for i in 2:11
b[i]=a*b[i-1]
end
for j in 1:11
x[j]=b[j]*v
end
#
for i in 1:11
for j in 1:3
y[j][i]=x[i][j]
end
end
#
plot(y,legend=:bottom, xlim=(0,10),ylim=(0,0.6))
2021年7月19日月曜日
MCMCへの道(2)
MCMCへの道(1)からの続き
さて,MCMC法#2棄却サンプリングである。手順は次の通り。
(1) 目標分布 p(x) を事後分布ともいう。これは既知の関数。
(2) 乱数発生計算が容易な分布 q(x) で, k q(x) ≧ p(x) を満たすものを選ぶ。 kは正定数。例えば,一様分布とか正規分布。
(3) q(x) にしたがう乱数 x' を発生する。
(4) [0, k q(x)] の一様分布にしたがう乱数 y' を発生する。
(5) y' ≦ p(x') ならx' を採用する。そうでなければ棄却する。
この(3) から(5) を必要なだけ繰り返す。
using Plots
function beta(x,a,b)
return x^(a-1)*(1-x)^(b-1)
end
x= [k for k in 0.0:0.001:1.0]
y= beta.(x,10.2,5.8)
z= [0.00013 for k in 0.0:0.001:1.0]
scatter(x,y,xlim=(0,1.0),ylim=(0,0.00015),
markershape = :circle,
markersize = 1,
markeralpha = 0.75,
markercolor = :blue,
markerstrokewidth = 0.1,
markerstrokealpha = 0.1,
markerstrokecolor = :white)
markershape = :circle,
markersize = 1,
markeralpha = 0.75,
markercolor = :orange,
markerstrokewidth = 0.1,
markerstrokealpha = 0.1,
markerstrokecolor = :white)
n=3000
p=rand(n)
r=0.00013*rand(n)
q=ones(n)
for i in 1:n
f=beta(p[i],10.2,5.8)
q[i]=ifelse(f <= r[i],0,r[i])
end
g2=scatter(p,q,xlim=(0,1.0),ylim=(0,0.00015),
markershape = :circle,
markersize = 1,
markeralpha = 0.75,
markercolor = :green,
markerstrokewidth = 0.1,
markerstrokealpha = 0.1,
markerstrokecolor = :white)
plot(g1,g2,legend=:left,aspect_ratio=6000)
2021年7月14日水曜日
MCMCへの道(1)
そういえば,機械学習をまともに勉強していなかった。いや,そもそも統計学も確率論もあれもこれもである。先日の水素原子波動関数の可視化についても進んでいないのだけれど,どうやら,メトロポリス・ヘイスティング法を使うのが望ましいらしい(by tsujimotter)。そういえば,モンテカルロ法もまともに勉強してこなかった。
そこで,反省してMCMC(マルコフ連鎖モンテカルロ法)の全体像をマスターすべく,いろいろ探したが,おこちゃま向けの適当なテキストがない。こうなるとYouTubeだのみだ。機械学習基礎理論独習というサイトがあったので,このPythonコードをJuliaで再現しながら学ぶことにした。
その1回目はMCMC法#1モンテカルロ法なので,これを再現してみた。
using BenchmarkTools
using Random
using Plots
function findpi(n)
rng = MersenneTwister(0)
count = 0
for i in 1:n
count += ifelse(rand(rng)^2+rand(rng)^2<=1.0,1,0)
end
return 4*count/n
end
#@btime findpi(10^6)
#@benchmark findpi(10^8)
function circle(n)
x=rand(n)
y=rand(n)
c=zeros(n)
for i in 1:n
c[i]=ifelse(x[i]^2+y[i]^2<=1.0,0.0,1.0)
end
scatter(x,y,
marker_z = c,
markershape = :circle,
markersize = 1,
markeralpha = 0.2,
markercolor = :grey,
markerstrokewidth = 0.1,
markerstrokealpha = 0.1,
markerstrokecolor = :white,
markerstrokestyle = :dot,
aspect_ratio = 1.0,
xlim=(0.0,1.0),
ylim=(0.0,1.0),
legend=:topright
)
end
circle(10000)
2020年5月26日火曜日
緊急事態宣言解除(3)
昨日,残っていた北海道,東京都,神奈川県,埼玉県,千葉県の緊急事態宣言が解除された。記念に東京都のモデル計算を行ってみた。なんだかグダグダな対応のうちに,よく理由はわからないが,欧米とは異なり,他の東アジアやオセアニア地域なみの水準で第1波はおよそ終息したように思われる。
モデル計算で使用したパラメタは,$\alpha_1=5/0.8,\ \alpha_2=5/0.2,\ \beta=0.505,\ \gamma_1=15/0.94,\ \gamma_2=15/0.06,\ \lambda=35,\ \tau=14,\ \nu=0.1$である。時刻の基準は,新規感染数累計と東京の人口比が10ppmになる時点の3月23日としており,日本の場合とちがって,新規感染数の初期値は正しい値となっている。
NHKなどで毎日報道されているデータを東京の人口で割って1万人あたりの数に換算したものが上記グラフのサークルであり,下記の値を用いた。なお日時の原点は3/22としている(無駄に有効数字が多くて気持ち悪いのだが面倒なのでそのままにした結果)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
xt=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,37,38,39,40,41,
42,43,44,45,46,47,48,49,50,51,52,53,54,55,
56,57,58,59,60,61,62]
yt=[0.1100,0.1221,0.1514,0.1850,0.2136,0.2571,0.3057,
0.3164,0.3721,0.4193,0.4886,0.5521,0.6364,0.7386,
0.7964,0.8529,0.9557,1.0850,1.2179,1.3586,1.4771,
1.5414,1.6564,1.7471,1.8536,1.9957,2.1250,2.2014,
2.2743,2.3621,2.4564,2.5521,2.6664,2.7400,2.7914,
2.8193,2.8993,2.9329,2.9657,3.0836,3.1979,3.2629,
3.3250,3.3657,3.3914,3.4079,3.4357,3.4614,3.4771,
3.5421,3.5621,3.5693,3.5907,3.5971,3.6071,3.6107,
3.6179,3.6214,3.6250,3.6664,3.6686,3.6700,3.6800]
zt=[0.286,0.357,0.357,0.357,0.357,0.357,0.357,
0.857,0.857,0.857,1.000,1.357,1.643,2.143,
2.214,2.500,2.571,2.857,2.857,3.000,3.000,
3.357,3.786,4.000,4.500,4.857,5.071,5.500,
5.786,5.786,6.214,6.643,7.143,7.143,7.571,
7.714,8.357,8.571,9.000,10.071,10.357,10.714,
10.714,11.071,11.429,12.214,12.857,12.857,13.500,
14.000,14.500,15.143,15.643,16.429,16.929,17.214,
17.429,17.643,18.286,18.786,18.786,18.786,18.800]/100
plot(xt,yt,st=:scatter,label="Confirmed-tokyo")
plot!(xt,zt,st=:scatter,label="Deaths-tokyo")
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2020年5月21日木曜日
緊急事態宣言解除(2)
無理無理日本のデータにあわせた単純なモデル計算を実行してみると次のようになった。全回復数累計(無症状感染からの回復を含む)は1万人当り6人強にしかならず,例の0.6%とはどうしても1桁違うのであった。なお,使用したパラメタは,$\alpha_1=5/0.8,\ \alpha_2=5/0.2,\ \beta=0.67,\ \gamma_1=15/0.94,\ \gamma_2=15/0.06,\ \lambda=63,\ \tau=14,\ \nu=0.001$である。$\nu$は想定値の0.01より1桁小さく取ってはじめてこの程度の一致をみているので,真の感染数や死亡数は現在報告された値より10倍程度までの範囲で変化することがありうるかもしれない。そのときには,0.6%が再現できるのことになるのだが・・・
2020年5月8日金曜日
小田垣さんのSIQR
小田垣さんのホームページにその論考があった[1]。SIQRモデルということで,感染者を2段階に分けていた。我々のSIIDR2モデルと本質的に同じではないか。感受性保持者S(t)から直接我々の重症患者I2(t),すなわち小田垣さんの隔離感染者Q(t)に遷移する項があって,ここは違うのだが,議論が始まる前の段階でこの項を落としているので結局同じです。違うのはこちらには死亡数D(t)への遷移を含んでいることくらいである。
そこで両方のモデルで使用しているパラメタを比較してみた。左が小田垣さんのSIQR,右が我々のSIIDR2である。
\begin{equation}
\begin{aligned}
N\beta \quad (0.07) &= \beta \quad (0.4-0.6) \\
p \quad (0.096) &= \dfrac{1}{\alpha_2} \quad (0.04) \\
\gamma \quad (0.04) &= \dfrac{1}{\alpha_1} \quad (0.16) \\
\gamma \quad (0.04) &= \dfrac{1}{\gamma_1}\quad (0.064) \\
noparameter (0) &= \dfrac{1}{\gamma_2}\quad (0.00267) \\
\end{aligned}
\end{equation}
感染率の$\beta$が一桁違うことがわかる。その他はファクターが異なるくらいである。I(t)からR(t)への遷移時間とQ(t)からR(t)への遷移時間が同じとしていることもやや疑問に感じる。また,小田垣氏は論考の中で,基本再生産数(実効再生産数)は$N\beta/p$でなく$N\beta/(p+\gamma)$とすべきだと主張しているが,これはどうなのだろうか。
とりあえず,感染初期のS(t)=Nのときにあてはめて,接触5割減の議論に持ち込んでいる部分は興味深いが,実際にこのパラメータを使って日本の感染データの全体像を説明できるのだろうか。我々のコードを少し修正して彼らのモデルとパラメタを使った計算を再現してみた(初期値の細かな調整は我々のモデルを前提としているがとりあえずはそこはそのままにしておく)。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
using DifferentialEquations
using ParameterizedFunctions
using Plots; gr()
sky = @ode_def SIQR_model begin
du0 = 1 # u0:time
du1 = -β*u1*u2/n # u1:Noimmunity(Susceptible)
du2 = β*u1*u2/n -u2/α2 -u2/α1 # u2:(Infected)
du3 = u2/α2 -u3/γ1 # u3:(Quarantined)
du4 = u3/γ2 # u4:Dead(not in use)
du5 = u2/α1 +u3/γ1 # u5:Recovered
du6 = u2/α2 # u6:Accumulated Quarantined
du7 = u3/γ1 # u7:Accululated Recovered
end n α1 α2 β γ1 γ2 λ τ
function epidm(β,ν,λ,τ,T)
n=10000.0 #total number of population
α1=1/0.04 #5.0/0.8 #latent to recovery (days/%)
α2=1/0.096 #5.0/0.2 #latent to onset (days/%)
β=0.07 #0.45 #infection rate (/day・person)
γ1=1/0.04 #15.0/0.96 #onset to recovery (days/%)
γ2=15.0/0.04 #onset to death (days/%) (not in use)
u0 = [0.0,n-11ν,4ν,2ν,0.0,5ν,ν,0.0] #initial values
p = (n,α1,α2,β,γ1,γ2,λ,τ) #parameters
tspan = (0.0,T) #time span in days
prob = ODEProblem(sky,u0,tspan,p)
sol = solve(prob)
return sol
end
#japan-data(start=3/1)
xj=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,37,38,39,40,41,
42,43,44,45,46,47,48,49,50,51,52,53,54,55,
56,57,58,59,60,61,62]
yj=[0.0190,0.0202,0.0213,0.0225,0.0252,0.0277,0.0324,
0.0361,0.0387,0.0408,0.0451,0.0492,0.0536,0.0568,
0.0619,0.0646,0.0658,0.0658,0.0693,0.0754,0.0790,
0.0830,0.0864,0.0895,0.0947,0.103,0.110,0.119,
0.134,0.148,0.155,0.173,0.189,0.208,0.232,
0.260,0.290,0.310,0.338,0.378,0.424,0.477,
0.536,0.576,0.607,0.643,0.681,0.728,0.777,
0.822,0.853,0.882,0.912,0.946,0.983,1.018,
1.046,1.062,1.078,1.099,1.118,1.133,1.154]
zj=[0.040,0.048,0.048,0.048,0.048,0.048,0.048,
0.048,0.056,0.071,0.095,0.119,0.151,0.167,
0.175,0.190,0.222,0.222,0.230,0.262,0.278,
0.286,0.325,0.333,0.341,0.357,0.365,0.389,
0.413,0.429,0.444,0.452,0.452,0.516,0.548,
0.556,0.579,0.635,0.643,0.675,0.698,0.746,
0.778,0.810,0.865,0.944,1.079,1.175,1.222,
1.278,1.357,1.476,2.198,2.278,2.516,2.651,
2.762,2.786,2.984,3.087,3.294,3.429,3.603]/100
plot(xj,yj,st=:scatter,label="Confirmed-japan")
#plot!(xj,zj,st=:scatter,label="Deaths-japan")
β=0.07
ν=0.01
T=60
@time so=epidm(β,ν,λ,τ,T)
#plot!(so,vars=(0,2))
#plot!(so,vars=(0,3))
plot!(so,vars=(0,4))
#plot!(so,vars=(0,5))
#plot!(so,vars=(0,6))
plot!(so,vars=(0,7))
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
[1]新型コロナウイルスの蔓延に関する一考察(小田垣孝,2020.5.5)
[2]隔離と市中の感染者を分ける SIR モデル(佐野雅己,2020.4.29)
[3]3.11以後の科学リテラシー No. 89(牧野淳一郎,2020 科学5月号)
[4]感染症の数理シミュレーション(8)(2020.3.15)
2020年5月6日水曜日
米国の集団免疫率(3)
タイトルはもう変更したほうがいいかもしれない。というのも,抗体検査の結果,ニューヨーク州では12.3%が抗体を持っている(感染済)という結果がでているからだ。こちらの結果とはほぼ1桁違うので,我々のモデルの前提や仮定のどれかががまったく間違っているのではないか。しかし,モデルを検討する余力がないので(遠隔授業の準備で手いっぱい),そこは放置したまま,米国の新しいデータに基づいたパラメタ推定を行う。というのも,これまでの6万人から6.5万人という発表に代わり,再び死亡者が10万人を越えるという予想が出ているからだ。前回と同様に,HEMLのCOVID-19 projections のページを見れば,確かに米国全体の死亡数は8月には13.4万人になりそうだとある。
前回同様のSIIDR2モデルで計算する。使用するWHOのデータ(人口1万人当り)はこれ。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ya=[0.014,0.021,0.030,0.038,0.051,0.051,0.051,
0.106,0.107,0.215,0.317,0.462,0.462,0.958,
1.280,1.576,1.929,2.074,2.587,3.136,3.722,
4.268,4.953,5.684,6.483,7.335,8.310,9.327,
10.13,11.03,11.99,12.93,14.00,14.96,15.92,
16.81,17.55,18.33,19.20,20.19,21.10,21.96,
22.80,23.58,24.31,25.19,26.12,27.29,28.28,
29.16,29.85,30.47,31.42,32.39,33.20,34.16]
za=[0.0006,0.0008,0.0009,0.0011,0.0012,0.0012,0.0012,
0.0018,0.0018,0.0030,0.0046,0.0061,0.0061,0.0122,
0.0143,0.0204,0.0268,0.0301,0.0377,0.0506,0.0641,
0.0728,0.0865,0.117,0.146,0.178,0.213,0.254,
0.290,0.329,0.387,0.445,0.504,0.562,0.620,
0.667,0.712,0.785,0.856,0.922,0.984,1.038,
1.089,1.141,1.216,1.284,1.337,1.402,1.456,
1.492,1.532,1.591,1.679,1.742,1.792,1.842]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2020年5月3日日曜日
自分で計算できる実効再生産数
①使用するデータ:日本の新規感染数の日次統計(WHOに報告されたもの)WHOのSituation Reportsのデータ(確定感染者数 Confirmed)は次のようになった。ただし,2月22日から5月1日まで(WHOが公表している日付を基準としたもの)の70点のデータである。
{12,27,12,13,7,22,24,20,9,15,14,16,33,32,59,48,33,26,54,52,55,41,64,34,15,15,44,77,46,50,43,39,65,98,96,112,194,173,87,225,206,233,303,351,383,252,351,511,579,658,743,507,390,455,482,585,628,566,390,367,378,423,469,441,353,203,191,276,236,193}
②使用するモデル:単純なSIRモデルを仮定し,感染が人口の数%を越えて拡がっていないものとし,未感染者数(感受性保持者 Susceptible $S(t)$)が全人口($N$ 定数)とほぼ等しいとする。なお,感染者(Infected $I(t)$)と未感染者の接触による1人1日当りの感染率 $\beta$は対策効果を含めて時間の関数$\beta(t)$とした。さらに,感染期間(日)を$\alpha$として,実効再生産数を$R_t=\alpha \beta(t)$で定義する。このとき,感染者数$I(t)$は次の微分方程式を満足し,$R_t$は$I(t)$とその時間微分から求まる。
\begin{equation}
\begin{aligned}
\dfrac{d I(t) }{dt} = \beta(t) S(t) I(t) / N - I(t) / \alpha \approx \dfrac{ R_t - 1}{ \alpha} I(t) \\
\therefore R_t = 1 + \alpha \dfrac{d I(t) }{dt} / I(t)
\end{aligned}
\end{equation}
③計算方法:誤差はあるけれど時間の単位を1日とする差分式に直して,エクセルで計算する。もとの新規感染数データのままではゆらぎが大きいので,5日移動平均を求めて$I(t)$とする。これから中心差分($I(t+1)-I(t-1))/2$)で1日当りの新規感染数の変化分を求める。さらに,このゆらぎを緩和するためにこの5日移動平均をもとめて$d I(t)$とする。これから②の式を用いて$R_t$を求めた。
④結果:図のとおりである。
[3]感染症数理モデル(北海道大学医学統計学教室のSqquential SEIRモデル)
[4]Rt-COVID-19 Japan (都道府県別新型コロナウイルスの実効再生産数)
[5]山中伸弥による新型コロナウイルス情報発信
[6]A New Framework and Software to Estimate Time-Varying Reproduction Numbers During Epidemics(Cori et al.)
[7]新型コロナ対策専門家会議が判断の拠り所にしている『実効再生産数・倍加時間』の算出方法に関する考察(@makirin1230 2020.05.06)
2020年4月17日金曜日
米国の集団免疫率(2)
トランプは4/17の会見で米国におけるCOVID-19の死亡数は6〜6.6万人にとどまるとした。これは勝手な想像ではなく,IHMEの最新の予測である。前回の10〜25万人から減少させたことを自分の政策の成果であるかのようにアピールしつつ,ロックダウンを解消して経済回復を誘導しようという意図に基づくものだろう。
前回のSIIDR2モデルの適用はちょうど2週間前だったので,あらためてこのモデルと上記の主張を組み合わることで米国の集団免疫率を推定してみる。前回のように1ppm到達の基準日3/10から4/17までの39日分の新規感染数累計と死亡数累計の人口比データを示す。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
xa=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,
14,15,16,17,18,19,20,21,22,23,24,25,26,27,
28,29,30,31,32,33,34,35,36,37,38]
ya=[0.014,0.021,0.030,0.038,0.051,0.051,0.051,
0.106,0.107,0.215,0.317,0.462,0.462,0.958,
1.280,1.576,1.929,2.074,2.587,3.136,3.722,
4.268,4.953,5.684,6.483,7.335,8.310,9.327,
10.13,11.03,11.99,12.93,14.00,14.96,15.92,
16.81,17.55,18.33,19.20]
za=[0.06,0.08,0.09,0.11,0.12,0.12,0.12,
0.18,0.18,0.30,0.46,0.61,0.61,1.22,
1.43,2.04,2.68,3.01,3.77,5.06,6.41,
7.28,8.65,11.7,14.6,17.8,21.3,25.4,
29.0,32.9,38.7,44.5,50.4,56.2,62.0,
66.7,71.2,78.5,85.6]/100
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
$\beta = 0.60, \nu =0.12, \lambda=28, \tau=16$, $\alpha_1=5/0.80, \alpha_2 = 5/0.20$, $\gamma_1 = 15/0.95, \gamma_2 = 15/0.06$。前回と異なり,$\gamma_2$の値は,中国や韓国などを説明した値の方にややに戻している。
2020年4月9日木曜日
緊急事態宣言と接触制限モデル(3)
4月7日のtwitterで牧野淳一郎さんがいうには,
一応どれも現実をモデルしているはずのところで、そこまで行動抑制しないといけない割合が、西浦氏:0.2、大橋氏「0.45](R_0>1でいくとして)、佐藤氏 0.02 で3人で20倍違う時点で少なくとも2人は間違っているのは明らかであろう。西浦氏は,緊急事態宣言と接触制限モデル(1)で取り上げた西浦博さん(北海道大学),大橋氏は,新型コロナウイルス感染症の 流行予測の大橋順さん(東京大学),佐藤氏は,COVID-19情報共有の佐藤彰洋さん(横浜国立大学)である。
上に示されている数字は行動抑制の因子であり,モデルの感染率にかける係数だと思われる。ここでは,どれが正しいかについては考察せずに,ドイツなど欧州の基本再生産数$R_0=2.5$(7日増倍率が7倍)に基づいた西浦さんの計算(我々の評価では$R_0=2.3$だったが)を,東京の現状に合わせて再計算した結果を報告する。
前回述べたように,現在の東京では,7日増倍率が2.5倍($R_0=1.65$)程度なので,西浦さんが用いている値よりかなり小さいのだ。単純なSIRモデルを用いてこれを再現するパラメタセットを探し,その場合に接触制限の効果がどうなるかを調べよう。
やり方は前回と同じなので,パラメタを示す。β=0.28,初期値はν=0.005とすれば上記の増倍率が再現できた。つまり,さきのMathematicaコードにおいて,
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
f[n_, β_, α_, ν_, p_]:=
NDSolve[{S'[t]==-(p+(10-p)*Tanh[2*(20-t)])/10*β/n*J[t]*S[t],
J'[t]==(p+(10-p)*Tanh[2*(20-t)])/10*β/n*J[t]*S[t]-J[t]/α,
R'[t]==J[t]/α, S[0]==n, J[0]==ν, R[0]==0}, {S,J,R}, {t,0,100}];
n=1400; β=0.28; ν=0.005; p=10;
sol = f[1400, β, 7, 0.005, p];
s[t_] := S[t] /. sol[[1, 1]];
i[t_] := J[t] /. sol[[1, 2]];
cft1[t_]:= (p+(10-p)*Tanh[2*(20-t)])/10*β/n*i[t]*s[t];
・・・
Plot[{cf1[t], cf2[t], cf3[t], cf4[t], cf5[t], cf6[t]},
{t, 10, 30}, PlotRange -> {0, 0.1},
GridLines -> {{19, 20, 21}, {0.005, 0.01, 0.015, 0.02, 0.025}}]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
などとすると計算結果は次のようになった。
2020年4月8日水曜日
緊急事態宣言と接触制限モデル(2)
緊急事態宣言がでた翌朝(4/8)の日本経済新聞にも再び西浦さんの図が「感染拡大阻止 接触8割減が必要」という記事とともに掲載されていた。安倍晋三も同内容を専門家の見解として強調していた。
2020年4月7日火曜日
緊急事態宣言と接触制限モデル(1)
ここではその図がどのようにして得られたものかを,素人が持っている簡単な道具と知識で理解することを目指す。報道されたニュースや伝わってくる情報は鵜呑みにはせず,自分で考えることが必要だから。集団としては人口1400万人の東京都を想定する。日本経済新聞におけるこの内容に関する報道の文脈でも東京を対象としていることがうかがえる。東京の4月3日における新規感染者数は14人(新規感染数累計は753人)であり,人口の1ppm条件がちょうど達成された頃なので,これ以降をSIRモデルなどの単純な微分方程式系で扱うことは可能だろう。
今,探してもみあたらないのだが,西浦さんはこの報道の後に解説のための動画を公開していた。それによればしばらく前のドイツなみの再生産数を仮定し,現時点から15日目以降に制限措置を行った場合をシミュレートしているとした。なお,彼のモデルでは,計算開始から15日目が現在であり,30日目が制限措置の開始時点となる。
今から3週間前のドイツでは新規感染数累計の7日増倍率が7倍になっていた。仮に6.3倍(1日に1.3倍)を仮定すると,基本再生産数は$R_0 = 1 + 5/7 * \log 6.3 \approx 2.3$となる*。一方現在の東京では新規感染数累計の7日増倍率が2.5倍(1日に1.14倍)程度なので,基本再生産数は$R_0 = 1 + 5/7 * \log 2.5 \approx 1.65$(倍加時間と基本再生産率を参照)である。だからこのドイツ並の仮定はちょっとどうかと思うが,いちおうこれを採用する。
(*西浦さんはドイツなどの欧州の平均基本再生産数が$R_0=2.5$であると話していた)
つまり,現在100人の新規感染者数はこのまま放置すると15日後のt=30(1.3^15≒50)に5000人以上に達するという状況を西浦さんは想定していると思われる。今の東京の水準をそのままあてはめた場合は,15日後のt=30(1.14^15≒7)に東京の新規感染者数は700人程度であることに注意しよう。
SIRモデルに接触制限措置の効果を含めた微分方程式系をMathematicaで書くと次のようになる。nは集団人口(1400,以下人数の単位は1万人当りとなる),βは感染率(0.44),αは感染期間(5),νは感染数の初期値(0.0002),pは制限措置の程度(p=10→制限なし,p=9→80%に制限,p=6→20%に制限)である。なお,接触制限措置は,βにかけるシグモイド関数(幅が1日のオーダー)によってモデル化して階段関数は用いない。t=15が4月3日現在(新規感染者数=100)に対応する。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
f[n_,β_,α_,ν_,p_]:=
NDSolve[{S'[t]==-(p+(10-p)*Tanh[2*(30-t)])/10*β/n*J[t]*S[t],
J'[t]==(p+(10-p)*Tanh[2*(30-t)])/10*β/n*J[t]*S[t]-J[t]/α, R'[t]==J[t]/α, S[0]==n,J[0]==ν,R[0]==0}, {S,J,R}, {t,0,100}]
β=0.44 sol = f[1400, β, 7, 0.0002, 10];
s[t_] := S[t] /. sol[[1, 1]];
i[t_] := J[t] /. sol[[1, 2]];
r[t_] := R[t] /. sol[[1, 3]];
cf1[t_] = (10+0*Tanh[2*(30-t)])/10*β*i[t]*s[t]/1400;
sol = f[1400, β, 7, 0.0002, 9];
s[t_] := S[t] /. sol[[1, 1]];
i[t_] := J[t] /. sol[[1, 2]];
r[t_] := R[t] /. sol[[1, 3]];
cf2[t_] = (9+1*Tanh[2*(30-t)])/10*β*i[t]*s[t]/1400;
sol = f[1400, β, 7, 0.0002, 6];
s[t_] := S[t] /. sol[[1, 1]];
i[t_] := J[t] /. sol[[1, 2]];
r[t_] := R[t] /. sol[[1, 3]];
cf3[t_] = (6+4*Tanh[2*(30-t)])/10*β*i[t]*s[t]/1400;
Plot[{cf1[t], cf2[t], cf3[t]}, {t, 15, 45},
PlotRange -> {0, 2}, GridLines ->
{{29, 30, 31}, {0.1, 0.4, 0.5, 0.6, 0.7, 0.8}}]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
計算の結果,次のグラフが得られた。西浦さんのものと概ね一致する。
青:制限なし,オレンジ:80%に制限,緑:20%に制限)
図2 上記に,60%,40%,30%に制限などの場合を加えたもの