VBAで数値計算 05 数値積分

16
2017-01 更新 熊本高専 森下功啓 VBA数値計算05

Transcript of VBAで数値計算 05 数値積分

Page 1: VBAで数値計算 05 数値積分

2017-01更新 熊本高専森下功啓

VBAで数値計算05

Page 2: VBAで数値計算 05 数値積分

本資料の目次

数値積分練習問題その他

2

Page 3: VBAで数値計算 05 数値積分

数値積分3

Page 4: VBAで数値計算 05 数値積分

定積分積分とは微分の逆操作定積分は、幾何学的にはある区間の面積を求めていることに等しい。加速度を積分すると速度が求まり、速度を積分すると移動距離が求まる。例えば、地震計の観測した加速度を2回積分すると地震計の変位が求まる。角速度を積分すると旋回角度が求まる。

4O

𝑥𝑥

𝑦𝑦

𝑎𝑎 𝑏𝑏

𝑓𝑓(𝑥𝑥)

�𝑎𝑎

𝑏𝑏𝑓𝑓 𝑥𝑥 𝑑𝑑𝑥𝑥 = 𝑆𝑆

𝑆𝑆面積

Page 5: VBAで数値計算 05 数値積分

積分計算の定義

定積分の近似解として、短冊の面積の和を求めます。十分に分割数が多ければ高い精度が出るでしょう。

5

O𝑥𝑥

𝑦𝑦

𝑥𝑥0 𝑥𝑥𝑛𝑛∆𝑥𝑥

�𝑥𝑥0

𝑥𝑥𝑛𝑛𝑓𝑓 𝑥𝑥 𝑑𝑑𝑥𝑥 = lim

𝑛𝑛→∞�𝑘𝑘=0

𝑛𝑛−1

𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥

𝑓𝑓(𝑥𝑥)

*短冊の数が増える(分割数が増える)と、精度が向上する。

∆𝑠𝑠𝑘𝑘 = 𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥

𝑘𝑘番目の微小領域の面積

Page 6: VBAで数値計算 05 数値積分

6

空白が目立ちます。誤差が大きそうですね?誤差を減らしましょう。

Page 7: VBAで数値計算 05 数値積分

台形積分

誤差を減らすために、短冊の形を長方形から台形に変えます。

7

∆𝑠𝑠𝑘𝑘 =12 𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 + 𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥

𝑘𝑘番目の微小領域の面積

�𝑥𝑥0

𝑥𝑥𝑛𝑛𝑓𝑓 𝑥𝑥 𝑑𝑑𝑥𝑥 = lim

𝑛𝑛→∞�𝑘𝑘=0

𝑛𝑛−112 𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 + 𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥

(𝑥𝑥𝑘𝑘 , 𝑓𝑓 𝑥𝑥𝑘𝑘 )

(𝑥𝑥𝑘𝑘 + ∆𝑥𝑥, 𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 )

∆𝑥𝑥

𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 + 𝑓𝑓 𝑥𝑥𝑘𝑘

台形2つ分の面積 = (上辺+下辺)高さ

Page 8: VBAで数値計算 05 数値積分

実装戦略

プログラムをどう組むか考えてみる。まずは近似式に変換する。

8

�𝑥𝑥0

𝑥𝑥𝑛𝑛𝑓𝑓 𝑥𝑥 𝑑𝑑𝑥𝑥~ �

𝑘𝑘=0

𝑛𝑛−112 𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 + 𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥 ∆𝑥𝑥 ≪ 1

ループで足し続ける微小幅は十分に小さく

𝑥𝑥𝑘𝑘に∆𝑥𝑥を足して𝑥𝑥𝑘𝑘+1を作る

𝑥𝑥の関数𝑓𝑓が必要

Page 9: VBAで数値計算 05 数値積分

実装のイメージ

9

Dim x As DoubleDim y As DoubleDim dx As DoubleDim ds As DoubleDim s As Double

dx = 0.01s = 0#ds = 0#For x = 2 to 10 Step dx ‘ 数値は積分区間s = s + (func(x + dx) + func(x)) * dx / 2#

Next x

�𝑥𝑥0

𝑥𝑥𝑛𝑛𝑓𝑓 𝑥𝑥 𝑑𝑑𝑥𝑥~ �

𝑘𝑘=0

𝑛𝑛−112 𝑓𝑓 𝑥𝑥𝑘𝑘 + ∆𝑥𝑥 + 𝑓𝑓 𝑥𝑥𝑘𝑘 ∆𝑥𝑥

*計算精度向上と計算速度向上のために一工夫の余地はある。

ループで足し続ける

微小幅は十分に小さく

𝑥𝑥𝑘𝑘に∆𝑥𝑥を足して𝑥𝑥𝑘𝑘+1を作る

𝑥𝑥の関数𝑓𝑓が必要

@VBA

Page 10: VBAで数値計算 05 数値積分

練習問題10

Page 11: VBAで数値計算 05 数値積分

問1 普通に定積分

y=ax2+bx-c上記の式において、係数は任意とした場合に-10<=x<=10の範囲で積分する関数を作成せよ。

11

Page 12: VBAで数値計算 05 数値積分

問2 定積分

上記の式において、-10<=x<=10の範囲で積分する関数を作成せよ。

12

𝑦𝑦 = 3.9𝑥𝑥(sin 𝑥𝑥)3

Page 13: VBAで数値計算 05 数値積分

問3 実際のデータの処理

角速度センサから得られたデータを以下のリンクに示す。データをダウンロードし、初期位置からの旋回角度を求めよ。データの説明を次のページに示す。Excelファイル版:https://www.dropbox.com/s/0ascznvpqx4puer/rotation.xlsx?dl=0

csvファイル版:https://www.dropbox.com/s/kfrspmpgenb6rsv/rotation.csv?dl=0

13

Page 14: VBAで数値計算 05 数値積分

14

リンク先のファイルはデジタルIMUセンサで観測した角速度です。元々のファイルサイズはExcelで処理可能な限界を突破していたので一部を抜き出しました。

csvファイルは、PCの観測時刻と角速度の観測値が並んでいます。角速度とは、単位時間当たりの旋回角度のことです。ここで、観測値の単位は不明なので、仮に[rad’/s]としておきます。

Excelファイルは、PCの観測時刻と角速度の観測値と観測時刻の差[s]が並んでいます。Δt列から、観測間隔が不均一であることが分かります。ここで、旋回角度[rad’]を求めるには、微小旋回角度Δθの合計を求めねばなりません。Δθ=観測値*Δtです。

csvファイルと比べると時刻の分解能が小さくなっていることが分かりますが、Excelの標準機能の限界だと思ってください。

Page 15: VBAで数値計算 05 数値積分

その他15

Page 16: VBAで数値計算 05 数値積分

参考文献

SAK Streets - VB 開発言語資料 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。

なぜ定積分で面積が求まるのか http://mathtrain.jp/teisekibun

16