放射性元素の半減期の見方(まとめ)

前2つの放射線半減期の記事を寄せられたコメントを元にまとめたものです。
本当に半減期が長いほど危険なのか?実は逆だとしたら…
ベクレル単位と半減期で見る放射線の危険性
内容が理論的なことに偏っているため、この内容を以て今の状況の判断をしないでください


ここではある放射性物質をN(0)だけ体内に取り込んだ際のt日後の残存量N(t)と累計被曝量R(t)*1を考えます。
放射性物質放射線を出して崩壊する物理的な過程代謝によって体外に排出される生理的な過程によって減少していきます。
この2つの過程をともに1次反応*2として被曝量を計算しようと思います。


用いるモデルは次に連立微分方程式です。
 \frac{d}{dt}N(t) = -(k_p + k_b)N(t) = -k_e N(t)\\ \frac{d}{dt}R(t) = k_pN(t)
ここでk_p,k_bはそれぞれ物理的過程、生理的過程の反応速度定数であり、k_e=k_p+k_bは実行(effective)反応速度定数です。
反応速度定数kと半減期Tは
k=ln(2)/T
の関係になっています。


さて、この連立微分方程式は解析解が存在し、
N(t)=N(0)\exp(-k_et)\\ R(t) = \frac{k_p}{k_e}(N(0) - N(t))=\frac{k_p}{k_e}N(0)\left\{1-\exp(-k_et)\right}
となります。
t->infinityの極限で総被曝量Rは
R=\frac{k_p}{k_e}N(0)
で与えられます。
このN(t)とR(t)の両対数プロットは2つ前の記事に示してあります。


ここまでで必要な式の導出は終了しました。後は半減期のデータ集を用いて実際にI131とCs137の相対的な危険度を計算をしてみましょう。

元素    物理的半減期   生理的半減期   実効半減期
I131 8 138 7.6
Cs137 1.1*10^4 70 70


まず、I131とCs137がはじめに同じmol数N(0)だけある場合を考えてみましょう。この時、総被曝量の比は{k_p}/{k_e}=T_e/T_pの比で与えられます。数値を代入しますと
 \mathrm{{}^{131}I \: : \: {}^{137}Cs} = \frac{7.6}{8} \::\: \frac{70}{1.1\times 10^4} = 149 \::\: 1
となり、I131のほうがおよそ150倍総被曝量が多いという結果です。
次によくニュースで報道されるBq(ベクレル)が等しい時を考えます。これはk_pN(0)が等しい場合に相当します。この時、そう被曝量は1/{k_e}=T_eの比で与えられます。数値を入れますと
 \mathrm{{}^{131}I \: : \: {}^{137}Cs} = 7.6 \::\: 70 = 1 \::\: 9.2
というようにCs137が9.2倍多くなります。


現在の日本の法律では水道水中の放射性元素の量がI131は300 Bq/kg, Cs137は200 Bq/kgとなっており*3、下のAppndixにある放射線一発あたりの威力を加味してもCs137の危険性を過小評価している気がしますね。


今回はここまで!ぽぽぽぽーん!



Appendix 放射線1発あたりの威力
ちなみに放射線1発あたりのエネルギーはI131が0.9709 MeVでCs137が1.176 MeVとなっております*4。それほど大きな差がないようでしたね。

*1:環境中汚染とかは考えません。あくまで体内に入れたときの直接的な影響のみです。

*2:物理的な過程は理論的に1次反応としてモデリングできます(参考)。生理的な過程はどうか知りませんが、とりあえず当仮定しておきましょう。

*3:http://www.nsc.go.jp/shinsashishin/pdf/history/59-15.pdf

*4:ここで検索しました。様々なエネルギーの放射線を一定の割合で放出するようです。なにが細胞に効くか分からないのでとりあえず合計値を使いました。

ベクレル単位と半減期で見る放射線の危険性

前回の記事「本当に半減期が長いほど危険なのか?実は逆だとしたら…」には誤解を招く表現がありましたので補足いたします。


まず、前回の記事では等mol数の異なる放射性元素を比較していました。その場合は物理的半減期が長く、生理的半減期が短いほど人体への直接的な影響が少ないという結論でした。
今回は等Bq(ベクレル)の時にはどうなるかという話をします。


Bqという単位は最近はTVでも登場していますので名前だけは有名になりましたが、残念ながらその定義をきちんとTVでは説明してくれません。
Bqという単位は放射能の量(radioactivity)を表すものであり、Wikipediaの説明によると1秒あたりに崩壊する原子核の個数となっております。
これはもともとの元素の個数/物理的半減期に比例するということが容易にわかります。


この式を使えばBqの比からmolの比が計算できますね。
例えば1BqのI131とCs137を考えてみましょう。
I131とCs137では半減期が8日と30年なのでざっくり計算すればおよそ1400倍違います。ということは1BqのI131とCs137を検出した場合、Cs137のほうがmol数が1400倍多いという事になります。
さて、前回の結果を用いますとI131とCs137は体内に取り込んだ総量のうち、それぞれ94.5%と0.63%が放射線を発します。比に直しますとI131の方が150倍多いです。
以上のことより、同じBqが検出された場合ではCs137の方がI131よりも1400/150=9.33倍多くの放射線代謝されるまでに放出するということがわかります。


ちなみに東京の空気中は26日のデータですとI131が173、Cs137が36.9 Bq/m^2 でした。
濃度がだいたい4倍前後I131が濃いということなので、体内に取り込んだ際にCs137から受ける総線量が2倍ほど高いということになりますね。なので、Cs137も要注意です。
水道水では25日のデータはI131が31.8でCs137が1.22 Bq/kg でI131が30倍多いのでこの場合はI131のほうがおよそ3倍放射線量が多いですね。


Appendix
1次反応は微分方程式は現在の原子数をN(t)とすると
\frac{dN(t)}{dt} = -kN(t), \: k \equiv \frac{log(2)}{T_{half}
であり、このkN(t)というのがBqでみた放射能になっています。

本当に半減期が長いほど危険なのか?実は逆だとしたら…

ちまたで放射性物質の漏洩に怯え、半減期という言葉も頻繁に聞くようになりました。
半減期というのはここにあるようにようは一次反応の反応速度定数の逆数です。半減期の2倍時間が経てば1/4、3倍経てば1/8と指数関数的に減少します。

さて、私には次のような疑問があります。
半減期が短いほうが人体に取り込まれたら危険ではないのか!?
というのも、放射線はその放射性元素が崩壊して他の元素になる時に出るのだから、できるだけ半減期の長い、崩壊しづらい元素の方が被害が少ないのではないかと考えております。


また、上で言う半減期というのは言わば物理的半減期であり、人間には代謝系というものがあり、その元素を一定の期間で体外に放出します。半分を代謝するまでに期間を生理的半減期とここでは呼称します。生理的半減期が短ければそれだけ体外に出やすいので被曝が減ると考えています。
すなわち、物理的半減期が長くて生理的半減期が短い元素ほど、直接取り込んだ際の影響が少ないと考えられます。どうもよくテレビやネットで見るようにCs137は半減期が30年だから危ないというのはしっくりこなく、逆に被害が少ないのではないかと考えてしまいます。


何人からか御指摘がありましたので明記しておきます。
今回は等molを想定して計算を行っています。
等Bqでは結果が異なりますのでご注意ください!-> フォロー記事


そこで、筆者も博士課程に進学する計算生物を研究する者のはしくれとして次のような5つの条件に単純化したモデルを使ってシミュレーションを行ってみました。

  1. 物理的崩壊と生理的代謝は交互に起きる。
  2. 崩壊、代謝ともに一次反応として近似する。
  3. 崩壊の際にのみ有害な放射線が出る。
  4. 一回放射線を出したものはもう出さない(安定な元素に崩壊する)。
  5. 細胞に同じメカニズムで影響を与える。


この条件にしたがって体内に取り込まれたもののうち、何%が有害かを計算したところ、

  • I131 : 94.5%
  • Cs137 : 0.63%
  • Sr90 : 62.1%

となりました。I131はなんと取り込んだうちの95%が有害!一方Cs137は0.63%とまるで無害!
Cs137は物理的半減期がおよそ30年に対し、生理的半減期が70日なので放射線を出す前にほとんどが体外に排出されてしまうという結果です。




図1 体内残存量の経時変化の両対数プロット。
その放射性物質を摂取してからN日後の残存量。Srは完全に体内から消えるまでに100,000日=275年もかかりますね。



図2 累積被爆量の経時変化の両対数プロット。
摂取した放射性物質の全放射能のうち、N日目までに累積で何%を放射線として浴びているか。最後に収束する値が先程載せた数値です。
ヨウ素だと10日ぐらいでほとんどの放射能放射線として浴びてしまいます。
セシウムは結構長く体に残りますが、その放射能のうち1%も食らいません。
ストロンチウムはじわじわとしつこく、その人が死ぬまで残ります。しかし、人体には放射線による損傷を修復するメカニズムもあるのでストロンチウムも多量に摂取しなければ大丈夫かも。


もちろん各元素の摂取してしまった量や、崩壊の際に出る放射線の強度にもよりますが、この結果に単純にそれらの因子を掛け算すればいいと思っています。
セシウムでガタガタいってる人はセシウムの濃度×セシウム放射線強度がヨウ素のそれよりも100倍以上高いと分かってからにしましょうw*1


以下、余力のある人向け。


用いた半減期のデータ Physical, Biological, and Effective Half-lives for Selected Isotopes


シミュレーションの概要は次のとおり。

  1. 物理的、生理的半減期からそれぞれの反応速度定数(kpとkb)を決める。
  2. 時間のステップを決める(1時間)。
  3. はじめの放射性元素の量をN=100とする。
  4. はじめのを放射線量Nrad=0とする。
  5. N*kp*dtをNradに足し、Nから引く。
  6. N*kb*dtをNから引く。
  7. 上の二つをN
  8. Nradが有害な元素の割合になる。


Pythonソースコードを示しておく。

#!/usr/bin/python

from math import log

def halfTime2ratioConst(t_half):
  return log(2)/float(t_half)

def decayProb(t_half,dt):
  # dt : time step [day]
  return halfTime2ratioConst(t_half) * dt

def decayOneStep(n,t_half,dt):
  return n * decayProb(t_half,dt)

class RadioActiveAtom:
  def __init__(self,phy_t_half,bio_t_half,N0=100):
    self.phy_t_half = phy_t_half
    self.bio_t_half = bio_t_half
    self.N = N0

  def simulate(self,dt=1.0/24.0,days=1000000,eps=1.0e-4):
    total_emitted = 0
    imax = int(days / float(dt))
    for i in xrange(imax):
      # physical decay with ratiation emission 
      emitted = decayOneStep(self.N,self.phy_t_half,dt)
      total_emitted += emitted
      self.N -= emitted

      # biological decay without radiation
      self.N -= decayOneStep(self.N,self.bio_t_half,dt)
      
      if self.N < eps:
        break

    return total_emitted
      
if __name__ == "__main__":
  from sys import argv
  ra = RadioActiveAtom(float(argv[1]),float(argv[2]))
  total_emitted = ra.simulate(days=int(argv[3]))
  print "total emitted %8.3f %%: " % total_emitted

*1:Arugaさんからご指摘があったとおり、物理的半減期が短いということは生物濃縮がされやすいという意味で危険だと思います。ここで考察しているのは同じ濃度で放射線1発あたりのダメージが同じだとした時の人体への直接的な影響です。

Yahoo!ファイナンスからデータを所得

しばらく放置だった金融のプログラムを再開しました。手始めにPythonYahoo!ファイナンスから時系列データを所得する部分を書きました。

基本的にはここのやつを改良した版です。
この参考にしたやつは現在はYahoo側のフォーマットが変わったのか、うまくいかないことが多かったです。

使い方は

import yahoo_finance_jp as yf
dates, data = yf.getTick(tickID,length=500)

とすればOKです。これで証券番号がtickIDの株価を今日から遡って500日分の所得します。
datesには日付がdatetime.dateオブジェクトの配列として入り、dataには初値、高値、低値、終値の順でfloatとして入ります。使うときにはnumpyとかでかぶせると使いやすいかと。

上の使い方以外にも

dates, data = yf.getTick(tickID,end_date,start_date)

というようにも使えます。この場合はend_date,start_dateはともにdatetime.dateオブジェクトです。

以下ソースコード

#!/usr/bin/python
# -*- coding: utf-8 -*-

import re, datetime, urllib
from BeautifulSoup import BeautifulSoup

def _extractStr(content):
  """extract strings from soup data which contains bold style"""
  found = content.findAll('b')
  if found :
    # <td><small><b>25,810</b></small></td>
    temp = content.b.string
  else:
    # <td><small>26,150</small></td>
    temp = content.small.string
  string = re.sub(",","",temp)
  return string

def _splitToTick(soup):
  """ split a soup to a tick datum """
  # convert date format yyyy年m月d日 into yyyy/m/d
  date_str = soup.contents[1].small.string
  date_str = re.sub(u"日", u"", re.sub(u"[年月]", "/", date_str))
  date_temp = date_str.split("/")
  date = datetime.date(int(date_temp[0]),int(date_temp[1]),int(date_temp[2]))
  #date_str = "%04d/%02d/%02d" \
  #  % (int(date_temp[0]),int(date_temp[1]),int(date_temp[2]))
  

  # extract other price values
  open_v = float(_extractStr(soup.contents[3]))
  max_v = float(_extractStr(soup.contents[5]))
  min_v = float(_extractStr(soup.contents[7]))
  close_v = float(_extractStr(soup.contents[9]))

  return date,[open_v,max_v,min_v,close_v]
  

def getTick(code,end_date=None,start_date=None,length=500):
  print "getting data of tikker %s from yahoo finance...   " % code

  # initialize
  scale = 8.0/5.0 # for skipping hollidays
  if end_date == None:
    # set default end_date = today
    end_date = datetime.date.today()
  if start_date == None:
    # set default end_date = today - lemgth * scale
    start_date = end_date - datetime.timedelta(days=length*scale)
  print "get data from %s to %s" %(start_date, end_date)
  start_m, start_d, start_y = start_date.month, start_date.day, start_date.year
  end_m, end_d, end_y = end_date.month, end_date.day, end_date.year
  enc = 'euc-jp'

  # the tables of Yahoo finance JP contains up to 50 rows
  # thus parsing html must be done iteratively
  ts = [[],[]] # an array to store the result, [list_dates,list_prices]
  niter = 0 # iteration counter
  while(niter < length) :
    print niter

    # prepare BeautifulSoup object
    url_t = "http://table.yahoo.co.jp/t?s=%s&a=%s&b=%s&c=%s&d=%s&e=%s&f=%s&g=d&q=t&y=%d&z=%s&x=.csv" \
    % (code, start_m, start_d, start_y, end_m, end_d, end_y,niter,code)
    url_data = unicode(urllib.urlopen(url_t).read(), enc, 'ignore')
    soup = BeautifulSoup(url_data)

    # the price data are stored in the following format
    """
    <tr align="right" bgcolor="#ffffff">
    <td><small>2007年10月4日</small></td>
    <td><small>64,300</small></td>
    <td><small>64,900</small></td>
    <td><small>63,900</small></td>
    <td><small><b>64,400</b></small></td>
    <td><small>1,058,900</small></td>
    <td><small>64,400</small></td>
    </tr><
    """
    # extract the list of price data from the table
    price_list = soup.findAll('tr',align="right",bgcolor="#ffffff")

    # split price_list each day
    for data in price_list:
      date, prices = _splitToTick(data)
      ts[0].append(date)
      ts[1].append(prices)
    
    # increment iteration counter
    niter += 50

  print "OK!"
  return ts

若虎最高や!

9/5 阪神 vs 広島


せっかく阪大に出張したのに結局甲子園に見に行けなかったorz


気を取り直して



前日に2番の平野がふくらはぎにデッドボールで負傷退場。現在セで打率2位の平野を欠いて大ピンチかと思いましたが、3人(頭?)の若虎が見事に穴を埋めてくれました。


まずは先発の秋山*1。抜群の安定感!現在勝ちが期待できる他の先発陣は久保、スタン、メッセだが、明らかに秋山は彼らと遜色無い。
むしろ"スタン>秋山>=久保>メッセ"くらい期待できそう。ヒゲもじゃの下さんはまじ頑張ってください
秋山は打の方でもプロ初タイムリーを放ち送りバントもしっかり決めるなどほんとに楽しみですね。


お次は広陵の俊足コンビ上本&藤俊。藤俊は平野の代わりに2番、上本は平野の代わりにセカンドで出場。


藤俊は第1、2打席で連続タイムリを放ち、堂々と平野の代役を努めた!


上本はプロ初スタメンで3安打猛打賞!打撃もいいんですが、なんと言っても7回のマートンのセンター前ヒットで本塁に突入するシーン!スライディングがかっこよすぎです!!


試合の方は広島戦では辛くて全然働かない新井さんがトンネルをやらかした後に久保田が2ラン打たれて嫌なムードになったんですが、裏に藤川球児にもヒットが出て上本→球児→マートンの連続タイムリで一気に試合を決めました!


終わってみれば11-5と快勝し若い3人に注目が集まるところですが、球児の通算150S、マートンの175安打目(助っ人来日1年目新記録)&80打点目と鳥谷の90打点目など、切りのいい数字もいっぱい出ましたね!
http://www.sanspo.com/baseball/news/100906/bsb1009060503007-n1.htm
http://www.sanspo.com/baseball/news/100906/bsb1009060503008-n1.htm
http://www.sanspo.com/baseball/news/100906/bsb1009060503009-n1.htm


ただ、問題は金本ですね。4試合連続ノーヒット...。しかも死球で腕に打撲。これでまた出場したら...orz
http://www.sanspo.com/baseball/news/100905/bsb1009052027012-n1.htm

さて、次はいよいよ巨人に引導を渡した中日との首位攻防戦!初戦はスタンなのでぜひ勝ちたいですね!しかも甲子園での3戦目はついに能見が来そうなので楽しみだ。

*1:なんか前回もトップは秋山でしたねw

全国的に猛虎日が期待できそうです

巨人戦、広島戦と嫌な流れを引きずってきましたが、土日のヤクルト戦はついに復活といった試合でしたね。

土曜日の試合の主役は秋山です。弱冠19歳にして初勝利です。先発陣の苦しい阪神としてはとてもありがたいですね。
http://baseball.yahoo.co.jp/npb/headlines/20100829-00000000-sanspo-base?d=1&team=5&date=&pg=3&p=

そして広島を20安打でボコボコにした試合以外では沈黙気味の打線も回復傾向。特にマートン2試合連続の4安打と大暴れ!!
http://www.sanspo.com/baseball/news/100830/bsb1008300504004-n1.htm

その後の西村、久保田も完璧でした。特に久保田は圧巻の6者連続凡退!もう久保田にブーイングはやめてくださいねw



日曜日はまさにみんながヒーローでした。マートン平野鳥谷の先頭だけで11安打ブラゼル金本城島にもHR。
鳥谷はあの華麗な守備だけでも十分なのにこんなに打って凄いね。
http://www.sanspo.com/baseball/news/100829/bsb1008292244013-n1.htm

投げては久保が中4日でも6回を4安打3失点。リーグトップタイの12勝!
http://www.sanspo.com/baseball/news/100829/bsb1008292253014-n1.htm


さぁ爆進や!

いざ猛虎の再出発

8/17-22の阪神戦の総括


-vs横浜3連戦
この3連戦の見所はなんと言っても大阪タイガース時代の黒虎ユニフォーム。いやぁ黒い黒い。

この3連戦はとにかく打線が爆発!
3試合連続2桁得点。長野ではルーキーの藤川俊介がバースデー3ランHRなども飛び出した!
投げては久保が安定感を示す8回1失点、安藤も5回3失点。スタンリッジが腰痛で抹消されて厳しいローテを見事に埋めてくれた。


-vs巨人3連戦
前の横浜3連戦で勘違いしたのか、こちらは一転ストレスフルな試合でした。
こちらは3連勝、相手はナゴドで中日に3連敗。なんでこの状況で3連敗するかね〜。
たしかに阪神もピッチャーがいなくて小嶋-秋山-メッセの謎ローテだけど巨人だってゴン-福田-朝井と決していい布陣ではなかったはず。
それなのに日に日に得点が減って3戦目なんて完封負け...orz
特にブラちゃんどうしたのよ(泣)
http://www.sanspo.com/baseball/news/100823/bsb1008230504007-n1.htm


ただ、2戦目の秋山は希望を与えてくれるピッチングだったし、3戦目のメッセのあとの鶴-江草-久保田は見事にG打線を0に抑えた!
今季は渡辺と西村に過度に依存していたので、こうしていろんな選手を中継ぎで使えてバリエーションが増えるのはいいことです。
欲を言えば、やはり久保田にはもっと頑張ってもらって久保田-藤川の鉄壁ラインをCSまでに完成して欲しいです。


さて、巨人戦で暗くなりかけ、どうせスタン抹消ならフォッサム試せばとか思ったけど,明るいニュースが2件
http://www.sanspo.com/baseball/news/100823/bsb1008230504005-n1.htm
http://www.daily.co.jp/tigers/2010/08/23/0003349564.shtml
そう、スタンと待に待った能見の復帰が間近かもしれないのだ
しかもしばらくは下位との戦いだし、残りの巨人戦も全て甲子園。やはりまだまだ虎にはチャンスがある!