韜晦日記

韜晦日記

Rietveldよりもプログラミングメインになりつつある

Rietveld解析初心者による備忘録とつぶやき

シーケンシャルな解析の為にマクロを組む -完成編

2017/12/13に最新版を更新しました。

tanisukestr.hatenablog.com

遂に完成したであろうマクロ

どうもお久しぶり。
さて、約1ヶ月かかりましたが、目的であるシーケンシャルな解析のためのマクロが完成しました。マクロの中身は今回あまり詳しくは書きません。

Rietveld解析高速マクロ【RietRun】について

ということで本題に移りましょう。
今回作成したマクロはRIETAN-FPを用いて解析する為のものです。RIETAN-FPを用いてRietveld解析を行うにはプロファイル関数や尺度因子、構造パラメータなど多くの変数を精密化(変数の値を真値に近づけること)する必要があります。これらの変数は一度に精密化出来るほど簡単なものではなく、一個一個状況に応じて精密化する変数を指定して解析を行う訳です。解析の1stepごとにファイルを開いては設定を変更し、解析実行するということを繰り返していては生産的とは思えません。

そんな手間のかかる解析に救いの手を差し伸べてくれるのがSeqRunという計算高効率化マクロです。
physonit.jp
しかし、世の中はそう甘くありません。救いの手は有料。何かを得るには代償が憑き物なのでせう。
学生料金もありお求め安いのですが、自分で作ってしまおうというDIY精神がこみ上げてきたため作ってみた次第です。

作成したマクロの名前は「RietRun」であります。解析用ソフトRIETANをマクロで走らせるからRietRun。安直なネーミングセンス。

f:id:tanisuke_str:20170916185525p:plain
調子にのって作ったRietrunロゴ
動作環境はグラフ描写の為のコードの互換性を考えると
Excel2007年以降がいいと思います。一応2013, 2016での動作は確認しています。RIETAN-FPのバージョンがRIETAN-FP ver2.8.2以降であれば正常動作するはずです。それ以前のバージョンは確認していないため保証できません。

また、マクロの参照設定に"Microsoft Scripting Runtime", "Microsoft VBScript Regular Expressions 5.5"を追加しています。
この参照設定はExcelブックごとに設定されているのか、Excelソフトごとの設定なのか分からないので、使用する際は参照設定されているか確認するといいと思います。

簡単な機能説明

Rietrunの設定画面がこちらになります。デザインは...いずれ見やすくします 笑

  • insファイルの読み込み

f:id:tanisuke_str:20170916194502p:plain
中央左にある[.insファイルを読み込む]ボタンを押すとファイル選択画面が開き、解析に用いるinsファイルを指定する事ができます。
f:id:tanisuke_str:20170916195600p:plain

  • パラメータの読み込み

中央右にあるボタンを押すとinsファイルと同じ名前のシートが新規作成されて、自動的に精密化に必要なパラメータを読み込みます。このとき既に同じ名前のinsファイルを読み込んでいた場合は、"新規に読み込む"か"上書き"するか選択できます。写真の場合は新規読み込みを選択しました。新規読み込みを選択するとシート名にカッコ書きで番号が付けられます。
f:id:tanisuke_str:20170916200011p:plain
また、右上には解析ステップ数を増減させるボタンがあるのでこれを使うと簡単に解析Step数を制御できます。
このinsファイルから正確にパラメータを読み込むのには少し苦労しました。insファイルの中身はFORTRAN言語に準拠しており、If文やSelect文による分岐を正確に読み込まなければならないからです。andやorによる条件の複雑化や分岐の入れ子もあり、普遍的に取り出せるアルゴリズムを考えるのに少し工夫が必要でした。結局このinsファイルを読み込むためのコードは400行程度になってしまいました。笑
因みに、パラメータのIDは0, 1, 2と選択できるのですが、選択したときに文字の色が自動的に変わるようにしようとしていたのですが、実装を忘れていました。でもこれは多分速攻で出来ると思うので大した問題ではないです 笑
イメージとしては以下の写真のようになります。f:id:tanisuke_str:20170916201607p:plain

  • 解析モードの選択

今回用意した解析モードは3つあります。

    • 入力したStepの最初のstepから最終Stepまでの連続解析
    • 指定したステップのみを走らせるステップ解析
    • 指定してStepから最終Stepまでの連続解析
  • 線形制約条件の登録と解除

IDの入力画面で入力した値(0, 1, 2)を基に、自動解析を進めますが、IDが2の時は線形制約条件を課す必要があります。
その線形制約条件の登録を簡単に行えるようにしました。もしIDが2に設定されているStepがあれば以下の画面が表示されます。画面の中央はinsファイルから抽出した線形制約条件を入力する行です。
線形制約条件を付加したい行を入力し、線形制約条件に登録することが可能です。もし誤った行を登録しても解除ボタンで解除することもできます。
また、IDが2でないときや、登録ボタンに登録されなかった線形制約条件は自動的にコメントアウトされるので安心です。
f:id:tanisuke_str:20170916203509p:plain

  • 結果の自動グラフ化機能

解析によって出力される.lstファイルを読み込み、自動的にグラフを描写します。これにより、収束の判定やパラメータの推移をリアルタイムで確認することができます。
f:id:tanisuke_str:20170916204515p:plain

insファイルを読み込むと、insファイル主要な設定一覧が更新されます。特に下の2つは非線形最小二乗法のアルゴリズムに関するパラメータです。
解析の終盤ではNAUTOを3にすることで、共役方向法によって局所解(local minimum)に落ち込間無いようにする必要が出てきます。
そう言った場合にこのセルに値を入力することで次ステップから自動的に手法が切り替えられるようになります。
f:id:tanisuke_str:20170916204757p:plain



ざっとして際立つ機能はこんな感じです。一応いろいろと素人なりにエラー処理を考えて実装したので、ユーザーが予期せぬ行動をとったり解析に失敗したときに適切に処理を下せるようにしてあります。
なんか抽象的な表現でごめんなさい 笑
結局このマクロを実行するためのコードは約1800行, 全モジュールは26となりました。果たしてこのコード数は長すぎるのでしょうか?モジュールの数も妥当な量なのでしょうか。わたし気になります。


最近更新が途絶えていたのは、このマクロを作成するのに集中していた為です。始めのうちはプログラミングというのに慣れていない上に初めて触るVBAなので、右往左往しており息抜きにVBAに関する記事を書いていました。
ところが、ある一定以上VBAについて理解して来たら、雪崩のように情報が入ってきて、とても記事に出来る様な量ではなくなりました。ということでブログなんて悠長に書かずに一気にマクロを作成していた訳です。

ということで早く遊びたいので今日は足早に終わります。またね。