LoginSignup
0
1

More than 3 years have passed since last update.

Swiftでlog(1+x)の近似値を求める

Last updated at Posted at 2020-10-17

なぜSwiftなの?

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

log(x+1)のマクローリン展開

$\log(1+x)$のマクローリン展開は

$$
\log(1+x) = x-\frac{x^2}{2}+\frac{x^3}{3}-\frac{x^4}{4}+⋯+\frac{(-1)^{n-1}x^n}{n}+⋯
$$

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

1.変数を用意する

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

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

また,近似する$x$を入れる定数も用意しなければならない。

var sum = 0
let x = 1

さらに,項として更新され続ける変数を用意する。

var item = x

第一項は定数と同じになるので,xを入れておく。

最終的なコードは以下のようになる。

var sum = 0.0  //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = 1.0
var item = x

2.x=1として第二項までコーディングする

コーディングをする上で小さな値から始めることや具体的な値で試行錯誤することは重要だと思う。(個人の見解)。この記事でもその理念に則り$x=1$として第二項まで,つまり

$$
\log (1+x)=x-\frac{x^2}{2}
$$

までコーディングする。

var sum = 0.0  //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = 1.0
var item = x

sum += 1.0
sum += -(x*x)/Double(2*1)

最後に真値と比較するprint文を加える。

import Foundation
var sum = 0.0  //int型とdouble型は足算できないので,0.0と書きdouble型にする。
let x = 1.0
var item = x

sum += 1.0
sum += -(x*x)/Double(2*1)
print(sum)//近似値0.5
print(log(2.0))//真値0.6931471805599453

3.一般化しやすいように工夫する

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

import Foundation
var sum = 0.0  //int型とdouble型は足算できないので,0.0と書きdouble型にする。
var item = 1.0
let x = 1.0
sum += item

for i in 2 ..< 3{
    item *= -(x*Double(i-1))/Double(i)
    sum += item
}
print(sum)//近似値0.5
print(log(2.0))//真値0.6931471805599453

マクローリン展開された$\log (x+1)$を観察すると,項が大きくなるたび$x$と$1/n$がかけられているので,それをコードで表現する。

計算-12.jpg

for文を使っているが,1度しか実行されないため,sumの値は変わらない。

4.項数をふやす

一般化することによって項数を増やしても対応できる。

import Foundation
var sum = 0.0  //int型とdouble型は足算できないので,0.0と書きdouble型にする。
var item = 1.0
let x = 1.0
sum += item

for i in 2 ..< 10{
    item *= -(x*Double(i-1))/Double(i)
    sum += item
}
print(sum)//近似値0.7456349206349205
print(log(2.0))//真値0.6931471805599453

第9項まで加えても真値とだいぶ差がある。$sinx,cosx$は第6項でほとんど同じだったので,$\log (x+1)$は$sin$や$cos$に比べ,収束するのが遅いことがわかる。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1