Upload
katsuhiro-morishita
View
112
Download
1
Embed Size (px)
Citation preview
2017-01更新 熊本高専森下功啓
VBAで数値計算06
本資料の目次
プログラムの良さの指標型と精度を意識した計算VBA TIPS観測データの処理練習問題その他
2
VBAの配列について学びます
プログラムの良さの指標 数値計算的に
3
良いプログラムとは
4
動かないプログラム動くプログラム >>
動くと言っても、レベルは色々ある。。。
5
文法エラーがない
必要な処理速度が出る
論理的に正しい
*上は下を満たすこと処理速度が遅すぎる
一定の条件下で必要な精度が保証された結果を出力する
良い
読みやすいコード量が少ない
転用と拡張がしやすい
論理的に正しいプログラムを書くには?論理的に正しいプログラムを書くには、「論理的に間違っていることを確認できる」ことが大前提です。
プログラムがどの様に振舞えば「バグがある」と言えるか考える必要があります。
6
プログラムを良くするには?
次の事柄を試しましょう。実行して、動くこと単純なケースでの計算結果が正しいこと
あとは、沢山プログラムを書いて練習あるのみです。英語と同じです。練習しなければ身につきません。
7
型と精度を意識した計算8
変数は実数ではない
変数は数学でいう実数ではない。有限の値しか取れないし、離散的で、浮動小数点型の分解能は状況によって変わる。これを考慮しなければ複雑な数値計算はできない。
9
桁あふれ(オーバーフロー)
VBAの整数は有限の桁数しか表現できない。例えば、integer型であれば-32,768~32,767の範囲である。プログラマは、プログラムが利用する数値の範囲を意識しなくてはならない。
10
大に小を足すと精度が悪化しやすい
浮動小数点は「符号」,「仮数」,「指数」で表現される。64bitで浮動小数点を表現する場合、桁数が17桁以上異なる数値の足し算・引き算は意味がない。
11@Python
1を足しているが、反映されていない例
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
VBA TIPS13
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
観測データの処理15
観測データとは
例えば、ArduinoでAD変換した結果など、センサーを使ったり、アンケートで収集した数値情報のことを観測データという。観測データは、大きく分けて時系列データとそうでないものに分類できる。
16
観測データの例
とある実験で得られた電流の観測結果を示す。
Aは観測時刻BはAD変換値Cは平均を0に加工した値Dは移動実効値である。
17
観測データの例 グラフ
先のD列と時刻の線付き散布図を描くと以下の図を得る。電流が2段階で変化した様子を見てとれる。
18
19
観測データの処理では、列からデータを取得したり、配列を処理することが多々ある。
以降は配列内の値の処理方法に着目する。
よく使う操作
最大最小合計平均標準偏差移動平均スケーリング(縮尺を変更する)
20
最大
リテラルで宣言された数値に注意しなくてはならない。
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
最小
リテラルで宣言された数値に注意しなくてはならない。
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
合計
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関数は、様々な型の配列に対応するために型の宣言を省略している。ただし、メモリと動作速度は消費する。
練習問題24
問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
問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
問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
その他28
参考文献
SAK Streets - VB 開発言語資料 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。
29