≪いっしょにPython≫ プログラマーの実験ノート
このページは,プログラム言語Pythonをこれから学ぼうと考えている筆者の備忘録です.
そこそこ調べて書いていますが,仕様を精密に調べたものではありません.どちらかと言えば,実装されたPython 3を使ってみてどうなったかということを中心に書いたものです.いわば,実験ノートの記録です.(2019.3.30,Python3.7.2に基づいて作成)
Pythonの練習には,
(1) IDLEというメニューから入って,>>>というプロンプトが表示される状態で使う場合
• 画面の上端がPython 3.7.x Shellとなっていて,2行目がFile, Edit, Shell, Debug, ...となっている
• 1行入力するたびに,エラーを確かめながら処理を進める,対話型インタプリタの形になっている
(2) IDLEというメニューから入って,左上端のFileをクリック→New Fileと進む場合
• 画面の上端がファイル名(初めはUntitled)となっていて,2行目がFile, Edit, format, Run, ...となっている
(3) Python 3.7.x という真っ黒なコマンドプロンプトの画面(ターミナルウィンドウ)から入るもの
の3通りが使えるが,以下は(2)のNew Fileから,テキストエディタを使って,プログラムを書く場合を考える.
外部パッケージsympyのinstall
• 複数のモジュールが階層的なディレクトリに管理されているものをパッケージという.
• Pythonでは標準ライブラリに収められているモジュール以外に,外部のサイトに公開されているフリーのパッケージ,モジュールが利用しやすい.これらは外部ライブラリと呼ばれる.(パッケージやモジュールの総称として,ライブラリという用語が使われることがある.また,パッケージをさらにまとめたものという使意味に使うこともある.)
• 従来,フリーソフトと言えば,便利な代わりに玉石混交というイメージもあったが,Pythonの場合は,主に
PyPI(https://pypi.org/)(パイパイ,パイピーアイ:Python Package Index)というサイトにボランティアが作ったパッケージ,モジュールが集められ,管理されていて,実績がある.
プログラミングと言えば,真っ黒な(真っ白な)テキストエディタの画面で,何もない所から全部自分で作るというのが昔のイメージであるが,忙しい現代ではそのスタイルでは能率が悪い.Pythonでは,自分が自動車を作りたいときに「エンジン」「車体」「タイヤ」「内装」などの部品を外部パッケージからかき集めて,それらを統合したり,ない部分だけ自分で作るという仕事のスタイルがお勧めのようです.
•
PyPI(https://pypi.org/)(パイパイ,パイピーアイ:Python Package Index)にあるパッケージ,モジュールは,ブラウザから選んでもよいが,(windows版)Python 3では,pipというコマンドを使えば,PyPIから目的のものを探して,インストールし,設定する作業を自動でやってくれる.
• pipを使うには,
Pythonで作業中のときは,それらを全部終了して,windowsのコマンドプロンプトを出します.(windowsのメニュー画面をたどって,windowsシステムツール→コマンドプロンプトと進んでもよい.画面左下の「ここに入力して検索」という欄に,(半角文字で)cmdと書き込んでエンターキーを押してもよい.)
1. 記号数学ソフトsympyのinstall
数学の数式処理を行うsympyという(symbolic mathematics.記号数学)Pythonのライブラリをインストールするには
【windowsのコマンドプロンプトで】
pip install sympy
と書いて,エンターキーを押す.
【数分間で】
unixのタールボールと呼ばれる圧縮ファイルがダウンロードされ,解凍,設定される.
Pythonを起動して,ファイルを読むと,/Lib/site-packagesの中に今日の日付でsympyというフォルダが作られており,その中に必要なファイルが入っている.
【例 1.1.1】Symbol(), expand()メソッド:式の展開
→ a**2 + 2*a*b + b**2
変数の記号を見た目のままに表示するには,Symbol()メソッドを使う(先頭は大文字!)
展開式を作るには,expand()メソッドを使う
【例 1.1.2】factor()メソッド:因数分解
→ (x + 1)*(x + 2)
この形式でインポートするとモジュール名sympyを省略できる.
因数分解するには,factor()メソッドの中に式を書き込む
【例 1.1.3】solve()メソッド:方程式,連立方程式を解く
ax+b=0という方程式を解くには,a*x+bのように=0を除いた左辺を引数に渡す.
5x=3なら5x−3=0と変形して,5*x−3をsolve()の引数にする.
中学1年生に教えると,式と方程式の違いが区別できずに混乱するおそれがあるが,大人は約束事と割り切ればよい.他の数学ソフトでもこの方式は使われている.
→ [-5/3, 0]
3x^2+5x=0という2次方程式の解を求める.2次方程式では2つの解がリスト型で返される.分数になる解は,分数として表示される
→ {x: 2/17, y: -7/17}
連立方程式はsolve(リスト)の形で方程式のリストを並べる.解は辞書型で示される.不能解の場合は空リスト[],不定解の場合はxをyで解いた式{x: -2*y + 1}などが返される
→ [-3*x/4 + 5/4]
3x+4y-−5=0をyについて解きたい(yをxで表したい)ときは,第2引数にyを書く
【例 1.1.4】diff()メソッド:微分する(導関数を求める)
→ 3*x**2 + 2
-3*(2*x + 1)/(3*x - 2)**2 + 2/(3*x - 2)
diff()の引数に関数形を書くと,微分が求まる
cos(x)
定義済みの関数の名前で微分してもよい
6*x**2
偏微分するときは第2引数に微分する変数を書く
12*x
高階導関数を求めるには,第3引数に階数を書く
【例 1.1.4】
integrate()メソッド:積分する(不定積分を求める)
→ x**3/3 + 3*x**2/2 + 4*x
integrate()の引数に関数形を書くと,不定積分が求まる(積分定数は省略される)
【例 1.1.5】
→ -cos(2*x - 3)/2
を表す.(積分定数は省略.以下同様)
→ (3*x - 1)*exp(3*x + 4)/9
を表す.
→ x*log(x) - x
を表す.
【sympyで使える記号定数】
例えば,自然対数の底(

),円周率(

),無限大(

)などを含む次のような積分計算を行うときに,それらの近似値

,

, ...を使って計算すると,結果も近似値となって,期待する結果と異なるものになります.

そこで,高校の定積分に登場する定数のうちで,sympyで利用可能なものを調べてみました.
自然対数の底:E(大文字で書く)
円周率:pi(小文字2つで書く)
正の無限大:float('inf')またはoo(小文字のオーオー.ただし,下記の*参照)
負の無限大:-float('inf')または-oo
オイラーの公式:

【例 1.1.6】
→ −1
まとめてインポートするのでなければ,個々のオブジェクト E, pi, Iもインポートする必要がある
【例 1.1.7】
integrate(関数,(変数,下端,上端))メソッド:積分する(定積分を求める)
→ 9*
pi/4
定積分の変数,下端,上端をタプルにしたものを第2引数とする

→
pi/2
x→2のとき,分母→0の広義積分となるが,積分は求まる
【例 1.1.8】
→ -
sqrt(2)*
pi/8 +
sqrt(2)/2
定積分の下端,上端にも
が使える
【例 1.1.9】
→
exp(2)/4
定積分の下端,上端にも
が使える

ただし,
は
と表示される
【例 1.1.10】
float('inf')で正の無限大を表す
→ 1
正の無限大
は,float('inf')で表せる

【例 1.1.11】
ooで正の無限大を表す
→ 1
正の無限大
は,オブジェクトoo(小文字のオーオー:正の無限大)で表せる(∞に似ていて入力が簡単)
なぜか,入力に使うときはオブジェクトooをインポートしておく必要がある(import *でもよい)が,結果が無限大のときはインポートしていなくてもooと表示される(次の例1.1.12参照)
【例 1.1.12】 結果が正負の無限大になるとき
→
oo
-oo

dx=-\infty\]&chco=aa2200)
なお,正負の無限大はoo, −ooで表示される場合も,inf, −infで表示される場合もある.また,これらは極限値なので,oo+1→oo, inf*2→infなどの関係を満たし,inf == ooを満たす.
※integrate(1/x,(x,-1,0))が−oo−I*piすなわち
となるのは,プログラムミスか?(複素積分
の計算になっている)
【例 1.1.13】
Matrix()行列の計算
→
Matrix([[-2, 4], [6, -10]])
Matrix([[1, 2], [3, -9]])
Matrix([[-3, 2], [3, -1]])
Matrix([[-2, -8], [6, 20]])
行列はMatrix(大文字のM)に2重のリストを引数にして表す.




となることを表す
【例 1.1.13】
transpose(), det(), inv()転置行列,行列式,逆行列
→
Matrix([[-1, 3], [2, -5]])
-1
Matrix([[5, 2], [3, 1]])
import *を使わない場合,transpose()だけはMatrixオブジェクトに入っていないようなので,別途インポートする

\times(-5)-2\times 3=-1&chco=aa2200)

となることを表す
【例 1.1.14】
eigenvals(), eigenvects(), diagonalize()固有値,固有ベクトル,対角化
→
{-1: 1, -2: 1}

すなわち
の解は
の各1個になる
→
[(-2, 1, [Matrix([
[-1],
[ 1]])]), (-1, 1, [Matrix([
[-3/2],
[ 1]])])]
固有値−2の重複度は1で,対応する固有ベクトルは

固有値−1の重複度は1で,対応する固有ベクトルは

→
(Matrix([
[-1, -3],
[ 1, 2]]), Matrix([
[-2, 0],
[ 0, -1]]))

とおくと
となる
○== メニューに戻る ==