なぜSwiftなの?
Swiftは環境構築などする必要がなく,MacかiPadがあればPlaygroundsをインストールするだけで使うことができる。
また,Playgroundsにはステップ実行やゆっくり実行という機能があり,for文やwhile分をステップごとに実行し,実行されている時の値の変化を確認することもできる。
さらに,ビューア機能を使えば変数の変化の様子を勝手にグラフ表示してくれる。
cosx のマクローリン展開
$cosx$をマクローリン展開すると,
$$
cosx=1-\frac{x^2}{2!}+\frac{x^4}{4!}-⋯+\frac{(-1)^nx^{2n}}{(2n)!}+⋯
$$
と表されるのであった。この記事では$sinx$の近似値をプログラミングを使って求めていく。(言語はSwift)ipadでも大丈夫。
1.変数を用意する
マクローリン展開は何回でも微分できる関数$f(x)$を$x$の冪乗関数の級数の展開式の和で近似させるものであるのであった。この記事では$sinx$の値をsum
として,sum
にだんだん値を加えていく。
var sum = 0
print(sum) //0
sum += 1
print(sum) //1
また,近似する$x$を入れる定数も用意しなければならない。この時近似する値として$\pi/6$や$\pi/3$などの値を用いたいので,$\pi$が使えるようimport Foundation
を書いておく。
import Foundation
var sum = 0
let x = Double.pi/2
さらに,項として更新され続ける変数を用意する。
var item = x
第一項は定数と同じになるので,x
を入れておく。
最終的なコードは以下のようになる。
import Foundation
var sum = 0.0 //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = Double.pi/2
var item = x
2.x=π/2として,第二項までコーディングする
コーディングをする上で小さな値から始めることや具体的な値で試行錯誤することは重要だと思う。(個人の見解)。この記事でもその理念に則り$x=\frac{\pi}{2}$として第二項まで,つまり
$$
cosx=1-\frac{x^2}{2!}
$$
までコーディングする。
import Foundation
var sum = 0.0 //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = Double.pi/2
var item = 1
sum += 1
sum += -(x*x)/Double(2*1)
sum
に$1$を加え,次の行で$-\frac{x^2}{2!}$を加えている。
最後に真値と比較するprint
文を加える。
import Foundation
var sum = 0.0 //int型とdouble型は足算できないので,0.0と書きdouble型にする。
var x = Double.pi/2
sum += 1
sum += -(x*x*x)/Double(3*2*1)
print(sum)//近似値0.9248322292886504
print(sin(Double.pi/2))//真値1.0
Double(2*1)
としているのはInt型をDoule型に変換しているのだが,この記事では本質的な部分ではないので説明は割愛。
3.一般化しやすいように工夫する
さっきは第二項を$-\frac{x^2}{2!}$としたが,これでは項数が増えるたびに$x$を増やさなければならない。項数が増えても短くコーディングすることができるように工夫を加える。
import Foundation
var sum = 0.0 //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = Double.pi/3
var item = 1
sum += item
for i in 1 ..< 3{
item *= -(x*x)/Double((2*i)*(2*i-1))
sum += item
}
print(sum)//近似値0.525479753410744
print(cos(Double.pi/3))//真値0.5
4.項数をふやす
一般化することによって項数を増やしても対応できる。
import Foundation
var sum = 0.0 //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = Double.pi/3
var item = 1.0
sum += item
for i in 1 ..< 6{
item *= -(x*x)/Double((2*i)*(2*i-1))
sum += item
}
print(sum)//近似値0.499999999639
print(cos(Double.pi/3))//真値0.5
第6項までの近似,つまり
$$
cosx=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\frac{x^8}{8!}-\frac{x^{10}}{10!}
$$
ではほとんど誤差が無いことがわかる。
おまけ
一般化するときは表にすると捉えやすい。