Swiftでcosxの近似値を求める

公開:2020/10/15
更新:2020/10/15
3 min読了の目安(約2800字TECH技術記事

sinxについてはこちら

なぜSwiftなの?

Swiftは環境構築などする必要がなく,MacかiPadがあればPlaygroundsをインストールするだけで使うことができる。
また,Playgroundsにはステップ実行ゆっくり実行という機能があり,for文やwhile分をステップごとに実行し,実行されている時の値の変化を確認することもできる。
さらに,ビューア機能を使えば変数の変化の様子を勝手にグラフ表示してくれる。
2020-10-14 11.16のイメージ.jpg

cosxのマクローリン展開

cosxcosxをマクローリン展開すると,

cosx=1x22!+x44!+(1)nx2n(2n)!+ cosx=1-\frac{x^2}{2!}+\frac{x^4}{4!}-⋯+\frac{(-1)^nx^{2n}}{(2n)!}+⋯

と表されるのであった。この記事ではsinxsinxの近似値をプログラミングを使って求めていく。(言語はSwift)ipadでも大丈夫。

1.変数を用意する

マクローリン展開は何回でも微分できる関数f(x)f(x)xxの冪乗関数の級数の展開式の和で近似させるものであるのであった。この記事ではsinxsinxの値をsumとして,sumにだんだん値を加えていく。

var sum = 0
print(sum)    //0
sum += 1
print(sum)    //1

また,近似するxxを入れる定数も用意しなければならない。この時近似する値としてπ/6\pi/6π/3\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=π2x=\frac{\pi}{2}として第二項まで,つまり

cosx=1x22! 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)

sum11を加え,次の行でx22!-\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.一般化しやすいように工夫する

さっきは第二項をx22!-\frac{x^2}{2!}としたが,これでは項数が増えるたびにxxを増やさなければならない。項数が増えても短くコーディングすることができるように工夫を加える。

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=1x22!+x44!x66!+x88!x1010! cosx=1-\frac{x^2}{2!}+\frac{x^4}{4!}-\frac{x^6}{6!}+\frac{x^8}{8!}-\frac{x^{10}}{10!}

ではほとんど誤差が無いことがわかる。

おまけ

一般化するときは表にすると捉えやすい。