wetchのブログ

他人に見られることを想定していない書き散らかし独習ノート.物理学とかVBAとか.

求根アルゴリズム (5)

まだ続き。
https://wetch.hatenablog.com/entry/2019/10/20/120414

そもそもやりたかったことを思い出すと、3変数関数f(a,b,c)に対してf=0となるようなa,b,cを1個ずつ決めたかったのだった。なのでIMathFuncインターフェイスの実装であるConcreteFunctionクラスを書いてみるとこうなる。
とりあえずf(a,b,c)=a(b-c)^2-2とする。

まずはaのみを変数としたConcreteFunctionOfA

Implements IMathFunc

Private b_ As Double
Private c_ As Double

Property Get IMathFunc_Parameters()
    IMathFunc_Parameters = Array(b_, c_)
End Property

Property Let IMathFunc_Parameters(para)
    b_ = para(0)
    c_ = para(1)
End Property

Function IMathFunc_Substitute(x As Double) As Double
    IMathFunc_Substitute = x * (b_ - c_) ^ 2 - 2
End Function

Function IMathFunc_InitialValue() As Double()
    Dim result(1) As Double
    result(0) = -1
    result(1) = 7.5
    IMathFunc_InitialValue = result
End Function

次にbのみを変数としたConcreteFunctionOfB

Implements IMathFunc

Private a_ As Double
Private c_ As Double

Property Get IMathFunc_Parameters()
    IMathFunc_Parameters = Array(a_, c_)
End Property

Property Let IMathFunc_Parameters(para)
    a_ = para(0)
    c_ = para(1)
End Property

Function IMathFunc_Substitute(x As Double) As Double
    IMathFunc_Substitute = a_ * (x - c_) ^ 2 - 2
End Function

Function IMathFunc_InitialValue() As Double()
    Dim result(1) As Double
    result(0) = -1
    result(1) = 6.5
    IMathFunc_InitialValue = result
End Function

最後にConcreteFunctionOfC

Implements IMathFunc

Private a_ As Double
Private b_ As Double

Property Get IMathFunc_Parameters()
    IMathFunc_Parameters = Array(a_, b_)
End Property

Property Let IMathFunc_Parameters(para)
    a_ = para(0)
    b_ = para(1)
End Property

Function IMathFunc_Substitute(x As Double) As Double
    IMathFunc_Substitute = a_ * (b_ - x) ^ 2 - 2
End Function

Function IMathFunc_InitialValue() As Double()
    Dim result(1) As Double
    result(0) = -1
    result(1) = 7.9
    IMathFunc_InitialValue = result
End Function

・・・ほとんど一緒になってしまった。というか実際コピペで作った。なんか1周して元に戻ってきた感じ。
この3つのクラスの共通部分を何とかくくりださないと意味がないな。