エクセルの基本操作の紹介


  まずは、簡単な線形常微分方程式(下記)の解を求めることを通して、微分方程式の解を得るためのエクセルの使い方を紹介します。

  dx(t)/dt =- 2*x(t) + u(t),    u(t) = sin(3*t),   x(0) = 0

手順1: Microsoft Excel を開く
手順2: 「ツール」 「マクロ」 「Visual Basic Editor」を選択し、「Visual Basic Editor」を開く。
手順3: そこで、「標準モジュールのModule1」を開く。
手順4: 「標準モジュールのModule1」の中に、実行させたい処理のプログラムを以下のように書く。

       Sub sim1()

          Dim x(1001) As Double
          Dim u(1001) As Double
          Dim time(1001) As Double
          Dim dt As Double
          Dim i As Integer

             Set WS = Worksheets("Sheet1")
             WS.Activate
             Range("A1:I1300").Select
             Selection.Clear

          Cells(1, 2) = "時刻t(sec)"
          Cells(2, 3) = "x(t)"

          time(0) = 0
          dt = 0.01
          x(0) = 0
          u(0) = 0
          For i = 1 To 1000
          time(i) = i * dt
          u(i) = Sin(3 * i * dt)
          Next

          For i = 1 To 1000
          x(i) = x(i - 1) + (  - 2 * x(i - 1)+u(i-1)) * dt
          Next

          For i = 0 To 1000
          Cells(3 + i, 2) = time(i)
          Cells(3 + i, 3) = x(i)
          Next

       End Sub

手順5: 「標準モジュールのModule1」を開いた状態で、「実行」 「Sub/ユーザーフォームの実行」を選択して、プログラムを実行させる。
手順6:sheet1 に以下のような計算結果が出力されているので、結果を確認する。

時刻t(sec)

     x(t)
0 0
0.01 0
0.02 0.0002
0.03 0.000596
0.04 0.001184
0.05 0.001959
0.06 0.002918
0.07 0.004057
0.08 0.005371
0.09 0.006857
0.1 0.00851
0.11 0.010327
0.12 0.012302
0.13 0.014433
0.14 0.016716
0.15 0.019145
0.16 0.021717
0.17 0.024428
0.18 0.027275
0.19 0.030252
0.2 0.033356
0.21 0.036583
0.22 0.039929
0.23 0.04339
0.24 0.046962
0.25 0.05064
0.26 0.054422
0.27 0.058302
0.28 0.062277
 ・
 ・
 ・
 ・


(注) 微分方程式の定義より、dx(t)/dt =- 2*x(t) + u(t),  は、微小な dt に対し、
    x(t+dt) = x(t) + [ -2*x(t) + u(t) ]*dt  
が成り立つことを意味している。よって、上式を時間発展的に、初期状態 x(0) = 0 から計算して、 x(t) を求めるという、簡易な計算方法を取ることとする。この方法で、気をつけなければならないことは、 dt を微小に取ることである。(dt を 一桁小さくしても計算結果がほとんど変わらなければ、その dt で十分微小であると判断できる。)



さらに、上で得た計算結果をグラフ表示したい場合には、手順4のソフトの End Sub の前に以下のプログラムを書き入れて手順5、で実行させると、sheet1 に以下のようなグラフを出力させることができる。

    Range("B2:C1003").Select
    Charts.Add
    ActiveChart.ChartType = xlLineMarkers
    ActiveChart.SetSourceData Source:=Sheets("Sheet1").Range("B2:C1003"), PlotBy _
        :=xlColumns
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
    With ActiveChart
        .HasTitle = False
        .Axes(xlCategory, xlPrimary).HasTitle = True
        .Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "time(sec)"
        .Axes(xlValue, xlPrimary).HasTitle = False
    End With


(注)上記微分方程式系の場合、解析解は、  x(t)=3*exp(-2*t)/13 -3*cos(3*t)/13 +2*sin(3*t)/13  であり、解析解とシミュレーション解の相違を調べてみると、差の絶対値の最大値は 0.0035 であり、こんな簡単なシミュレーションで十分な精度の解が得られていることが確かめられる。

さらに、グラフ化の上記ソフトの
        .HasTitle = False
の部分を
        .HasTitle = True
        .ChartTitle.Characters.Text = "応答波形"
で置き換えると、グラフにタイトル「応答波形」を付けることができる。
また、グラフ化の上記ソフトの
        .Axes(xlValue, xlPrimary).HasTitle = False
の部分を
        .Axes(xlValue, xlPrimary).HasTitle = True
        .Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "x(t)"
で置き換えると、グラフの縦軸の変数 x(t) を表示させることができる。

(注) m-adachi@02.246.ne.jp   へメールで依頼があれば、上記エクセルのソフトをメールの添付ファイルで送ります。

数値シミュレーションの最初のページへ

簡単な常微分方程式の解を求めるシミュレーションへ

ホームページのトップへ