わんくま同盟 熊本勉強会 #04 VBAとPythonで始める数値計算教育 ver. 0.999 2017-03-18 14:40-15:30 森下
わんくま同盟 熊本勉強会 #04
自己紹介属性
• 熊本高専建築社会デザイン工学科助教
• 専門は衛星測位や電子回路
• センサーでデータ集めたり
• 機械学習歴6年ほど
• 言語
– Python, C/C++, C#, VB, VB.NET, 後はかじった位
2
わんくま同盟 熊本勉強会 #04
背景熊本高専建築社会デザイン工学科では、4年次に数値計算を学びます
数値計算・・・数値微分とか、数値積分とか、ニュートン法とか、掃き出し法とか。工学的な問題を計算機で解くために必要な技術。
①𝑥"の初期値𝑥#更新値𝑥$
②𝑓 𝑥# を計算
③𝑥#における接線の傾き(微分値)を求める
④接線とy = 0の交点の𝑥座標で𝑥"を更新
⑤以下、解が収束するまで繰り返す
O𝑥
𝑦
図 ↑ニュートン法
わんくま同盟 熊本勉強会 #04
使用言語を何にするか・・・?
私「Pythonを使いたいと思うんですがどうでしょうか?」
同僚「現場はExcelだからね〜。VBAでしょ。」
私「わかりました。ちょっとやってみます。」
わんくま同盟 熊本勉強会 #04
VBA• Microsoft Office用マクロ言語
• MacのVBA開発画面は超貧弱
• WinではOKでもMacではエラーとなったり
Macではエラーになる例 左の修正例
開発環境@Mac
わんくま同盟 熊本勉強会 #04
数値計算そのものをVBAででやっている現場はないと思う。そもそも、VBAで業務用のマクロを組むだけなら、1000円で本を買ってくればなんとかなる。
それでも教育現場でVBAというのは、モダンな言語を扱える教員が少ないということに原因が在ると思う。
「VBは習得が簡単な言語である」という神話もある*。ちなみに、C言語は低学年でやるが死屍累々らしい。
どうしてこうなった!?
*うちの学校だけだったらスミマセンw
わんくま同盟 熊本勉強会 #04
設定した受講生のゴール
到達目標理想的な到達レベル
の目安(優)標準的な到達レベル
の目安(良)未到達レベルの目安(不可)
Excelのマクロを
記述し、実行できる。
例えば成績表において赤点者のチェックができるなど、繰り返しと関数を含む処理を実装できる。
セルの値を読み込み、その値を用いた四則演算の結果をセルに表示できる。
いかなるマクロも書けない。
数値微分・積分について理解し、利用できる。
任意の関数について、微分と積分の推定値を求めることができる。
微分および積分の数値計算方法について説明でき、プログラムで表現できる。
微分および積分の数値計算方法について説明できない。
連立方程式を解くプログラムを作成し、利用できる。
掃き出し法をプログラムで表現でき、任意の問題を解くことができる。
掃き出し法を説明できる。 掃き出し法を説明できない。
わんくま同盟 熊本勉強会 #04
出題例
引数で渡された配列の平均値を返す関数を実装せよ。
ここで、引数に渡される配列は「Dim a(リテラル) as Double」の様にして宣言されているものとする。
Function get_mean(arr)'ここに解答する。
End Function
わんくま同盟 熊本勉強会 #04
解答例
Function get_mean(arr)total_ = 0For i = 0 To UBound(arr)
total_ = total_ + arr(i)Next iget_mean = total_ / (UBound(arr) + 1)
End Function
わんくま同盟 熊本勉強会 #04
方法1 VBAで関数を呼出&Sheetをチェック
• 学生の書いた関数を呼び出し、返り値を評価したい
• 他のブックから呼び出すことはできるが、Sheetに記述された関数からは返り値が返ってこない
• そこで、ワークシートに出力させて、それを確認
Excel VBA codeon 学生作成ブック
Excel VBA codeon 評価用ブック
Sheet
Function hoge()
Sheet
Function test()ワークシート
①
②③
④
わんくま同盟 熊本勉強会 #04
方法2 VBAで関数を呼出&学生はModule内に記述
• 学生には標準Module内に解答してもらう
• 外部からの呼び出しに返り値が返る
• ・・・だが、学生の作った関数はライブラリではない
• Moduleの使い方を間違えている
Module
Function hoge()
Sheet
Function test()
Excel VBA codeon 学生作成ブック
Excel VBA codeon 評価用ブック
①
②
わんくま同盟 熊本勉強会 #04
方法3 Pythonで関数を呼出&学生はSheet内に記述
• 学生にはSheet内に解答してもらう
• Pythonから呼び出すと、返り値が返ってくる
• ・・・これで良い気がする
Sheet
Function hoge()
Python
Function test()
Excel VBA codeon 学生作成ブック
Python code
①
②
わんくま同盟 熊本勉強会 #04
PythonとVBA間で渡せるデータ型• PythonからVBAへ渡す引数
– str, int, floatとこれらを格納したlistを渡せることを確認
– numpyのndarrayやnumpyが定義する変数型は渡せない
– intの値がint32の範囲を超えた場合は未確認
• VBAからPythonへ返される返り値
– String, Double, Integerとこれらを格納した配列はOK– Array型オブジェクトは渡せなかった
わんくま同盟 熊本勉強会 #04
最終形態
Sheet
Function hoge()
Python
Function test()
Excel VBA codeon 学生作成ブック
Python code
①
②
Sheet
Function hoge()
Excel VBA codeon 教員作成ブック
③
④
双方の解の一致を確認する
わんくま同盟 熊本勉強会 #04
課題• 個々人の計算条件により、模範解答と解答が一致しない
– アルゴリズム
– 微分や積分に使う微小幅
– 解の収束条件
– 初期条件
• 文法・論理上のエラーはないが、実用的な計算速度でない
• 見かけ上の誤差小への対応– 特定の変数範囲では相対的な誤差が小さいこともある
• 模範解答と学生の解答とで返り値の型が異なる場合がある– 正解は”解なし”なのに数値を返してきたとか
わんくま同盟 熊本勉強会 #04
対策• 初期条件
– 問題文に明示
• 実用的な計算時間でない
– 動かないのだから、不可
• 見かけ上誤差小
– 問題文に変数範囲を明示するのが妥当
– その上で、複数回関数を呼び出して、確認する
• 型が異なる
– 「解なしの場合は”解なし”を返す」など、予め定めておく
– 型が異なる場合は、不可とする
わんくま同盟 熊本勉強会 #04
行きついた評価プログラム
Download:https://gist.github.com/KatsuhiroMorishita/ffa12a1b0791d35f49632596862610a3
わんくま同盟 熊本勉強会 #04
注意• Excelが開いたままになったりするので、採点作業後
は再起動が必要になる・・・orz– 採点プログラムが悪かったかな?
• 学生40人分もあると、プログラムは絶対にクラッシュするので、Python側はtry構文が必須
• タイムアウト処理も必要
わんくま同盟 熊本勉強会 #04
エラーメッセージと原因• 'パラメーターの数が無効です。’
– 引数の数が一致しない。呼び出される関数側で引数の数が少ないと出る。渡す引数が多いと出る。
• unsupported operand type(s) for / 'NoneType' and 'float'– 返り値がなかったなどして演算エラー
• 'パラメーターはオプションではありません。’– 呼び出される関数側の引数の数が多かった。渡す引数の数が少なかった。
• <unknown>.関数名– 関数が存在しなかった。
• math domain error– 宣言されていない変数が使われるなど
• 'アプリケーション定義のエラーです。’– 文法エラー。変数の2重宣言や単独のEnd Subなど。また、関数内でCells()を使ってい
るとたまにエラーになる。なんでやねん。
• スタックなんちゃら– 再帰構造によるスタックオーバーフロー
わんくま同盟 熊本勉強会 #04
まとめ• 数値計算をVBAを使って教えてみました
• ライブラリが存在しないので、フルスクラッチ
• VBAのテキトウなエラーメッセージが最低
• ベクトルの計算あたりから、脱落者が続出
– 関数が3つ以上・行数10行以上で危ないようだ
– データ構造の理解が課題
• 関数を使って計算を続けることと、引数と返り値のデータ構造を一般化しておくことが重要であることは伝わったと思う
• 問題に合わせた採点は大変だった
わんくま同盟 熊本勉強会 #04
専攻科の学生(大学のB3に相当)から「VBAで2ヶ月か
かって作り続けているのだが、デバッグできない。デバッグして欲しい。」という相談を受け、30分考えたが全く分からなかったので2時間でPythonに書き換えた上で機能的にグレードアップした。
結局はオブジェクト内部で使っている変数が独立しておらず、他のオブジェクト内の処理により変更されていたのが直接の原因だったのだが、そんなのVBAでデバッグするのは大変だ・・・。
これにより、更に強くPythonにしようと決心したのでしたw
わんくま同盟 熊本勉強会 #04
PyCon mini Kumamotoをヨロシク!!
https://pycon-mini-kumamoto.connpass.com/event/45063/
39
わんくま同盟 熊本勉強会 #04
PyCon mini Kumamoto プログラム
時間 大ホール 教室
9:30 - 10:00 受付 –
10:00 - 10:15 オープニング –
10:15 - 11:00 キーノートIan Lewis
–
11:10 - 11:40 まだ見ぬバグゼロという未来(初級)新井 正貴
kivyの利便性や有用性(初級)齋藤 大輔
11:40 - 12:10 PythonとBI基盤ではじめるPyData入門〜福岡ソフトバンクホークスを添えて(初級)Shinichi Nakagawa(野球の人)
DjangoのDB migrationがどういうしくみで動いているか(初級)野中 哲
12:20 - 13:50 ランチディスカッション
14:00 - 14:30 すぐ始められる、Pythonの環境構築(初級)寺田 学
ボイスインターフェースの現状(仮)と、pythonを使ったフレームワーク(flask)でAmazon Echoがレスポンスを返すまで。堀田 直孝
14:40 - 15:10 Pythonでできる数理最適化(仮)(中級)岩永 二郎
Pythonistaの使いかたjbking
15:20 - 15:50 科学技術計算用言語としてのPython&Webアプリ作ろう(中級)矢野 高宏
データ分析現場におけるPython活用事例の紹介真嘉比 愛
15:50 - 16:00 記念撮影 –
16:00 - 16:30 クロージングLT 1枠5分x5枠。当日、受付にて募集 –
16:30 - 16:45 クロージング –
40
わんくま同盟 熊本勉強会 #04
参考リンク• VBAによる数値計算解説スライド(1-10)
– https://www.slideshare.net/katsuhiromorishita/vba-01-71493565
• VBAによるニュートン法実装例– https://gist.github.com/KatsuhiroMorishita/54fee36290911d7c225
7ffe467efed04
• VBAによるベクトル演算関数群実装例– https://gist.github.com/KatsuhiroMorishita/16a2da253a8afbf60ec8
3a721309dcac
• VBAによる行列計算関数群実装例– https://gist.github.com/KatsuhiroMorishita/16578b870d705731a88
94222a486f065
わんくま同盟 熊本勉強会 #04
PythonからVBAを呼び出すときの参考サイト
• http://stackoverflow.com/questions/15897371/how-to-call-vba-sub-from-python#
• http://stackoverflow.com/questions/14732340/how-to-call-excel-vba-functions-and-subs-using-python-win32com#
• https://sites.google.com/site/pythoncasestudy/home/pywin32kara-comwo-tsuka-tsu-te-excelwo-sousa-suru-houhou