macroscope

( はてなダイアリーから移動しました)

大学の授業で数値シミュレーションの初歩をやるためのソフトウェア基盤の弱さ

【この記事は まだ 書きかえることがあります。 どこをいつ書きかえたか、必ずしも示しません。】

- 1 -
わたしが大学の非常勤講師として担当している授業 (地球科学、とくに気候の科学) の中で、数値シミュレーションの演習問題を入れたい。数量が法則にしたがって時間とともに変化するのを計算してみたいのだ。Xという量の現在の値がわかると Xの時間微分 dX/dt が決まるような法則性がある。時刻t = 0でのXの値(初期値)を与えて、時刻Δt, 2Δtと計算を進めていき、結果を時系列として見る。(特殊な場合には微分方程式としてとけるのだが、一般にはとけないので、有限の時間間隔Δtによる差分計算が常道になっている。)

これを学生がパソコン上で実行できるプログラムとして用意したい。どういうプログラム言語で記述するかという問題がある。

- 2 -
1990年代に考えたことは、当時の教材ウェブページに[プログラム言語のはなし(1) 制御構造を中心に] [(2) しっかりした言語と手軽な言語]として書いた。Fortranは、わたしが習熟していた言語であり、1990年代当時、理工系でシミュレーションを専門にする人たちが実際によく使っていた言語だった。今でも気象の分野ではよく使われている。Pascalは、1990年代当時、情報処理入門で使われており、学生が経験している可能性が高かったし、当時わたしも重視していた「構造化プログラミング」の手本がこの言語で書かれていた。C言語は、1990年代当時、いちばん汎用性のあるプログラム言語であり、就職までにプログラミング能力を身につけておくならばこれがよいと考えられた。いずれにしても、プログラム言語の発想としては手順立て型であり(この表現はわたしのもので、当時のプログラム言語に関する学術書では「命令型言語」とされていたが)、計算機が実行すべきことを実行順序も含めて指定することが基本になっている。(わたしはその発想がしみついてしまって、「関数型言語」にはついていけず、「オブジェクト指向言語」も使いこなせず手順立て型のプログラムを書いてしまいがちだ。) そのほかにわたしが熟練した言語は Awk だが、これはデータ加工用の短いプログラムには向いているが、シミュレーション向きではない。

今は、プログラム言語をわたしがえらべるとしても、何にするのがよいかわからない。大学の授業ならば、その教育コースのカリキュラムで、必修か、とらないと損をするという位置づけになっている科目で使っている言語があって、その言語の基礎知識を想定してわたしが応用例を積み上げることができるのならば、そうするのがよさそうだ。しかしそういうカリキュラムになっていないと、えらぶ手がかりがないし、わたしがかってにえらんでも、学生にとってためになるかどうか疑問だ。

- 3 -
実際は、わたしが学生にプログラミングを教えるわけではない。週ひとこまの非常勤講師にその時間はない。わたしがプログラムの例文を作って、まずそのまま動かしてみなさい、それから少し書きかえて動かしてみなさいと言う。書きかえるところは、おもにパラメータ値だ。パラメータという用語の意味は自分の文章のうちでも統一されていないが、ここでは、同じプログラムによるシミュレーションを何度も実行するので、「一回の実行中は定数だが、ある実行と次の実行とでは別の値をとるような数量」がパラメータだ。

パラメータをファイルから読むようにすれば、プログラムは変更しなくてすむのだが、プログラムは、ファイル読みこみ機能を使う手つづきがくわわって複雑になる。それよりも、学生が、短いソースプログラムを見ながら、そのプログラム言語を完全に理解できなくても、変えるところだけは理解して変えるような形が、教材としてはよいと思っている。

大学にパソコン教室があって、そこにはいっている言語のうちにわたしが使えるものがあれば、それを使って例文を用意するようにしてきた。

- 4 -
ところが、A大学では、パソコン教室がなくなってしまった。学生がそれぞれパソコンを持つ時代になったから、それをネット接続することさえできればよいと判断されたらしい。大学でライセンスをとったソフトウェアを、ユーザーIDをもっている学生が自分のパソコンで利用できるしくみもつくられているそうだ。

しかし、非常勤講師としては、それでは困る。大学のライセンスが非常勤講師という立場では使えないことが多い。教材用に大学で持っているパソコンを講師が借りて使うしくみはあるが、授業時間に使えるだけでは準備に困る。

わたしは、大学の教育設備として、おおぜいの学生がいっせいに使えるパソコン教室はなくてもよいが、ひとつのパソコンを複数の学生や教員がいっしょに見る環境は、あるべきだ、と主張したい。非常勤講師のわたしの教材がその大学の教材になるためには、そういう場で動作確認することが必要だと思うのだ。

- 5 -
わたしは、A大学用のプログラム例を、R言語で書くことにした。Rの処理系はフリーで、MS Windows,Mac,Linuxで、ほとんど同じ使いがってで使えるのが、とてもありがたい。

Rは統計ソフトウェアだが、手順だて型プログラミングは可能だし、そのための構文は Kernighan & Plauger のRatfor言語で育ったわたしには見慣れたものが多い (微妙にちがうので、習得に試行錯誤が必要だったが)。

R処理系には作図機能もあるので、計算と同じプログラムのうちでグラフをつくることもできる。Rのグラフ機能は、開発が分岐してしまい、どれも満足がいかないような気がするのだが、ひとまず処理系標準の graphics 機能を使っている。

(実はわたしがRを自分の仕事で使いはじめたのは作図機能からだった。わたしは1980年代から、Tukeyの探索型データ解析の流れをくむ機能がふくまれたS言語処理系を使いたかったのだが、当時は有料の処理系しかなく、代金を工面できなかったり、大学のセンターに入れてもらえても使えるマシンの数がかぎられていたりして、ほぼ互換でフリーのRができるまで、Sを使わないまま来てしまったのだった。)

- 5X -
Rのほかに考えた候補は Ruby だった。スクリプト言語でありながら複雑なプログラムも表現でき、構文が、Awk に慣れているわたしには近づきやすいものだ。また、(間接的には言語作者が日本人であるせいかもしれないが) 日本語圏の同業者(大気・海洋物理の研究者)が使いはじめていたからでもあった。

しかし、なまじ構文が似ているからかもしれないが、R と Rubyに同じ程度に未熟練なわたしが並行して練習しようとすると、記憶がまざってしまって、まちがえやすい。とうぶん、Rに集中することにした。

- 6 -
B大学では、「実験を含む」という趣旨の科目を、実験機器の操作の指導は苦手なので、「数値実験でよいか」と確認をとって引き受けた。授業用と自習用の兼用のパソコン教室があることも確認してのことだった。

行ってみると、パソコン教室はしっかりできている。(わたしにとってなじみやすいのは、OSがWindows 7で、わたしの個人マシンと同じであるせいもあるが。) しかし、Rがはいっていない! B大学のマニュアルによれば、ほぼ同じ仕様の主キャンパスのパソコン教室のマシンにははいっているにもかかわらず、この副キャンパスのマシンにははいっていないのだ。そのほかのプログラミング言語処理系も見あたらない。

副キャンパスの情報リテラシー教育の実習内容は、ほぼ MS Officeの操作らしい。専門科目の演習問題も Excel でやらせている先生もいるらしい。また、(academic discountもあるだろうが) 値段が高いと思われる SPSS がはいっている。統計の実習は SPSS でやっているのだろう。卒業研究などではプログラミング言語を使わせる先生もたぶんいると思うのだが、研究室のマシンを使わせるので、パソコン教室に入れてほしいと希望を出さなかったのだろう。

副キャンパスの教員には共有部分にソフトウェアをインストールする権限はなく、副キャンパスのシステム管理者には共有部分のソフトウェアの変更を決定する権限がなく、主キャンパスにあるシステム運営担当組織の了解をとらなければいけないらしい。

オープンソースソフトウェアであっても、セキュリティの問題はあり、機能が豊富なほどセキュリティホールの心配がふえるから、対策には管理者の労働を投入する必要があり、大学の計算機資源を管理する組織の立場からみれば、インストールしておくソフトウェアを必要最小限にしておきたいのは、わかる。

わたしは R は必要最小限のうちだと主張したいのだが、副キャンパスの専任教員に、自分は使っていないソフトウェアについて、理解してもらって、要望を出すところまで、てまをとってもらうのも気がひける。主キャンパスの教員から、システム運営担当組織へ、「副キャンパスにも需要があるから入れてほしい」と言ってもらえないか、と考えている。

【[2019-03-05 補足、2019-06-06 修正] 次年度も授業を担当することになったのを機会に大学(の教務事務の人)に要請してみたところ、あまり困難なく、Rを入れてもらえることになった。わたしがこれまで消極的すぎたかもしれない。】

- 7 -
Excelがあるということは、VBAによるプログラミングは可能なのだが、わたしはやりたくない。

Basicによる演算の記述は、(N88-BasicなどのマイコンBasicの経験はくりかえしたくないが) MS-DOS時代のQuick Basicを使った記憶はいくらか残っているので、わたしにとってむずかしくはなさそうだ。しかし、入出力の点で、VBAは、独立のプログラム言語処理系とちがうだろう。そこをExcelに依存するのがいやなのだ。

オープンソースのLibreOfficeでも、Basic言語が使われていて、VBAと似ているが、同じではない。この中途半端な互換性不足も、敬遠したくなる要因だ。

- 8 -
(VBAのような中途半端なプログラミング言語処理系機能ではなく) 表計算ソフトウェア本来のワークシートの機能で、時間発展シミュレーションは、できることはできる。セルに計算式を入れておく、その計算式の中から他のセルを参照する、という機能を使うのだ。ワークシートを準備する必要があり、それをプログラミングということはできるが、手順立て言語とはだいぶちがったプログラミングだ。時間ステップごとに同じ計算をくりかえすためには、セルに計算式を入れて、その式をその下の一連のセルにコピーしておくのだ。ちかごろ使っている例をあげておく。

ただし、このやりかたには、いくつも難点がある。

まず、セルに式がはいっていても計算結果の数値が表示される。これは便利である反面、式がはいっているのか数値がはいっているのか、そのセルにカーソルを持っていって内容を見ないとわからない、という欠点でもある。うっかり数値で上書きしてしまうと、意図したシミュレーションのプログラムでなくなるが、それに気がつかないおそれがあるのだ。

また、ひとつ前の時間ステップの値を参照するにはセルの「相対参照」を使うが、パラメータ値のはいったセルを参照するには「絶対参照」を使う。このどちらを使っているかも、まちがえやすくできている。

そして、(わたしはそうならないように注意して書いているが) もしセル間で双方向に依存するような式を書いてしまうと、計算結果が不確定になる(セルの値を決めていく順序に依存してしまう。)

だから、表計算によるシミュレーションは勧めたくない。

- 9 -
B大学のパソコン教室のマニュアルには書いてないのだが、そこのマシンには、Pythonがはいっている。ただしライブラリが最小限だ。Pythonによる数値計算の教科書的な 本(のひとつ)で使っていたライブラリのうちでは、math はあるが、numpy も matplotlib もない。そして、わたしの権限ではライブラリを追加できない。これでは、グラフ作図つきにはできないが、数値を数字で書き出すまでならばなんとかできそうだ。Rで書いたプログラム例を、グラフ作図をはずして、Pythonになおしてみている。

【[2019-06-06 補足] 2019年3月、6節補足で述べたRの件といっしょに大学(の教務事務の人)に要請してみたところ、Pythonのライブラリも入れてもらえることになった。ところが、流通しているライブラリが、いまはいっているPython本体のバージョンでは動かないそうで、Python本体を更新する機会まで待たなければならなくなった。したがって、わたしの2019年度の教材はPythonでなくRでつくることにした。】

- 10 -
わたしがやりたいシミュレーションの実習は、計算だけでなく、結果の数値をグラフにしてみることを含む。

Rだとそこまで一気にいくことも可能ではあるが、Rの場合も含めて一般に、数値をファイルに書き出して、あらためて別のプログラムでグラフにすることのほうを基本動作として教えたほうがよいと思う。

【[2019-10-02 補足] わたしは上のような意見をもっているのだが、まだ、R でのファイル読み書きには熟練できておらず、教材の例文は計算結果をグラフにして終わりというものが多くなってしまっている。】

- 10a -
表計算ソフトウェアにもグラフ作成機能があるから、ひとまずは、それでもよいと思う。

これまでに表計算ソフトウェアのグラフ機能についてわたしが感じた不満は次のようなものだが、もしかするとすでに改善されているかもしれない。

  • 一方の軸上のデータ位置を等間隔としたグラフならば多様な機能があるのだが、両方の軸上のデータ位置を変数であたえる機能は貧弱だ。
  • 画面上の軸の位置や注記文字の位置・大きさなどを、ソフトウェアの側で決めてくれるのはよいのだが、それに不満があるとき微調整がむずかしい。
  • 数量をゆがめて伝えることで悪名高い いわゆる「3Dグラフ」が簡単に使えるようになっている。

- 10b -
わたしが使えるプログラム言語処理系から、基本作図機能(点をうつ、線をひく、多角形領域を塗る)が呼び出せるようになっていれば、わたしは数量をグラフ表示するプログラムをつくることができる。1990年代にはそういう教材づくりに時間をかけてきた。

またやれる能力は残っていると思うけれど、どのプログラム言語でやるかが さだまらないので、はじめられないでいる。

- 11 -
シミュレーションの実習に必要な機能とは別の話題になるが....
図形を画面に表示したりプリンターに出したりする「図形出力」にくらべて、計算機の外の世界にある図形を計算機上で使えるデータにする「図形入力」に関するプログラムを書くための支援はとぼしい。

かつては図形入力専用の「ディジタイザ」などのハードウェアがつくられたが、今では、紙の図形をスキャナで画像(ラスター)情報として読みこむところまではあたりまえになってきた。ディジタルカメラでとった写真もラスター情報だ。

そこで、一般ユーザーにとって必要なのは、画面に表示された画像のうちでの位置を画面上で指定する機能だと思う。(それを画面上でペンで指定するか、離れたところにあるマウスによって画面上のカーソルを動かして指定するか、という作業のてまの問題もあるが。)

プログラム言語入門のレベルで、画面上の位置を読み取る手続きが書いてあるのは、10年くらいまえに本をあさったときの知識だが、JavaとJS言語(JavaScriptといわれてきたがJavaではない)とProcessing ぐらいだった (そしてProcessing処理系はJava処理系に依存していた)。わたしはその言語のいずれにも慣れることができておらず(RとRubyを優先した結果だが)、位置入力機能を含むプログラムを自作することができていない。

この点も、プログラム言語の選択で悩むところだ。