数式で 3 つの変数を解こうとしています。式は次のとおりです。
Dim secondMomentOfBeam As Func(Of Beamμ2params, Double, Double) =
Function(params, z)
Return params.σ0 ^ 2 + (params.M2 ^ 2) * Math.Pow(λ / (Math.PI * params.σ0), 2) * Math.Pow(z - params.z0, 2)
End Function
使用して
Friend Class Beamμ2params
Public σ0 As Double
Public z0 As Double
Public M2 As Double
Public Sub New(ByVal sigmaNot As Double, ByVal zNot As Double, ByVal Msquared As Double)
Me.σ0 = sigmaNot
Me.z0 = zNot
Me.M2 = Msquared
End Sub
End Class
各変数 σ0、z0、M2 をディザリングし、全体の二乗誤差をチェックしてから、二乗誤差に応じて繰り返すか終了するループを作成する必要があります。
While errorSquared > 1
' minimize error with σ0
' minimize error with z0
' minimize error with M2
End While
変数ごとにこのループをハードコーディングする (および同一のコード ブロックを多数持つ) 代わりに、変数を選択するラムダに応じて、このように呼び出される変数を最小化できる関数を使用することをお勧めします。
Dim minimizeErrorSquared As Func(Of Beamμ2params, Func(Of Beamμ2params, Double), Double, UInt32, Beamμ2params) =
Function(params, selector, dither, iterations)
' dither value chosen by selector
' check error-squared
' dither toward zero
' up to max iterations
End Function
2 番目の引数でselector
、どの変数をディザリングするかを選択します。これにより、ループが次のようになります
Dim params As New Beamμ2params(σ0initial, z0initial, M2initial)
While errorSquared > 1
params = minimizeErrorSquared(params, Function(p As Beamμ2params) p.σ0, 0.01, 10)
params = minimizeErrorSquared(params, Function(p As Beamμ2params) p.z0, 5, 10)
params = minimizeErrorSquared(params, Function(p As Beamμ2params) p.M2, 0.05, 10)
' calculate error squared based on raw data and params
End While
私が頭を抱えることができない問題は、新しい変数値を 内の適切な変数に適用minimizeErrorSquared
し、新しい変数が変更された状態で params を返す方法です。引数を指定してデリゲートを試しましたがByRef
(ここに貼り付ける価値はありません)、新しい変数の値をメイン ループに戻すことができません。一連の思考を概念的に仕上げる方法についての提案、または別の角度から考えて別のパラダイムを提案してくれる人を探しています。