2012年9月27日木曜日

○第164回目 パラメータを繰り返し入れて、結果を一挙に求める

 ある関数(かなり複雑なものを想定。関数というよりエクセルの計算システムというのが適切か)があり、その中の一パラメータをいろいろと変えていき、その関数値を求める。これを一挙に行い、その結果を一覧表にしようというもの。
 例
 計算結果=関数(項目1、項目2、項目3、項目4、項目5)(簡単な例で、関数=ax^2+bx+c として、xにいろいろな値をいれていき、答えを求める。=⇒この例だとマクロを使う必要はありませんね)
 出力例
 パラメータ 計算結果 最初の計算結果との差
 
 パラメータを変えた場合、どのような結果になるかというシミュレーションというイメージでしょうか。
 また、一意的に解けない方程式があり、ニュートン法でその答えの範囲を徐々に絞っていき、最終的な答えを求めるという場合にも利用(間接的に)できますね。
 ※ニュートン法=⇒複雑なので(というより、筆者が理解できないので、筆者の分かる範囲で)、簡単にいうと、一変数で成り立つ方程式=aを満たす、未知数を求める場合、方程式-a=0とみて、未知数の値をいろいろと入れていくことで、答えを求めようとするもの。
 未知数に、nを入れた場合、式の左辺がプラスになったとする。また、mを入れたときにマイナスになったとすると、答えはnとmの間にあると推測される。
 そこでnとmの間に適当(ちょうど真ん中でもいい)な値m1をとってみると、その答えが、プラスであれば、求める答えは、m1とmの間にあると思われる。また、マイナスであれば、求める答えは、nとm1のあいだにあると思われる。これを繰り返していくことによって、求める答えの範囲が狭まってくる。後は必要とする精度により、適当に求める範囲を絞り込めば良い。
 (この例での活用としては、nとmの間を10等分したものを入れて答えを求める。その結果の符号の変化で最終的に求めたい答えのある区間がわかる。これを繰り返す。)
 
 それでは手順です。
 0.パラメータは、変えたい値ではなく、もととなる値からの差の値とする。このくらい増えたらとか、このくらい減ったらという意味合いの数値を入れていく。
 新しい数値=元の数値 + パラメータ
 パラメータとして、1以下の小数の値を入れた場合は、増減率として考えて計算するという機能を追加するといいかもしれません(5%増とか、5%減とかいうイメージ)。
 新しい数値=元の数値*(1+パラメータ)

 1.複数のパラメータを入れてあるセルの範囲を指定してから実行(先頭のセルのみを指定し、パラメータは下にあるものとし、ヌルが出てきたのところで終了とする方法もある)
 2.パラメータによる新しい値を入れたいセルを指定する
 3.計算結果(答えでもあり、答えの初期値でもある)のあるセルを指定する
 4.パラメータの横に、そのパラメータによる結果(答え)及び基準値との差を入れて、一覧表を作成する。
 5.2.を実行前の値(初期値)に戻す。

 更なる機能としては、無条件に罫線でかこってしまうということも考えられます。
 また、結果表の範囲の座標を打ち出し、範囲印刷につなげるということも考えられます。


 マクロ作成に必要な機能
 1.Cellsコマンドによるパラメータの取得
    for i = 1 to gyo_cnt
       変数1(i) = Cells(gyo0 + i - 1, j)
    next

 2.3.セルの座標の指定(inputメソッドによるカーソル等を使ったセルの指定)
    Dim セル範囲 As Range
  Set セル範囲 = Application.InputBox(Prompt:="次のセット範囲の先頭のセルを指定してください", Default:=AAA1, Left:=10, Top:=2, Type:=8)
  aaa2 = セル範囲.Address

      Type:=の値 意味
      0 数式
      1 数値
      2 文字列(テキスト)
      4 論理値(TrueまたはFalse)
      8 セル参照(Rangeオブジェクト)
     16 エラー値(#N/Aなど)
     64 数値配列

 4.Cellsコマンドによる値の出力
    for i = 1 to gyo_cnt
    Cells(gyo0 + i - 1,retu0) = 変数1(i)
    Cells(gyo0 + i - 1,retu0+1) = 変数2(i)
    Cells(gyo0 + i - 1,retu0+2) = 変数3(i)
    next

 ※罫線の設定。全体座標の取得と打ち出し


 

0 件のコメント: