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

VBAで数値計算 02 数式の関数をプログラムの関数で実装

Embed Size (px)

Citation preview

Page 1: VBAで数値計算 02 数式の関数をプログラムの関数で実装

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

VBAで数値計算02

Page 2: VBAで数値計算 02 数式の関数をプログラムの関数で実装

本資料の目次

数学の関数をプログラムの関数に変換する課題その他

2

Page 3: VBAで数値計算 02 数式の関数をプログラムの関数で実装

数学の関数をプログラムの関数に変換する

3

Page 4: VBAで数値計算 02 数式の関数をプログラムの関数で実装

関数

関数を使うことで、繰り返し使える処理を作成できる関数は処理に名前をつけて、再利用ができる

4

*3回’Hello World’を表示するために関数を用いた例@javascript

*javascript勉強会@未来会議室より引用

Page 5: VBAで数値計算 02 数式の関数をプログラムの関数で実装

数値計算における関数

数値計算における関数は、変数を指定すると答えが返ってくるイメージです。

5

関数入力データ 出力データ

関数を入力データから出力データを作るマシンと捉える

関数x y

Page 6: VBAで数値計算 02 数式の関数をプログラムの関数で実装

VBAによる数値計算用関数のパターンVBAで変数xを渡して、yを得るプログラムを考えましょう。例えば、y = 2x + 3を求める関数の例を示します。引数にxを取り、yを求めてそれを返しています。ポイント 返り値があるので、Functionを使う。 数学の四則演算の記号とVBAの演算子は少し異なる。

6

結果

サンプルコード

test3を実行

@VBA

Page 7: VBAで数値計算 02 数式の関数をプログラムの関数で実装

関数の構造

関数には書式や決まり事が有ります。詳しく見てみましょう。

7

返り値の有る関数であることを表す

関数名名前は任意

引数ByValは値渡しを表す

型を伴う変数宣言

返り値は、「関数名 = 値」で指定する。

返り値の型宣言関数のスコープ

@VBA

Page 8: VBAで数値計算 02 数式の関数をプログラムの関数で実装

計算に必要な変数が2つ以上のときz = 2x + 5y + c上記の式において、zを計算するにはx, y, cという3つの変数が必要です。こういうときは、単純に引数を増やしましょう。

8

*引数が増えると長くなるが、、、仕方ない。 @VBA

Page 9: VBAで数値計算 02 数式の関数をプログラムの関数で実装

値渡しと参照渡し

値渡しとは、引数として渡した変数の値が別の変数にコピーされて利用される方法です。また、参照渡しとは、渡された変数に直接アクセスする方法です。C言語のポインタ渡しみたいなものです。VBAでは、デフォルトでは参照渡しとなります。

9

引数xに5を代入して、渡した側でxが変わる

か検査した。

結果

xが5に変化したので、参照渡しと分かる。

参照渡しの副作用に注意!

@VBA

Page 10: VBAで数値計算 02 数式の関数をプログラムの関数で実装

(参考)参照渡しの挙動

VBAにおける参照渡しについて調べるため、実験用のコードを作りました。関数math_func_test5呼出し後、変数aやbに数値を代入しても、もう一方に影響していません。参照渡しで渡された先で同じく参照渡しで渡された変数が代入されても値が代入されるにすぎないことが分かります。

10

結果

@VBA

Page 11: VBAで数値計算 02 数式の関数をプログラムの関数で実装

返り値を2つ以上欲しいとき

例えば複素共役を計算するなど、引数も複数で返り値も複数にしたい事が有ります。VBAでは、複数の参照渡しの変数を利用し計算結果を取得します。

11

結果

@VBA

Page 12: VBAで数値計算 02 数式の関数をプログラムの関数で実装

SIN, COS, EXPなどの利用

実装が面倒で処理速度が求められる数学的な関数は標準で実装されています。

12*参考文献:http://www.jp-ia.com/_ans/excelvbafun.html

結果

@VBA

Page 13: VBAで数値計算 02 数式の関数をプログラムの関数で実装

練習問題13

Page 14: VBAで数値計算 02 数式の関数をプログラムの関数で実装

問1 2次関数

y = ax2 + bx + c(1) x, a, b, cの4つの変数を与えると、上記の式に従ってyを返す関数を実装せよ。(2) a, b, cを0以外に設定し、xを1から100までステップ1で計算した結果をA列に保存せよ。

14

Page 15: VBAで数値計算 02 数式の関数をプログラムの関数で実装

問2 非連続関数

(1) 以下のグラフに示す関数を実装せよ。定義域に留意のこと。(2) xを0から1.0までステップ0.01で変化させて計算したyをB列に保存せよ。

15Ox

yP(0.65, 1.0)

1.0

Page 16: VBAで数値計算 02 数式の関数をプログラムの関数で実装

問3 ベクトルの計算

斜め上方へ投射された物体は放物線を描いて落下する。軌跡の長さが数十メートル程度であれば、地球の自転の影響などを考えずに済む。ここで、空気抵抗や地球の自転の影響を無視した上で、UTM座標系における物体の座標と速度ベクトルを求めたい。初速が250 m/sで仰角68.9°で打ち出された質量17.4 kgの物体の、落下までの座標と速度ベクトルを求めよ。時間ステップは0.05秒とする。保存先は時刻をC, 水平座標をD, 鉛直座標をE, 水平方向の速度ベクトルをF列, 鉛直方向の速度ベクトルをG列とする。また、鉛直上向きを正とする。

16

Page 17: VBAで数値計算 02 数式の関数をプログラムの関数で実装

問4 EXPの実装

exp(x)はexを表す関数で、VBAでは既に実装されていますが、これをマクローリン展開を用いて実装してみましょう。その上で、VBAのExp関数と自作の関数の差を評価するとGood。保存先はH列以降とする。列の意味が分かるように適宜タイトルをつけること。

17*exp()の応用として、シグモイド関数の計算などがある。

http://mathtrain.jp/maclaurin

Page 18: VBAで数値計算 02 数式の関数をプログラムの関数で実装

その他18

Page 19: VBAで数値計算 02 数式の関数をプログラムの関数で実装

参考文献

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

19