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

VBAで数値計算 06 観測データの処理

Embed Size (px)

Citation preview

Page 1: VBAで数値計算 06 観測データの処理

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

VBAで数値計算06

Page 2: VBAで数値計算 06 観測データの処理

本資料の目次

プログラムの良さの指標型と精度を意識した計算VBA TIPS観測データの処理練習問題その他

2

VBAの配列について学びます

Page 3: VBAで数値計算 06 観測データの処理

プログラムの良さの指標 数値計算的に

3

Page 4: VBAで数値計算 06 観測データの処理

良いプログラムとは

4

動かないプログラム動くプログラム >>

動くと言っても、レベルは色々ある。。。

Page 5: VBAで数値計算 06 観測データの処理

5

文法エラーがない

必要な処理速度が出る

論理的に正しい

*上は下を満たすこと処理速度が遅すぎる

一定の条件下で必要な精度が保証された結果を出力する

良い

読みやすいコード量が少ない

転用と拡張がしやすい

Page 6: VBAで数値計算 06 観測データの処理

論理的に正しいプログラムを書くには?論理的に正しいプログラムを書くには、「論理的に間違っていることを確認できる」ことが大前提です。

プログラムがどの様に振舞えば「バグがある」と言えるか考える必要があります。

6

Page 7: VBAで数値計算 06 観測データの処理

プログラムを良くするには?

次の事柄を試しましょう。実行して、動くこと単純なケースでの計算結果が正しいこと

あとは、沢山プログラムを書いて練習あるのみです。英語と同じです。練習しなければ身につきません。

7

Page 8: VBAで数値計算 06 観測データの処理

型と精度を意識した計算8

Page 9: VBAで数値計算 06 観測データの処理

変数は実数ではない

変数は数学でいう実数ではない。有限の値しか取れないし、離散的で、浮動小数点型の分解能は状況によって変わる。これを考慮しなければ複雑な数値計算はできない。

9

Page 10: VBAで数値計算 06 観測データの処理

桁あふれ(オーバーフロー)

VBAの整数は有限の桁数しか表現できない。例えば、integer型であれば-32,768~32,767の範囲である。プログラマは、プログラムが利用する数値の範囲を意識しなくてはならない。

10

Page 11: VBAで数値計算 06 観測データの処理

大に小を足すと精度が悪化しやすい

浮動小数点は「符号」,「仮数」,「指数」で表現される。64bitで浮動小数点を表現する場合、桁数が17桁以上異なる数値の足し算・引き算は意味がない。

11@Python

1を足しているが、反映されていない例

Page 12: VBAで数値計算 06 観測データの処理

EXPの例

expをマクローリン展開した式を以下に示す。xが負の時、各項は正と負が交互に並ぶ。まず、足しては引くを繰り返すので収束が遅い。さらに、絶対値は高次であるほど急速に小さくなるため計算精度が悪化する。xが負の時は、exp(x)を計算して、1/exp(x)を求めるべきである。

12

http://w3e.kanazawa-it.ac.jp/math/category/suuretu/maclaurin/henkan-tex.cgi?target=/math/category/suuretu/maclaurin/maclaurin_ex.html

Page 13: VBAで数値計算 06 観測データの処理

VBA TIPS13

Page 14: VBAで数値計算 06 観測データの処理

VBA TIPS –配列の要素数変更

VBAにおいて、変数を用いて配列の要素数を変更する方法を以下に示す。

14

Function test(b) ‘ 例えば、bは100Dim a() as Double ' 最大インデックスは書かないReDim a(b) ' aの要素数がb+1で初期化される

a(b) = 100 ‘ bまでアクセスできるEnd Sub

@VBA

Page 15: VBAで数値計算 06 観測データの処理

観測データの処理15

Page 16: VBAで数値計算 06 観測データの処理

観測データとは

例えば、ArduinoでAD変換した結果など、センサーを使ったり、アンケートで収集した数値情報のことを観測データという。観測データは、大きく分けて時系列データとそうでないものに分類できる。

16

Page 17: VBAで数値計算 06 観測データの処理

観測データの例

とある実験で得られた電流の観測結果を示す。

Aは観測時刻BはAD変換値Cは平均を0に加工した値Dは移動実効値である。

17

Page 18: VBAで数値計算 06 観測データの処理

観測データの例 グラフ

先のD列と時刻の線付き散布図を描くと以下の図を得る。電流が2段階で変化した様子を見てとれる。

18

Page 19: VBAで数値計算 06 観測データの処理

19

観測データの処理では、列からデータを取得したり、配列を処理することが多々ある。

以降は配列内の値の処理方法に着目する。

Page 20: VBAで数値計算 06 観測データの処理

よく使う操作

最大最小合計平均標準偏差移動平均スケーリング(縮尺を変更する)

20

Page 21: VBAで数値計算 06 観測データの処理

最大

リテラルで宣言された数値に注意しなくてはならない。

21

Function get_max(array_data)max_ = -3000000000# ' negative large enoughFor i = 0 To UBound(array_data)

If max_ < array_data(i) Thenmax_ = array_data(i)

End IfNext iget_max = max_

End Function

Sub test()Const max_index As Integer = 2Dim arr(max_index) As Integer

arr(0) = 10 ' set test dataarr(1) = 15arr(2) = 17

Cells(1, 1) = get_max(arr) ' show valueEnd Sub

*変数名が予約語だった場合は別名に変えて下さい**シングルコーテーションがおかしいかも

@VBA

Page 22: VBAで数値計算 06 観測データの処理

最小

リテラルで宣言された数値に注意しなくてはならない。

22

Function get_min(array_data)min_ = 3000000000# ' very big enoughFor i = 0 To UBound(array_data)

If min_ > array_data(i) Thenmin_ = array_data(i)

End IfNext iget_min = min_

End Function

Sub test()Const max_index As Integer = 2Dim arr(max_index) As Integer

arr(0) = 10 ' set test dataarr(1) = 15arr(2) = 17

Cells(1, 1) = get_min(arr) ' show valueEnd Sub

*変数名が予約語だった場合は別名に変えて下さい**シングルコーテーションがおかしいかも

@VBA

Page 23: VBAで数値計算 06 観測データの処理

合計

23

Function get_total(array_data)total_ = 0For i = 0 To UBound(array_data)

total_ = total_ + array_data(i)Next iget_total = total_

End Function

Sub test()Const size As Integer = 10Dim arr(size) As Integer

arr(0) = 10 ' set test dataarr(1) = 15arr(2) = 17

Cells(1, 1) = get_total(arr) ' show valueEnd Sub

*変数名が予約語だった場合は別名に変えて下さい

@VBA

ここで、UBoundは配列の最大インデックスを返す関数である。

get_total関数は、様々な型の配列に対応するために型の宣言を省略している。ただし、メモリと動作速度は消費する。

Page 24: VBAで数値計算 06 観測データの処理

練習問題24

Page 25: VBAで数値計算 06 観測データの処理

問1 平均

以下のリンクよりデータをダウンロードし、C列の平均を求めるプログラムを作成せよ。ただし、データは全て一旦配列に入れた後に処理すること。

https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%BB%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl=0

25

Page 26: VBAで数値計算 06 観測データの処理

問2 標準偏差

以下のリンクよりデータをダウンロードし、C列の標準偏差を求めるプログラムを作成せよ。ただし、データは全て一旦配列に入れた後に処理すること。

https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%BB%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl=0

26

Page 27: VBAで数値計算 06 観測データの処理

問3 移動平均

以下のリンクよりデータをダウンロードし、C列の移動平均をE列に保存するプログラムを作成せよ。ここで、スライド量は1とし、移動平均に用いるデータ数は50とする。また、移動平均のアルゴリズムは2つ以上考えられるが実装方法は任意である。

https://www.dropbox.com/s/pexwl0ashnwc8oz/%E9%9B%BB%E6%B5%81%E8%A8%88%E6%B8%AC%E5%80%A4.xlsx?dl=0

27

Page 28: VBAで数値計算 06 観測データの処理

その他28

Page 29: VBAで数値計算 06 観測データの処理

参考文献

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

29