0

F1 にある De の値を変えることで、残差の二乗和の値を最小化しようとしています。CFL Calculated の値を CFL Measured の値にできるだけ近づけたいと考えています。これらの残差の二乗の合計が小さいほど、適合度が高くなります! stackoverflow にアドバイスを求めた後、ゴール シークを使用して残差の二乗和を最小化し、De の値を変化させてできるだけゼロに近づけることにしました。最も理想的な値を見つけたいのです。

私はこのプログラムを完全に実行するようにしました、またはそう思った... を使用してすべての残差を合計する代わりに=SUM(D2:D14)、誤って を使用したことがわかりました=SUM(D2,D14)。そのため、最初と最後の数字だけを合計していました。

すべての残差の二乗を合計しようとしているので、これらのクレイジーなエラーと De の非常識な値が得られます。

De の値が 0 より大きく、1 より小さい必要があることはわかっています。これらの境界を使用して、このゴールシークを特定の範囲内に集中させるにはどうすればよいですか? この場合の De の答えは、約 .012 です。#NUM!すべての残りのセルでエラーが発生し続けます。これはオーバーフローの問題によるものですか?

ゴール シークを使用して De の最も理想的な値を見つけてこれらの合計を最小化してもうまくいかないと結論付けた場合、どのように対処しますか? 他に使用できるソルバーはありますか?

コードは次のとおりです。

Option Explicit

Dim Counter As Long
Dim DeSimpleFinal As Double
Dim simpletime As Variant
Dim Tracker As Double
Dim StepAmount As Double
Dim Volume As Double
Dim SurfArea As Double
Dim pi As Double
Dim FinalTime As Variant
Dim i As Variant

Sub SimpleDeCalculationNEW()

    'This is so you can have the data and the table I'm working with!
    Counter = 13
    Volume = 12.271846
    SurfArea = 19.634954
    pi = 4 * Atn(1)
    Range("A1") = "Time(days)"
    Range("B1") = "CFL(measured)"
    Range("A2").Value = 0.083
    Range("A3").Value = 0.292
    Range("A4").Value = 1
    Range("A5").Value = 2
    Range("A6").Value = 3
    Range("A7").Value = 4
    Range("A8").Value = 5
    Range("A9").Value = 6
    Range("A10").Value = 7
    Range("A11").Value = 8
    Range("A12").Value = 9
    Range("A13").Value = 10
    Range("A14").Value = 11
    Range("B2").Value = 0.0612
    Range("B3").Value = 0.119
    Range("B4").Value = 0.223
    Range("B5").Value = 0.306
    Range("B6").Value = 0.361
    Range("B7").Value = 0.401
    Range("B8").Value = 0.435
    Range("B9").Value = 0.459
    Range("B10").Value = 0.484
    Range("B11").Value = 0.505
    Range("B12").Value = 0.523
    Range("B13").Value = 0.539
    Range("B14").Value = 0.554

    Range("H2").Value = Volume
    Range("H1").Value = SurfArea

    Range("C1") = "CFL Calculated"
    Range("D1") = "Residual Squared"
    Range("E1") = "De value"
    Range("F1").Value = 0.1

    'Inserting Equations
    Range("C2") = "=((2 * $H$1) / $H$2) * SQRT(($F$1 * A2) / PI())"
    Range("C2").Select
    Selection.AutoFill Destination:=Range("C2:C" & Counter + 1), Type:=xlFillDefault

    Range("D2") = "=((ABS(B2-C2))^2)"
    Range("D2").Select
    Selection.AutoFill Destination:=Range("D2:D" & Counter + 1), Type:=xlFillDefault

    'Summing up the residuals squared
    Range("D" & Counter + 2) = "=Sum(D2: D" & Counter + 1 & ")"

    'Goal Seek
    Range("D" & Counter + 2).GoalSeek Goal:=0, ChangingCell:=Range("F1")

    Columns("A:Z").EntireColumn.EntireColumn.AutoFit

    DeSimpleFinal = Range("F1")    
    MsgBox ("The Final Value for DeSimple is: " & DeSimpleFinal)

End Sub
4

3 に答える 3

3

現在の解では F1 の値が負になるため、NUM 個のエラーが発生しています。また、式の 1 つで F1 の平方根を取得しようとしています。

また、この場合、ゴール シークは、使用している F1 の特定の初期開始「推測」に非常に敏感です。これは、現在使用している 0.1 の両側で F1 の初期値を少し変更すると明らかです。実際、F1 値に応じて、ゴール シークの解には大きな不安定領域があります。

ゴールシークの不安定性

質問で取り上げたように、ソリューション検索への可能な入力に制約を設定できれば、有用な結果が得られる可能性が高くなります。Excelには、それを可能にするというアドインが付属しており、Solverいくつかの異なる検索方法を提供しています. ソルバーは、Excel を最初に起動したときに自動的に読み込まれませんが、ここで説明されているように、簡単に読み込むことができます。

于 2013-06-06T14:42:22.277 に答える
1

あなたは他のソルバーを求めます。何が起こっているのかを理解するのに役立つ代替案と少しの理論については、Numerical Recipes (オンライン ブックはこちら) を参照してください。第 10 章ではこれについて説明します。GoalSeekまたはソルバー アドインとは異なることを試してみたい場合は、既製のコード サンプルが含まれています。もちろん、コードは Fortran/C/C++ で書かれていますが、これらは VBA に簡単に変換できます (私はこれを何度も行いました)。

于 2013-06-06T06:43:33.293 に答える