pythonでwhile文を使ってパスカルの三角形を作ってみよう、で微分に使おう

パスカルの三角形を微分に使おうpythonで遊ぼう

パスカルの三角形とは?

(a+b)n (n:整数) について、展開(カッコを外す)をしてみましょう。

  • n=1 のとき (a+b)1=a+b
  • n=2 のとき (a+b)2=a2+2ab+b2
  • n=3 のとき (a+b)3=a3+3a2b+3ab2+b3
  • n=4 のとき (a+b)4=a4+4a3b+6a2b2+4ab3+b4

という感じです。ところで、たらたら書きましたが、別に計算したわけではなく、覚えているわけでもありません。

例えば、(a+b)3に注目してみましょう。改めて、展開式を以下のように書いてみます。

(a+b)3=a3+3a2b+3ab2+b3 = a3b0 + 3a2b + 3ab2 + a0b3

展開後の a に注目すると a3 a2 a1 a0 と並んでいます。

展開後の b に注目すると b0 b1 b2 b3 と並んでいます。

3から始まるのは、(a+b)3 が3乗になっているからです。

あとは係数の(1,3,3,1)が問題です。これが、パスカルの三角形の一部になります。先ほどの展開式から、係数だけを抜き出してみましょう。

1 1

1 2 1

1 3 3 1

1 4 6 4 1

ですが、次のように見てみると、ホホー、です。

三角形の両端はつねに1です。それから、矢印の根っこの数値を足すと、矢印の先の数値になっています。これをパスカルの三角形といいます。ここでは4段目で止めていますが、これは無限に続きます。

pyhtonでパスカルの三角形を作ってみよう

pythonで組んでみましょう。

pa=[]
pa.append(1)
pa.append(1)

for i in range(0,5,1):
    #print out
    print(str(pa))  
    #make pascal
    nagasa=len(pa)
    pa1=[]
    pa1.append(1)
    for j in range(0,nagasa-1,1):
        pa1.append(pa[j]+pa[j+1])
    pa1.append(1)
    pa=pa1
    del pa1

【プログラムを見てみよう】

paにパスカルの三角形を作っていきます。何か所か pa.append(1) があります。これはパスカルの三角形の端っこの1をいれています。

len(pa)はpaの長さを示しています。例えば、pa=[1,3,3,1]であれば、4つの要素がありますから、len(pa)=4になります。

パスカルの三角形のpaの次の段をpa1に入れています。

pa=pa1 で、pa1の結果をpaに上書きしています。

役目の終わったpa1は del pa1 で消去しています。

for 文を二重に使っていますので、for i の中で回す for文はわかりやすくするために for j とでもしておきます。

結果を見てみましょう。

[1, 1]
[1, 2, 1]
[1, 3, 3, 1]
[1, 4, 6, 4, 1]
[1, 5, 10, 10, 5, 1]

 パスカルの三角形の5段目までを作ることができました。

これでxnの微分が計算できそう

xnの微分は、

{ (x+h)n-xn }/h

を計算して hを0に限りなく近づけることで求めることができます。ここで、(x+h) を求めないといけないですが、この場合は全部求める必要はないです。どういうことか見ていきましょう。

(x+h) =xn+nxn-1h+axn-2h2+(h、h・・・を含む項につき、以下省略)

まず赤いnはですが、これは(x+h) のnと同じ値になります。

次にaですが、この値は計算可能なのですが、hを0に近づける過程で、この項以降は落ちるので、このままaとしておきまます。

(x+h) - xnnxn-1h+axn-2h2+(以下省略)

から、

{(x+h) - xn } / h=nxn-1 +axn-2h+(hを含む項につき以下省略)

なので hを0に近づけると

lim {(x+h) - xn } / h=nxn-1

になります。なんとなれば、hを含む項は、0に近づくからです。

なので、

(xn)’=nxn-1

となります。ダッシュは微分を表しています。

pythonで微分を計算してみよう

f(x)=x6 でx=3のとき、微分した値をpythonで求めてみましょう。

まず理論を計算しておきます。

f(x)=x6 なので、

f'(x)=6x5

なのでx=3のとき、

f'(3)=6(3)5=1458

になります。ではpythonで実験値を求めてみましょう。

import math

h=1

for i in range(0,5,1):
   a=( math.pow(3+h,6)-math.pow(3,6) )/h
   print(str(a))
   # h renew
   h=h*0.1

【プログラムを見てみよう】

(3+h)6 はプログラムでは、math.pow(3+h,6) と書くことができます。ですので、微分は、

( math.pow(3+h,6)-math.pow(3,6) )/h

をhの値をどんどん小さくしていくことで、微分値の近似値(近い値)を求めることができます。結果を見てみましょう。

3367.0
1585.0368100000014
1470.2041351800628
1459.2155401348914
1458.1215054033687

5回目の計算で、理論値に近い値が出ています。

さらに学習したい方に

ずぶの素人です系の方は

Pythonの絵本 Pythonを楽しく学ぶ9つの扉 [ 株式会社アンク ]

他の言語はかじりました系の方は

基礎からわかるPython [ 坂本俊之 ]

コメント

タイトルとURLをコピーしました