2020-05-10_hw オンライン プログラミング勉強会

この記事は5分で読めます

このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.

中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!


2020-05-10 課題

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 曲線を線分で近似できる気分を自分なりに説明してみてください。
    • 手書きで絵を描くだけでも構いません。
    • 一定のルールにしたがって描かれた曲線を適当な近似的ルールで描くのがプログラミングで描く曲線です。
  • 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
    • 公式サンプル
    • これも公式:サンプルコードもある。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
  • 引き続きプログラムをいろいろいじってみましょう. 例えば次のような方針があります. コンテンツからのコピペで構いません. 適切にコピペして動かすだけでも割と大変なので.
    • (numpy を使って) いろいろな関数のグラフを描いてみましょう.
    • (sympy を使って) いろいろな連立方程式を解いてみましょう. グラフを描くのもおすすめです.
    • いろいろな微分方程式を解いてみましょう. 実際にコンテンツでも紹介しているように, 分点を自分でも変えていじってみるとのが第一歩です.

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

オブジェクトについて

今日は具体的なプログラムというより、今日のメインの話とも少し関係する形でオブジェクトについて少し眺める機会にする。

  • オブジェクト指向のオブジェクトの話ではない。
  • 必ずしもいつもかっちりした定義のもとに議論されているわけでもない。
  • 各プログラミング言語ごとの用語の事情もある。

第一級のオブジェクト

第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。

問題になる例:言語によっては関数が第一級のオブジェクトになる。(最近の言語は割とこの傾向があるように思う。)
関数が第一級のオブジェクトの言語では「関数の関数」みたいな概念が考えられる。
高階関数と呼ばれる。

「関数の関数」として python の map を紹介しておく。

# リスト `lst1` の要素を二倍する
lst1 = [1, 2, 3, 4]
lst2 = []
for a in lst1:
    lst2.append(a*2)
print(lst2)
[2, 4, 6, 8]
# 次のように map で書ける
def prod2(a):
    return a*2

lst1 = [1, 2, 3, 4]
lst2 = list(map(prod2, lst1)) # map はイテレーターを返すので list() でリスト化する
print(lst2)
[2, 4, 6, 8]
# 参考:ラムダ式
lst1 = [1,2,3,4]
lst2 = list(map(lambda x: x*2, lst1))
print(lst2)
[2, 4, 6, 8]
# 参考:リスト内法表記
lst1 = [1,2,3,4]
lst2 = [a*2 for a in lst1]
print(lst2)
[2, 4, 6, 8]
lst1 = [1,2,3,4]
lst2 = []

lst3 = [1,2,3,4]
for a in lst3:
    lst2.append(a*2)
print(lst2)
[2, 4, 6, 8]
lst1 = [1,2,3,4]
lst2 = []

lst3 = [1,2,3,4]

for a in lst3:
    lst2.append(a*2)
    print("")
    print("")

print(lst2)
  File "<ipython-input-9-2e52d339fe66>", line 6
    lst2.append(a*2)
       ^
IndentationError: expected an indented block

なぜ(Python で)map の返り値がイテレーターか

  • 巨大なリストを処理する場合、リストが返るとメモリを大量に消費するから。
  • この手の話をきちんと考えるにはコンピューターアーキテクチャなり、データ構造なり、プログラミング言語に関する諸々の知識がいる(のでその辺のプログラミング言語入門みたいな本ではふつう出てこない)。
  • この手の「入門」は大学の情報科学系の入門書にはきちんと書いてある。

オブジェクトとインスタンス

オブジェクト

だいたい次のような性質を持っています。

  • 何らかの型がある。
  • 変数に代入できる。
  • 関数(メソッド)の引数にできる。
  • 関数(メソッド)の戻り値にできる。
  • それ自体が式であり、任意の式の一部になる。

インスタンス

これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。

import matplotlib.pyplot as plt
fig = plt.figure()
# a = A.new()

関数とメソッド

言語によっていろいろありはする。

  • サブルーチン
    • 関数、手続き
    • 何らかの処理をまとめたモノ
    • 数学の関数とは必ずしも関係ない
  • メソッド:メソッド (method) あるいは メンバー関数 (-かんすう, member function) とはオブジェクト指向プログラミング言語において、あるクラスないしインスタンスに所属するサブルーチンを指す。

第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。

# 値を返す「関数」
def f():
    return 1

# 値を返さない「関数」
def g():
    print(1)
g()
1
class TestClass:
    x = "変数1"

    def __init__(self, y):
        self.y = y

    def test_method1(self):
        print(self.x)

    def test_method2(self, arg1):
        print("引数1:" + arg1)

    def gety(self):
        return self.y

a = TestClass("y")
print(a.gety())

b = TestClass("b")
print(b.gety())

a.test_method1()
b.test_method1()
y
b
変数1
変数1

解答例

matplotlib

TeX でいろいろな式を書こう

def f():
    return {"a": "a"}
print(f().keys())
dict_keys(['a'])

いろいろなプログラムを書こう

numpy でのグラフ

sympy

# colab の場合
from IPython.display import Math, HTML
def load_mathjax_in_cell_output():
    display(HTML("<script src='https://www.gstatic.com/external_hosted/mathjax/latest/MathJax.js?config=default'></script>"))
get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)

微分方程式


中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しよう役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

このサイトについて

数学・物理の情報を中心にアカデミックな話題を発信しています。詳しいプロフィールはこちらから。通信講座を中心に数学や物理を独学しやすい環境づくりを目指して日々活動しています。
  • このエントリーをはてなブックマークに追加
  • LINEで送る

YouTube チャンネル登録

講義など動画を使った形式の方が良いコンテンツは動画にしています。ぜひチャンネル登録を!

メルマガ登録

メルマガ登録ページからご登録ください。 数学・物理の専門的な情報と大学受験向けのメルマガの 2 種類があります。

役に立つ・面白い記事があればクリックを!

記事の編集ページから「おすすめ記事」を複数選択してください。