レインフロー法 #3(Excel VBA 実装編)
- レインフロー法 #1(準備編) - potass' blog
- レインフロー法 #2(デバッグ準備編) - potass' blog
- レインフロー法 #3(Excel VBA 実装編) - potass' blog←今回!
いよいよ Excel VBA での実装を試みる。なお、使用にあたっては自己責任で。
実装上の流れ
簡明にされたレインフローアルゴリズム「P/V差法」について | CiNii Research の Fig.11 の通りに実装。損傷率は算出しないのでそこはex_data()
にデータを保存した。
使い方
rainflow
を呼び出せば OK。
面倒なので以下の前提で実装。他にもあるかも。
- A 列が時刻やデータ No.、B 列がレインフロー法を適用したいデータ(応力値、ひずみ等)。
- データのスタートは1行目からですべて数値データ(欠損値や文字列がある場合のエラー処理なし)とする。
- データの並びは1行目から順番になっている。
- 他のセルに書き込みがあっても良い。ただし、D/E/F/G/H 列及び J/K 列は出力結果で使用するため強制的に上書きされる。
- ActiveSheet に対し処理をするため、マクロ開始時・実行中はレインフロー法を適用したいデータのあるシートを選択のこと。なお、選択セルはどこでもいい。
コード
お試し
レインフロー法 #2(デバッグ準備編) - potass' blogと同じデータ(A/B 列)に対して実行。
最初と終わりもピーク(極値)としている出ていること*1以外一致したー。よかったー。
参考
www.excel-chunchun.com
シート(セル)のデータ→配列はこれを参考。後続の記事になればなるほど汎用性が上がってたが自分はユーザー側が配慮しろ!って割り切った。
pypi.org
Python の Rainflow モジュール。主にデバックで参考にした。出力形式もこれとほぼ同じにした。ASTM E1049-85 とは言ってるけど結局似たようなコードになったし P/V 差法とアルゴリズムはほとんど同じなんだな。
あとここではスタックpop
、push
でスマートに実装してるね。自分が Python で作ってもこういうふうには書けないな。羨ましい…。
レインフロー法 #2(デバッグ準備編)
- レインフロー法 #1(準備編) - potass' blog
- レインフロー法 #2(デバッグ準備編) - potass' blog ←今回!
- レインフロー法 #3(Excel VBA 実装編) - potass' blog
レインフロー法 #1(準備編) - potass' blog の続きで Python に
レインフローモジュールがあったため、次回の実装編でデバッグが出来るように触ってみる。
加えて実装上のアルゴリズムがどうなっているかも取り上げる。
pypi.org
アルゴリズム
このモジュールの使い方にもあるようにcount_cycles(series, ndigits, nbins, binsize)
(各パラメタについては下記とのこと)
Parameters ---------- series : iterable sequence of numbers ndigits : int, optional Round cycle magnitudes to the given number of digits before counting. Use a negative value to round to tens, hundreds, etc. nbins : int, optional Specifies the number of cycle-counting bins. binsize : int, optional Specifies the width of each cycle-counting bin Arguments ndigits, nbins and binsize are mutually exclusive. Returns ------- A sorted list containing pairs of range and cycle count. The counts may not be whole numbers because the rainflow counting algorithm may produce half-cycles. If binning is used then ranges correspond to the right (high) edge of a bin.
が入出力の際にメインとなる関数であるが実態(計算)はそこで呼ばれているextract_cycles(series)
が基本となる。
さて、extract_cycles(series)
では
- 与えられたデータ列
series
をreversal(series)
によって極値のみのデータ列に変換。*1 変換方法は隣接するデータ列の差の掛け算が負になる場合はその点を抽出、そうでない場合は無視するというシンプルなもの。 - 先の極値のみのデータ列に対し先頭のデータから順番に読み込んでいき、下図の2パターンになったときは該当するやり方で小ループを除去する。
が実行されており、前回記載した P/V 差法そのものである。
お試し
お試しコードは下記。実行自体はrainflow.extract_cycles(sgnl)
のみ。import rainflow
をお忘れなく。
実行結果は下記。ピークは scipy で抽出したもの。これがrainflow.extract_cycles(sgnl)
の出力と対応していることを確認できた。
次回は Excel VBA での実装。
[[ 0.20100503 0.92686369] [ 1.00502513 1.97208224] [ 1.76884422 2.34561486] [ 2.53266332 1.40625694] [ 3.33668342 0.76749291] [ 0.56281407 -1.01860648] [ 1.36683417 -0.0552989 ] [ 2.17085427 -0.44787773] [ 2.95477387 -1.48082349] [ 3.71859296 -1.45553457]] ----------------------------------------- range, mean, count, i_start, i_end 1.326863691183818 0.26343184559190913 0.5 0 10 1.945470171916998 -0.04587139477468083 0.5 10 28 2.0273811415975134 0.9583916687347154 1.0 50 68 1.854134671396499 0.479189607932012 1.0 108 126 3.364221339924992 0.663504189229316 0.5 28 88 3.826438349059406 0.43239568466210876 0.5 88 147 2.2483163957095447 -0.35666529201282193 0.5 147 166 2.2230274803187586 -0.3440208343174289 0.5 166 185 2.101825614128834 -0.40462176741239136 0.5 185 199
*1:この変換で吐き出されるインデックスの番号が1つ分ズレてる。どうせその後使用してないから別にいいのだが。ただ、enumerate(series, start=1) としていて意図的にも感じるので何か意味があるのかもしれない…。
レインフロー法 #1(準備編)
- レインフロー法 #1(準備編) - potass' blog ←今回!
- レインフロー法 #2(デバッグ準備編) - potass' blog
- レインフロー法 #3(Excel VBA 実装編) - potass' blog
実装するための準備(勉強)です。
変動荷重の応力波形計数法
変動荷重が加わった場合、負荷の頻度処理*1をすることで損傷率計算が可能になる。
なお今回時間軸は無視しているため、変動荷重つまり応力波形の周期は損傷率に寄与しないものと仮定している。
計数法の中でも応力 - 歪線図との対応からレインフロー法 (Rainflow counting method) がよく用いられてる。*2
レインフロー法
レインフロー法とは
レインフロー法は次の条件を満たす。
<前提>
- 応力(またはひずみ、以下では応力と言う)の変化を横軸に、時間経過を下向きに取り、応力波形のピーク値を直線で結んだグラフを考える。
- このグラフを多重になった屋根と見なし、屋根上の流れを停止または軒先からの落下を停止した雨滴の出発点~停止点までの応力変化量(必要に応じて平均応力や応力振幅)を1/2カウントとして計上する。
<条件>
- 雨滴は屋根の付け根から番号順に流れ始め、停止条件が満たされるまで下の屋根に流れ落ち続ける。
- 軒先から落下中の雨滴は次の2つの条件の一報を満たした際に落下を停止する。
- 右向きの流れの場合:右向きに流れる雨滴の出発点より左側に他の屋根の軒先が現れたとき。
- 左向きの流れの場合:左向きに流れる雨滴の出発点より右側に他の屋根の軒先が現れたとき。
- 屋根の一部をすでに雨滴が流れていたら、その流れは停止する。
レインフロー法の図は例えば レインフロー法 - Wikipedia 参照。
P/V 差法
とある時刻 での応力値 のデータ列 *3に対して、と隣接する応力変化量を定義する。ここで、以下でもデータ列となる応力値は極値であるとする。
とある点 j で小ループ除去可能とは、 であることを言い、データ列 から順番を変更せずに点 j-2、j-1 だけを取り除いたデータ列 を作ることを点 j に対し小ループ除去すると言う。なお、除去された小ループは応力波形として を受けた(1サイクル)として計上する。
さて、小ループ除去しきったデータ列 *4 は次の性質を満たす。(証明は参考文献参照)
以下ではこれを と書く。
つまり、小ループ除去しきったデータ列は隣接する応力差(の絶対値)が徐々に(単調に)大きくなり、あるところで応力差(の絶対値)が最大をとった後に徐々に(単調に)小さくなる特徴を持った、応力値に対するジグザグ波形となる。
小ループ除去しきったデータ列に新しいデータ を後尾に追加*5したあとで、その新たなデータ列を再び小ループ除去しきったデータ列にする処理を実施する。
このとき、データ点の極値性*6から次の2パターンが考えられる。
なお、と定義する。
- 単に追加されるのみ:が成り立っている場合に該当。新たなデータ列は既に小ループ除去しきったデータ列となっているので処理は不要。
- 小ループ除去を繰り返す: が成り立たない場合に該当。 であるので点 にて小ループ除去可能。以下、「単に追加されるのみ」となるまでこれを繰り返す。
ここで注意がある。小ループ除去を繰り返した結果、データ列が まで達した場合*7である。
このとき、既に小ループ除去しきったデータ列ではあるが、 が成り立つので新たに、 としておける。これは応力差(の絶対値)が最大となる箇所がずれたことを示している。
つまり、小ループ除去工程においての部分をどれだけ小ループ除去するかだけを考えれば十分である。この部分を記憶系列と呼ぶ。
上記の点をまとめると、
- 実波形をピークカウント法にて極値のみのデータ列に変換する*8。ここで必要に応じて間引きを行う。
- データ0点目として原点を定義し、を定める。
- データ1点目を読み込み、を定める。
- データ2点目を読み込み、を定め、記憶系列を小ループ除去し、必要に応じを定義する。小ループ除去した応力波形を記録する。
- データ3点目を読み込み、 (k : 先の処理による)を定め(以下略)
として逐次的に処理することで
- 小ループ除去され記録された1サイクル分の応力波形(複数)
- 小ループ除去しきったジグザグな応力波形(1つ、各”ジグ”・各”ザグ”が1/2サイクル)
が得られる。これを P/V 差法(P/V Difference Method)と呼ぶ。
レインフロー法と P/V 差法
P/V 差法を実施した後に小ループ除去しきった応力波形を各ピーク間ごとに読み取り、小ループ除去され記録された応力波形の集団に加える。
これによりレインフロー法が実行される。
数式で表すとちょっとわかりにくいが P/V 差法で行っている小ループ除去は条件2、3で途中で遮られる(小さな)流れそのものである。
また、小ループ除去しきった応力波形は左から右、もしくは右から左に大きく流れる雨滴の流れの総計である。
ゆえに P/V 差法によって
- 逐次的な手法でレインフロー法を実施できる
- 全データに対して更新することなく、記憶系列のみ処理で良い
- 新規にデータ入力があった際も必要な範囲のみの処理にて算出可能
が可能となった。
参考文献
- 簡明にされたレインフローアルゴリズム「P/V差法」について | CiNii Research:レインフロー法の実装アルゴリズムの1つである P/V 差法について書かれた論文。本記事はこれを簡潔にまとめた。
- 「Rain Flow Method」の提案とその応用 | CiNii Research:レインフロー法を提唱した論文。他の計数法では何が不足でレインフロー法だとどういうふうに取り入れられるのかが解説されている。
- 疲労設計便覧:「これは持ってて損はない」と言われて速攻買った。辞書的にも勿論使えるが各話題に対しても下手な本より詳しい。正直諭吉1枚でこのレベルが手に入るなら安い。
- 製品開発のための疲労破壊事故の解析と強度対策:このシリーズは結構お気に入り。実際の設計でどうか、過去どうだったのかといったところに力点が置かれている。
- 疲労解析のためのレインフロー カウント - MATLAB rainflow - MathWorks 日本:MathWorksのヘルプ。割りとよくまとまってたので備忘録として。中身は見てない(笑)