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)
|
| #次のように map で書ける
def prod2(a):
return a*2
lst1 = [1, 2, 3, 4]
lst2 = list(map(prod2, lst1)) #map はイテレーターを返すので list() でリスト化する
print(lst2)
|
| #参考:ラムダ式
lst1 = [1,2,3,4]
lst2 = list(map(lambda x: x*2, lst1))
print(lst2)
|
| #参考:リスト内法表記
lst1 = [1,2,3,4]
lst2 = [a*2 for a in lst1]
print(lst2)
|
| lst1 = [1,2,3,4]
lst2 = []
lst3 = [1,2,3,4]
for a in lst3:
lst2.append(a*2)
print(lst2)
|
| 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 | 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()
|
解答例
matplotlib
TeX でいろいろな式を書こう
| def f():
return {"a": "a"}
print(f().keys())
|
いろいろなプログラムを書こう
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)
|
微分方程式