このサイトは学部では早稲田で物理を, 修士では東大で数学を専攻し, 今も非アカデミックの立場で数学や物理と向き合っている一市民の奮闘の記録です. 運営者情報および運営理念についてはこちらをご覧ください.
中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しようや役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!
目次
2020-05-31 課題
- コンテンツの案内ページ
- GitHub へのリンク
- 01-01 ipynb のプログラムを実際に実行してみて、実数の数値計算上で起こる問題を実感してみてください。
- 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
- 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
- 実際に競プロの問題をいくつか解いてみましょう。例えばここのページを一通り眺めてみてください。Pythonで10問解いてみた記事もあるので参考にしてください。
自分用メモ
- 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
- 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
- https://atcoder.jp/contests/apg4b
- C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
- Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
- https://atcoder.jp/contests/apg4b
- 文と式の説明
- IT 基礎知識みたいなやつ
- 数値計算に関わるクラス・オブジェクトの説明
- まずは辞書・構造体の拡大版として導入するか?
- 変な誤解を生まないような書き方を考える
- 遅延型方程式に対するコメント追加
- import に関する実演
- matplotlib のチュートリアルを読もうの会
- matplotlib 回では実際に matplotlib のチュートリアルを読もう
- 公式情報に触れる重要性
- 古い情報が古いと書いてあったりする:たとえば
pylab
- Gallery
- 見ていて面白い
- 「どこをいじるとどう変わるか」が視覚的にわかる
- 公式情報なのできちんとアップデートしてくれている(はず)
- 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
- Jupyter (IPython)でのはまりどころ解説を作ろう
- いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
- 「セルを上から順に読み込まないと動かない」問題の原因
- カーネル再起動まで変数は残り続ける
競プロを 2 題解いてみる
- https://qiita.com/KoyanagiHitoshi/items/c5e82841b8d0f750851d の最初の2題
ABC 086 A – Product
- 標準入力から取るのが本筋(
input
) - 面倒なのでここでは入力部分をハードコードする
input_str = "1 3"
print("input_str")
print(input_str)
print("======")
print(input_str.split())
print("======")
print(map(int, input_str.split()))
print("======")
print(list(map(int, input_str.split())))
a, b = map(int, input_str.split())
print(a)
print(b)
########################
a, b = map(int, input_str.split())
if a*b % 2 == 0:
print("Even")
else:
print("Odd")
input_str
1 3
======
['1', '3']
======
<map object at 0x7f537ad30c88>
======
[1, 3]
1
3
Odd
s = "1"
print(s)
print(type(s))
print(int(s))
print(type(int(s)))
1
<class 'str'>
1
<class 'int'>
map オブジェクトはイテレーター
input_str = "1 3"
a = map(int, input_str.split())
print(a.__next__())
print(a.__next__())
print(a.__next__())
1
3
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-3-c797e216c7f4> in <module>()
3 print(a.__next__())
4 print(a.__next__())
----> 5 print(a.__next__())
StopIteration:
参考:標準入力
- 果てしなくめんどい
- 低レイヤーの話に突撃する:コンソール・ターミナル、リダイレクトなどなど
- 「特殊 ( スペシャル ) ファイル」
- 「ソケット」
- http://e-words.jp/w/%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88.html
- 特定の通信相手(IPネットワーク上の場合はIPアドレスとポートの組み合わせ)と紐付いた通信端点をプログラム上に生成し、これを通じてコネクションの確立やデータの送受信、切断などの処理を行う。具体的な通信方式や通信相手の指定方式が複数用意されており、同じコンピュータ上の他のプロセスとも、TCP/IPなどを利用して他のコンピュータ上のプログラムとも通信できる。
- 標準入力について参考ページ
- 低レイヤーとは何か
- 参考
- 「低レイヤーとは 「生の」コンピュータに近いことを意味します。」
- OS やら CPU やらメモリやら何やら
- 「ハードウェアに近い話」みたいにも言えるかもしれない
- 簡単とか世間的な意味での「低レベル」とは関係ない
- 参考:「高レイヤー」は Web アプリなど
- 参考:OSI 7階層参照モデル
- この辺は基本情報技術者試験などで「基礎知識」として問われたりする
第二問 ABC 081 A – Placing Marbles
- 文字列は文字からなるリスト(配列)とみなす
count()
の説明は例えばここ- 解説が何を言っているかよくわからないこともよくある
- サンプルをいくつか動かす方が早いこともよくある
- 数学でもよくある:一般論・抽象論ばかりではなく例をいじろう
input_str = "101"
print(input_str.count("1"))
2
input_str = "abcabcab"
print(input_str.count("a"))
3
input_str = "abcabcab"
print(input_str.count("abc"))
2
プログラミングの一般論
インポートまわりの話
- 「お行儀」の問題もいろいろある。
- コーディングルールとして言及されることはよくある。
- たくさん読み書きしてはじめてわかることもある。
- ある程度の量はこなさないと見えない世界がある
初心者にありがちな話:モジュールの内容を全部インポートする
- 「いちいち必要なのだけ選ぶのはめんどい」
- 「楽でいいじゃない」
from sympy import *
from numpy import *
x,y,z = symbols("x,y,z")
問題点
- 知らないモジュールのインポートがたくさんあると、どのクラス・関数がどのモジュールから来ているのかわからない
- 似た名前の関数やクラスなどもたくさんある
- 他人も読むコードではやめてほしい
- 将来、詳細を忘れた自分が読むのも厳しい
- 「わけがわからないので、使うクラスや関数だけインポートしてほしい」
- 例:使うものだけインポート
- https://github.com/django/django/blob/master/django/middleware/cache.py#L48-L50
- 例:使うものだけインポート
- 「使うクラス・メソッドだけインポートするか、
as
で呼ぶかする」といった規約をつけていることもよくある- sympy, numpy あたりはお行儀がよくて、必要なモノだけインポートするよう徹底されている模様
import numpy as np
import matplotlib.pyplot as plt
いろいろなインポートの指定
- 状況に合わせて都合がいいからそうする
- 状況に合わせた方法もいろいろ準備されている
- 必要だったから体系化されて盛り込まれている
from fractions import Fraction
q = Fraction(3,4)
print(q)
3/4
import fractions
r = fractions.Fraction(3,4)
print(r)
3/4
- 内容は同じだが後者は長い
- 書くのが面倒
- 読むときも余計なものまで読まされる
- シンプルにしたい
- ケースバイケースでいろいろやる
- クラスだけ直接インポート:
from fractions import Fraction
as
で短くする:import fractions as f
- クラスだけ直接インポート:
import fractions as f
a = f.Fraction(3,4)
print(a)
3/4
from numpy import *
linspace(0, 10, 11)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
import numpy
numpy.linspace(0, 10, 11)
array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.])
全体像をつかもう
- ある程度大きな姿を捕まえないと局所的に何をやっているかもわからないことはよくある
- 料理でも下ごしらえとか
- 「やらなくてもいいが、やらないと美味しくない」
- フグの調理で毒を避けて処理する
- 「死にたいならやればいい」
- 料理でも下ごしらえとか
- 知識や見えている範囲が狭い中で考えて判断しようとしても無駄なことはよくある
- 意味がわかるかはさておき、ある程度たくさん知っておかないといけないことはよくある
- 単純な知識問題もよくある
- はまることや立ち止まることに意味がない
- 何かを調べたいとき、対応する言葉を知らないと調べようがなければ聞きようもない
- 単純な知識問題もよくある
- 本を読んでいるなら、とにかく四の五の言わずに 2-3 週読んでみるとかした方がいいこともよくある
- プログラミングはちょっと突っ込むだけでいきなりコンピューター関係の基礎知識を大量に要求されるので、さっさと諦めてそれらを勉強する
- 基礎からやったところですぐにわかるようになるわけもないが、それらを諦めるところまで込めて諦める
膨大な量の経験が大事
- 経験を積むと「こうした方がいい」「これはやめてほしい」というのがいろいろたまってくる
- コーディングルールとしてノウハウがまとまっていたりする
- 数学でもε-δで「なぜこんなεを取るのか」みたいな話はよくあるし、「何でこんな概念を導入するのか」みたいな話はよくある。
- 「便利だから」とか言われてもその便利なところを実感できるのはだいぶ慣れ親しんでから。
- この苦労を経ないとその辺の意味やご利益もわからないことはよくある
- プログラミングでも同じ
- ある程度は量をこなそう
楽しく量をこなすには?
- 楽しいと思えることを探すしかない
- 何が楽しいかは自分しかわからない
- はじめつまらなくてもやっているうちに楽しくなることもあれば、何かのきっかけで目覚めることもある
- いい方向が見つかるまでは試行錯誤するしかない
- この中で自然と頭を使いつつ(質を高めつつ)量もこなす必要が出てくる
中高の数学の復習から専門的な数学・物理までいろいろな情報を発信しています.
中高数学に関しては自然を再現しようや役に立つ中高数学 中高数学お散歩コース
大学数学に関しては現代数学観光ツアーなどの無料の通信講座があります.
その他にも無料の通信講座はこちらのページにまとまっています.
ご興味のある方はぜひお気軽にご登録ください!
この記事へのコメントはありません。