導関数を求める

面白そうなテーマがあったので、挑戦してみた。

「y = 5x^3 + 2x^2 + 7x + 5」の導関数を求めよ

f:id:Infoment:20200209081223p:plain

導関数なので、微分した式を求める必要がある。
今回は、正規表現で解決してみた。

各項を以下のパターンで抽出してみる。

axのb乗 の後に「 + 」または「 - 」が続くもの

このとき厄介なのが、係数が1のとき、また1乗のとき。
例えばxをわざわざ、

1×xの1乗

とは書かない。しかし省略された場合、何もないのでそのままでは「0」と判断してしまう。その辺りを加味して、このように作ってみた。

Sub Sample()
    ' 元の式。
    Dim Source As String
        Source = "y = 5x^3 + 2x^2 + 7x + 5"
    
    ' 正規表現(パターン検出用)
    ' Microsoft VBScript Regular Expression 5.5参照要
    Dim myReg As VBScript_RegExp_55.RegExp
    Set myReg = New VBScript_RegExp_55.RegExp
        
        ' 検出しても一回で止めない(全部拾う)。
        myReg.Global = True
        ' パターン定義。
        myReg.Pattern = "(\d*)x\^?(\d*)(\s[\+-]\s)"
    
    Dim i As Long
    ' マッチした数式の各項を格納するためのコレクション。
    Dim MC As VBScript_RegExp_55.MatchCollection
    ' 各項の中身を()毎に分割する。
    Dim SM As VBScript_RegExp_55.SubMatches
    ' 微分した後の各項を格納するためのコレクション。
    Dim col As Collection
    Set col = New Collection
        ' パターンにマッチしたならば。
        If myReg.Test(Source) Then
            ' 各項をコレクションに格納。
            Set MC = myReg.Execute(Source)
            ' 各項について処理を行う。
            For i = 0 To MC.Count - 1
                ' 各項の値をさらに分割。
                Set SM = MC(i).SubMatches
                ' ax^bで値取得。
                Dim a As Long, b As Long
                    ' ax^b のaに相当する部分が空白なら、
                    ' それは1が省略されている。
                    If SM(0) = vbNullString Then
                        a = 1
                    Else
                        a = SM(0)
                    End If
                    
                    ' ax^bのbが無いならば、それは1が省略されている。
                    ' ax^bのbが1ならば、微分したあとの式で省略される。
                    If SM(1) = vbNullString Then
                        b = 1
                        col.Add a
                    ElseIf SM(1) = 2 Then
                        col.Add a * 2 & "x" & SM(2)
                    Else
                        b = SM(1)
                        col.Add a * b & "x^" & b - 1 & SM(2)
                    End If
            Next
        End If
        
    ' 答えの組立。
    Dim Answer As String
        For i = 1 To col.Count
            Answer = Answer & col.Item(i)
        Next
        
        MsgBox "dy/dx = " & Answer
End Sub

結果はこちら。
f:id:Infoment:20200209082227p:plain

一応答えは出たが、数式に他の文字が含まれた瞬間に、これは成立しなくなる。
あくまで限定的な場合に使用可ということで。

参考まで。