none
VBのRATE関数の反復計算の手法について RRS feed

  • 質問

  • JAVA版のRATE関数を作ってますが、VBと同じ計算式を用いて、
    Newton-Raphson methodで反復計算しています。
    だが、20回実行した時点で、値の1.0E-7に収束していなかったケースがありました。

    VBにはどのように計算していることをご存じの方はいらっしゃいますか。

    2009年4月17日 1:11

回答

すべての返信

  • 以下が参考になりませんか?

    http://okwave.jp/qa3373929.html
    2009年4月17日 6:31
  • こんにちは。フォーラムオペレーター高橋です。

    確認なのですが、choucnさんが作ったJAVAのRATE関数で値の1.0E-7に収束していなかったケースがあったという認識でよいですか?
    同じケースでVBのRATE関数を使った場合は、どのような結果になりましたか?

    VBのヘルプを確認したのですが、Rate関数が反復計算を 20 回行っても適切な解が見つからない場合は、エラーとなります。
    もし、JAVAとVBで同じ結果になるのであれば、VBのRATE関数と同じように、エラーを返すという方法でも良いと思います。
    http://msdn.microsoft.com/ja-jp/library/2kfcw15e.aspx

    違う結果の場合、GX999さんが紹介してくれたサンプルでは、どのような結果になるか試されてはどうですか?

    今回、GX999さんから頂いた情報が有用な情報であったため、勝手ながら回答マークを付けさせて頂きました。
    不適切な場合は、回答マークを削除する事も可能ですので、そのときはよろしくお願いします。

    今後ともMSDNフォーラムをよろしくお願いします。


    マイクロソフト株式会社 フォーラム オペレータ 高橋春樹
    2009年4月30日 9:40
  • おはよございます。チョウです。

    ご回答の皆さんありがとうございます。

    以下のパラメータでVBとJAVAで異なる結果になっています。

    期間:12回
    定期支払額:-5000円
    現在価値(借入額):10000円
    将来価値:0円
    支払期日:0
    推定値:0.1

    VB結果:#NUM!
    JAVA結果:-1.87813468165738

    推定値が03に変更して以上の結果と同じです。

    ただし、推定値が0.5に変更して、
    VB結果:0.496021531967582
    JAVA結果:0.496021531967577
    ほぼ同じ結果になります。これはOKです。

    推定値が0.1の場合、同じ結果が出てほしいですが、何かアドバイスを
    いただけませんか。
    2009年5月25日 1:05
  • 結果が#NUM!ということは、Excelのワークシート関数を使っているのでしょうか?
    #NUM!が返ってくるということは、引数が正しくない場合です。

    VBAでRate関数を使用してみたところ、推定値はほぼ同じ値が返ってきています。
    ちなみにVB.NETでも推定値はほぼ同じ値が返ってきます。

    2009年5月25日 1:42
  • GX999 さん、ありがとうございます。

    VB6で上述のケースを確認したところで、JAVAとほぼ同じです。
    さらに、確認します。
    2009年5月25日 1:58
  • 推定値が0.3の場合、

    VB6結果:0.496021531967577
    JAVA結果:-1.87813468165738

    推定値が0.5の場合、

    VB6結果:0.496021531967578
    JAVA結果:0.496021531967577

    VB.NETでまだ確認していないですが。
    これは何か原因がありますか、よろしくお願いいたします。
    2009年5月25日 2:06
  • 推定値が0.3の場合、

    VB6結果:0.496021531967577
    JAVA結果:-1.87813468165738
    VB.NETでも0.496....のほうになりますね。

    Javaのほうは試していないので何とも言えませんが、Java版Rate関数に不具合があるか、choucnさんのプログラムに不具合があると思います。
    Java関連のコミュニティでご質問されたほうが有効な回答が得られるのではないかと思います。
    2009年5月25日 2:50
  • VB6とVB.NETでさらにテストしましたが、結果は以下の不一致ケースがありました。

    ケース①
    期間:24回
    定期支払額:-20000000円
    現在価値(借入額):10000000000円
    将来価値:0円
    支払期日:0
    推定値:0.3

    VB6結果:例外発生
    VB.NET:-0.169238909847223

    ケース②
    期間:36回
    定期支払額:-20000000円
    現在価値(借入額):10000000000円
    将来価値:0円
    支払期日:1
    推定値:0.5

    VB6結果:-0.108173999501872
    VB.NET結果:例外発生

    この不一致はどの原因でしょうか。よろしくお願いいたします。
    2009年5月25日 8:01
  • VB6とVB.NETでさらにテストしましたが、結果は以下の不一致ケースがありました。

    ケース①
    期間:24回
    定期支払額:-20000000円
    現在価値(借入額):10000000000円
    将来価値:0円
    支払期日:0
    推定値:0.3

    VB6結果:例外発生
    VB.NET:-0.169238909847223

    ケース②
    期間:36回
    定期支払額:-20000000円
    現在価値(借入額):10000000000円
    将来価値:0円
    支払期日:1
    推定値:0.5

    VB6結果:-0.108173999501872
    VB.NET結果:例外発生

    この不一致はどの原因でしょうか。よろしくお願いいたします。

    私の検証では、ケース1の場合、-0.177530903320323となりましたが。

    例外が発生している場合、引数に問題があります。ExceptionのMessageを見てみたところ、やはり「指定された引数を使って割合を計算することはできません。」とあります。Rate関数を呼び出す前に値が妥当な範囲に収まっているのか、検証しなければならないのではないでしょうか?

    VB.NETの場合、Rate関数の第5引数はDueDate型であり、この指定が間違いやすいです。
    2009年5月25日 8:54
  • 同じパラメータで、VB6、VB.NETで計算された結果が異なります。
    それはVB6かVB.NETかの計算精度の問題なのか。

    パラメータ
    期間: 60回
    定期支払額: -9000000円
    現在価値(借入額): 86420000円
    将来価値: 20000円
    支払期日: 1
    推定値: 0.1(0.3, 0.5)

    VB.NET結果: 0.11607051273018 (0.11607051273018, 0.11607051273018)
    VB6結果:引数不正の例外が発生

    また、Rate関数はdoubleを使っていますが、doubleの精度に問題があるでしょうか。

    2009年5月25日 9:41