面白そうなテーマがあったので、挑戦してみた。
「y = 5x^3 + 2x^2 + 7x + 5」の導関数を求めよ
導関数なので、微分した式を求める必要がある。
今回は、正規表現で解決してみた。
各項を以下のパターンで抽出してみる。
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
結果はこちら。
一応答えは出たが、数式に他の文字が含まれた瞬間に、これは成立しなくなる。
あくまで限定的な場合に使用可ということで。
参考まで。