モンテカルロシミュレーションで乱数発生を行うにあたり、少ないサンプル数で広範囲の領域をカバーし、信頼性評価を行うにあたってラテンハイパーキューブ法(LHS)が有効であることがOlssonらによって示されている。一方で、限界状態曲面近傍に関心があるとき、必ずしも純粋に確率面数の分布に基づいて乱数を発生する必要はない。このような観点から、LiらはLHSと一様乱数によるサンプリング(US)を組み合わせる方法を提案した。ここでは、LHS+USと表記する。技術的詳細については、下記文献を参照のこと。LHS+USのサンプリングを管理する基底クラスLHSbaseをモジュールLimitStateの中に提供する。限界状態関数を定義するユーザclassで継承することにより、任意の限界状態関数に対して適用可能となる。
まず、ls.LHSbaseを継承する限界状態関数管理クラスを作成する。最も基本的なRSモデルの場合について例示する。
class rnd_RS(ls.LHSbase): #LHSbaseを継承する
def __init__(self,nv): #nvは変数の数
super().__init__(nv)
def g(self,rnd): #限界状態関数gを定義する。rnd:発生された乱数列。下記例題のJSONデータの変数の順番に格納されている。
rr=rnd[:,0] #変数の順番に乱数列を取り出していく
ss=rnd[:,1]
gval=rr-ss #限界状態関数の計算結果リスト
return gval #そのリストをもどす
#データはJSON形式で与える
data={"r":{"mean":170,"cov":20/170,"dist":"normal"},
"s":{"mean":100,"cov":20/100,"dist":"normal"},
}
nv=2 #変数の数
n=300 #サンプル点数
k=3 #サンプリングの領域の広さ
lhb=rnd_RS(nv) #インスタンスの生成
lhb.SetData(data) #データセット
rnd,t=lhb.Calc(n,k) #LHS+USの乱数、破損リストがもどされる
X_std=(rnd-lhb.Means())/lhb.Stdvs() #データの基準化
print(lhb.gMean()) #平均値でのg値の値
この結果、rnd[:,0]にR、rnd[:,1]にSの乱数が格納されている。tは、破損、非破損データのリスト。