こんにちは!
平方根の計算ができたらいいなぁ・・・(´-`).。oO
と思うこと、ありますでしょうか?
ないですよね?
平方根が必要になることはナイもしれませんが、
標準機能だけで(無理やり感はありますが)計算できましたので記事にしてみます^0^
ニュートン法を使う
平方根を求めるには、ちょっと数値計算の知識が必要そうです。
ニュートン法という方法を使ってみたいと思います。
仕組みをまとめてみたので気になる方は読んでみてください。
ニュートン法のことはいいからやり方~という方は「アプリを作る」まで飛んでください
他の方法も試したのですがニュートン法が一番楽そうだったのでこれにしました。
ニュートン法とは
今回は平方根たとえば$x^2=A$のような$x$を求めたいので
f(x)=x^2-A
な、$y=f(x)$の2次関数のグラフがあるとします。↓こんな。
とある$x$座標を$x_n$として、$f(x_n)$に接する直線と$x$軸の交点の$x$座標を$x_{n+1}$とします。
$n$から$n+1, n+2, n+3,...$と続けていくと、$y=f(x)$のグラフと$x$軸との交点(つまり$x^2=A$の解)が求められるという仕組みです。
直線の傾きを求める
直線の傾きを求めていきます。
先程の図から、2種類の方法で直線の傾きを求めることができます
まずは微分です。$y=f(x)$のグラフに接する直線の傾きは「微分」で求めることができます。
傾き= f'(x) ・・・・①
次は見た目の傾き。傾きは、三角形で言うところの、$\frac{高さ}{底辺}$で求めることができます。
図の青線と赤線でできる三角形を見てください。
底辺は$x_n-x_{n+1}$、高さは$f(x_n)$で表すことができます
というわけで、
傾き = \frac{f(x_n)}{x_n-x_{n+1}} ・・・・②
①も②も同じ傾きのことを表しているので、
f'(x_n) = \frac{f(x_n)}{x_n-x_{n+1}} ・・・・③
と表すことができます。
一番最初に$f(x) = x^2 - A $としていました。これを式に代入していきたいと思います。
まずは微分して・・・
\\f(x) = x^2 - A
\\f'(x) = 2x
\\つまり
\\f(x_n)=x_n^2 -A
\\f'(x_n) = 2x_n
③に代入していきます
\\ f'(x_n) = \frac{f(x_n)}{x_n-x_{n+1}}
\\ 2x_n = \frac{x_n^2-A}{x_n-x_{n+1}}
これを$x_{n+1}=$の形にしてまとめると、最終的に↓のような形になります。
x_{n+1}=\frac{1}{2}(x_n + \frac{A}{x_n})
この、最後のまとまった式を使って、平方根を計算していきます。
$x_0$に適当な値を入れて、$x_1, x_2, ..., x_{10}$ のように10回くらい繰り返すとだんだん平方根の値に近づいていきます。
$x_0$の初期値を適切な値にするのが大切ですが、今回はAの値を初期値にしたいと思います。
また、平方根なので、プラスとマイナスがありますが、プラスの方だけ求めます。
アプリを作る
こんなふうに数値フィールド1つと、計算フィールドを10個並べます。
Aの最小値を0にしておくといいと思います。
数式は後述します。
フィールドの種類 | フィールドコード | 計算式 |
---|---|---|
数値 | A | (手入力) |
計算 | Aの平方根 | IF(A=0,0,x9) |
計算 | x0 | (A + 1) / 2 |
計算 | x1 | (x0 + A/x0) / 2 |
計算 | x2 | (x1 + A/x1) / 2 |
計算 | x3 | (x2 + A/x2) / 2 |
計算 | x4 | (x3 + A/x3) / 2 |
計算 | x5 | (x4 + A/x4) / 2 |
計算 | x6 | (x5 + A/x5) / 2 |
計算 | x7 | (x6 + A/x6) / 2 |
計算 | x8 | (x7 + A/x7) / 2 |
計算 | x9 | (x8 + A/x8) / 2 |
動作確認&まとめ
大きい数になるともしかしたら、収束しないなどあるかもしれませんが、その時は$x_n$の数を増やしてください^^
というわけで、平方根(プラス)を求めることができました。
世の中のいろんな公式等を他にも試してみたいと思います^0^