事例377
帰納的定義を意識した数式モデルの指導とプログラミング
東京都立国立高校 小原格先生

今回は、「帰納的定義を意識した数式モデルの指導とプログラミング」という題材で、お話しします。
本日の内容です。「アルゴリズムとプログラム」では、「モデル化とシミュレーション」を行っています。
今回は、この中の「数式モデル」についてご紹介します。「アルゴリズムとブログラム」の他の部分については、昨年度の情報部会でもご紹介しましたので、ご興味のある方は、そちらも併せてご覧いただければと思います(※1)。
※1 https://www.wakuwaku-catch.net/jirei24322/

まず「数式モデルのシミュレーション」の展開です。
初めに簡単にシミュレーションの意義や内容を説明した後に、シミュレーションの例として、Webサイトにある家や間取りのデザインや、フライトシミュレーター、自動車の衝突実験などをもとに説明をして、「シミュレーションが適するケース」の利点をまとめてから、実際のシミュレーションに入っていきます。


数式モデルは難しい? ことはない
数式モデルというと、生徒達もなかなか難しいと捉えがちなので、実はそんなことないんだよ、ということを話します。例えば、小学校から扱ってきた数式では、移動した道のりは、(速さ)×(時間)で、実際に行かなくても計算でわかります。また、単価と個数があれば、実際に買わなくても支払う金額がわかります。つまり、実は今までも数式モデルというのはいっぱい出てきているんだよ、という話をしながら、今回はPythonとExcelを両方用いてシミュレーションをやってみましょう、と持ちかけます。

数式モデルを立てる意味を伝えるために、数学の考え方をもとに丁寧に説明する
「情報Ⅰ」の前の「情報の科学」のときは、ここからいきなり人口モデルのシミュレーションをやってみよう、という形で進めていました。

この単元では、数式モデルを立てることがポイントになりますが、生徒達はどうしても表計算ソフトの操作をすることが中心になってしまって、数式モデルの重要性や有用性が、今ひとつ理解しづらいのではないか、いう課題意識がありました。
※クリックすると拡大します
そこで、「情報Ⅰ」になってからは、あえて数学との連携も考えて、「数学だとこんなような形で物事を考えるよね」というところから入ることにしました。
例えば、「1、4、7、10、13、16…」という数の並びでは、3ずつ増えているから、その数に3を足せば次の数になるね、という前後の変化がわかります。
数学では、これをもとにしてn番目の数、つまり一般項を求めます。ただ、これは2年生で学ぶ数学Bの、数列の漸化式の考え方なので、やはり1年生では少し難しいかなと感じています。
そのため、あえてこの辺りを丁寧に説明します。
「数学の場合は、これがいきなり20番目とか100番目の数というと難しいので一般的な式を求めるけど、プログラミングの場合は、コンピュータの圧倒的な計算力で簡単にできてしまうので、こんなことできるんだよ」と、数学の違いを取り立てて意識させるようにしています。

そこで使うのが帰納的定義、つまり自分と前後の関係を元に処理することです。前後の関係の式は比較的簡単に立てられますが、1から順に当てはめていくので、計算量が膨大になります。
しかし、逆にコンピュータプログラミングは、計算が圧倒的に速くて得意なので、帰納的定義を使って、どんどん計算させた方が早いんだよ、ということを説明します。

連番を振る数式モデルから、Pythonのありがたみを理解する
その例としてよく使うのが、1、2、3、4、5という連番を振る数式です。
この場合は、1つ上のセルの数に1を足せば連番が振れます。つまり、Excelの「(1個上のセルの数)+1」の式を下のセルにコピーすれば、相対参照で、そのまま数式モデルが立ちます。
この数式モデルをだーっと下に引っ張ってコピーすれば、ドミノ倒し方式で値が決まっていくことを、ここでしっかり理解してもらいます。
これがPythonであれば、「n=n+1」という式で、自分自身をどんどん上書きしていき、次の値は自分に1を足したものである、という説明となります。「繰り返し」の恩恵でこのように決まっていくんだよ、ということを指導しやすくなり、非常に相乗効果があると感じています。
※クリックすると拡大します
1からその数までの総和の場合は…
2つ目の例が足し算です。
1からある数までの和を求めるという問題です。
知っている人は、絶対参照とSUM関数を使えば簡単にできますが、あえてここでは数式モデルを作ります。1個上のセルは1つ前の数までの和になっているので、この1個前までの和に自分自身を足せば、その数までの和になるね、ということで、「(1個上の値)+(1個左の値)」という式を立てるわけです。
この式をだーっと下方向に引っ張ってコピーすれば、相対参照で計算ができるわけです。
これをPythonでやると、「繰り返し」と「i」を使いながら、自分自身を変数として活用しながら、その数までの和を出していくという形になり、指導の上で非常に相性がよいです。
※クリックすると拡大します
フィボナッチ数列もやってみる
3つ目の例は、直近の上2つのセルの値を足したものが、そのセルの値になる、というものです。
これは数学で言う「フィボナッチ数列」です。数学をやっていらっしゃる方はご承知と思いますが、この式の一般項を求めるのは、隣接3項間漸化式で、非常に大変です。生徒には、「コンピュータでは、面倒ことをしなくても、ただ足せばいい、という形で済んでしまうんだよ」という恩恵を説明しています。
さらに、このフィボナッチ数列は、「配列」と非常に相性がよいです。配列の要素として初期値を2つ入れ、3つ目の要素を、この2つを足したものとして付け加えます。その後、同様に前の2つを足したものをどんどん付け加えることを繰り返していくという、たった4行の式でフィボナッチ数列ができてしまい、非常に簡単なのですね。
※クリックすると拡大します
「下方向にコピーする」ことの意味を理解した上で、様々なシミュレーションをやってみる
このように、帰納的定義を活用する方法を事前準備として行った後に、先ほどの人口増加のシミュレーションをやります。そうすると、先ほどの式を下にだーっとコピーする意味が生きてきます。
※クリックすると拡大します
次に利息のシミュレーションをやってみます。ここでの元金と利息の合計というのは、まさに先ほどの、「(1個上のセルの値)+(1個左のセルの値)」の考え方にあたります。
※クリックすると拡大します
確率的シミュレーションでは、円周率を求めるモンテカルロ法を行っています。
表計算ソフトはでは、だーっとコピーするのがけっこう大変ですが、Pythonであれば、100だろうが100万だろうが、数字を1つ変えればよいからラクだよね、ということで、プログラミングの利点も合わせて説明しています。
※クリックすると拡大します
せっかく帰納的定義をやったので、今回は待ち行列にも挑戦してみました。最初はこのスライドのように、手作業で表を埋めて、その後数式モデルを作ります。
※クリックすると拡大します
これも前後の関係で数式モデルを作って、配列としてどんどん付け加えていくと、待ち時間がだーっと表示されます。
また、間隔と診療時間のところに乱数を持ってくることによって、待ち行列をシミュレーションすることもできるんだよ、ということを行いました。
ただ、これについてはチームで取り組んだのですが、さすがに解決するのが大変で、振り返りでは「非常に難しかった」と答える人が多かったです。
※クリックすると拡大します
今回の内容のまとめです。生徒がなぜできていないか、ということを考えると、実は単に難しいというだけでなく、その理解に必要な内容をまだ習ってないということも考えられますし、抽象的な内容の理解がまだ十分に追いついていないという発達段階の問題もあると思います。
それを指導する上では、思考の壁を乗り越えやすい教材や説明が必要になります。今回の場合で言えば、シミュレーションの本題に入る前に、丁寧にステップを踏んで指導したり、できるだけ難しい言葉を使わないといった工夫が求められると思います。
また、題材はできるだけ身近なものがよいと思っています。これは、もちろん知的好奇心ということもありますが、共通テストでは「身近な問題解決」が意識された問題が出題されるようですから、共通テストに向けても、このような形でのシミュレーションが生かせたらなと考えています。

参考文献は、こちらです。こちらもぜひ参考になさってください。

神奈川県情報部会実践事例報告会2024オンライン オンデマンド発表より