2章:VBAのプログラムリスト

  1. VBAのプログラムリスト
     1章の最小自乗法による多項式近似をVBAで書くと以下のようになります。

    'グローバル変数の定義
    Dim Mn As Integer '連立数を設定します。
    Dim MA(101, 101) As Double 'MA[i][j]=Aijの値を設定します。i=行、j=列
    Dim MB(101) As Double 'MB[i]=Biの値を設定します。i=行
    Dim MX(101) As Double 'MX[j]=Xjの値が格納されます。j=列
    Dim X(101), Y(101) As Double '離散データ
    Dim m As Integer '離散データ数
    Dim n As Integer 'n次多項式のn

    'メインルーチン
    Sub Main()
     InData
     CAL_LSM
     OutData
    End Sub

    'インプットルーチン
    Sub InData()
     n = Sheets("Sheet1").Cells(5, 3).Value
     m = Sheets("Sheet1").Cells(6, 3).Value
     For i = 0 To m - 1 Step 1
      X(i) = Sheets("Sheet1").Cells(8 + i, 2).Value
      Y(i) = Sheets("Sheet1").Cells(8 + i, 3).Value
     Next i
    End Sub

    'n次多項式近似サブルーチン
    Sub CAL_LSM()
      Dim i, j As Integer
     Dim SX(202), SYX(202) As Double

     For i = 0 To 2 * n Step 1
      SX(i) = 0
      SYX(i) = 0
     Next i
     For j = 0 To m - 1 Step 1
      SX(0) = SX(0) + 1
      SX(1) = SX(1) + X(j)
      For i = 2 To 2 * n Step 1
       SX(i) = SX(i) + X(j) ^ i
      Next i

      SYX(0) = SYX(0) + Y(j)
      SYX(1) = SYX(1) + X(j) * Y(j)
      For i = 2 To 2 * n Step 1
       SYX(i) = SYX(i) + (X(j) ^ i) * Y(j)
      Next i
     Next j

     Mn = n + 1
     For i = 1 To Mn Step 1
      MB(i) = SYX(i - 1)
      Sheets("Sheet1").Cells(8 + i, 6).Value = MB(i)
      For j = 1 To Mn Step 1
       MA(i, j) = SX(i + j - 2)
       Sheets("Sheet1").Cells(8 + i, 7 + j).Value = MA(i, j)
      Next j
     Next i
     CAL_MX
    End Sub

    '連立方程式サブルーチン
    Sub CAL_MX()
     Dim i, j, k As Integer
     Dim Akk, Aik, SX As Double

     For k = 1 To Mn Step 1 'Aij消去操作の繰り返し
      For i = k + 1 To Mn Step 1 '連立数分の繰り返し計算
       Akk = MA(k, k)
       Aik = MA(i, k)
       MB(i) = MB(i) * Akk - Aik * MB(k) '(6.2)式の計算

       For j = 1 To Mn Step 1 '(6.1)式の計算
        MA(i, j) = MA(i, j) * Akk - Aik * MA(k, j)
       Next j
      Next i
     Next k

     MX(Mn) = MB(Mn) / MA(Mn, Mn) '(7.1)式の計算
     For k = Mn - 1 To 1 Step -1 'Xjを求める計算の繰り返し
      SX = 0
      For j = k + 1 To Mn Step 1
       SX = SX + MA(k, j) * MX(j)
      Next j
      MX(k) = (MB(k) - SX) / MA(k, k) '(8.1)式の計算
     Next k
    End Sub

    'アウトプットルーチン
    Sub OutData()
     For j = 1 To 100 Step 1   Sheets("Sheet1").Cells(7, 7 + j).Formula = ""
     Next j
     For j = 1 To Mn Step 1
      Sheets("Sheet1").Cells(7, 7 + j).Value = MX(j)
     Next j
    End Sub

  2. 解説
    1. グローバル変数の定義
       共通エリアに使用するグローバル変数を定義します。

    2. メインルーチン
       「計算実行」ボタンが押されるとメインルーチンが実行されます。
       インプットルーチン、n次多項式近似サブルーチン、アウトプットルーチンの順で実行します。

    3. インプットルーチン
       「Sheet1」の黄色のセルに設定された数値を読取り、グローバル変数に設定します。

    4. n次多項式近似サブルーチン
       グローバル変数の値から、連立方程式の定数を計算します。
       連立方程式の定数を「Sheet1」の指定位置に表示します。
       連立方程式サブルーチンを実行します。

    5. 連立方程式サブルーチン
       連立方程式の定数(グローバル変数)から連立方程式の解を求めます。

    6. アウトプットルーチン
       連立方程式の解(A0〜An)を「Sheet1」に表示します。





3章:VBA最小自乗法関数近似フリーソフトに行く。

トップページに戻る。