はじめに
プログラミング云々ばかり言っていても、それがどのように計算されているかを知らないと仕様が無い。ということで数値解析を学んでいく。
基本的には
を参照しつつ、他書で補足する。
前回の復習
- 2分法の基礎となる定理を述べよ。 中間値の定理
- 法のアルゴリズムを説明せよ。
- 初期値およびを設定する。
- とおく。
- ならばに移り、そうでなければに移る。
- とおき、に戻る。
- として計算を終了する。
2. 非線形方程式の解
2.2 具体的な反復法
2.2.3 Aitkenの加速法とSteffensenの反復法
一般にに収束する反復列が
を満たすとき、線形収束(1次収束)するという。
反復列がに線形収束するとすれば、を満たすような定数およびに収束する数列が存在し、
が成り立つ。これらからを消去すると、
を得る。そこで数列を
と定義すれば、はよりも速くに近づくと予想される。このを用いた反復法をの加速法という。この方法は、の収束が遅い場合に用いる。一般に収束列からより収束の早い収束列をつくる方法を加速法という。
定理2.7 の加速法の収束速度 反復列が線形収束ならば、加速列
はを加速する。
より、
が成り立つ。の定義式から、
が得られる。 )
他方では別の反復
を提案し、この方法はの場合であってもに急速に収束する。
このは
に対して加速を施したものに他ならない。しかしこの反復は単なる反復法ではなく、反復列が発散する場合であっても、初期値をの充分近くに選べば、は1次以上の収束をする。すなわち
定理2.8 反復の性質 級関数がの解について、ならば、に充分に近いを初期値とした場合に
であり、特にが級ならば、
が成り立つ。
とおけば、であり、
である。したがって
が成立する。
ここでとおけば、
が成り立つ。したがってならば、のときが成り立つから、反復の定義式
から、
が得られる。特にが級ならば、が成り立つから、同様の議論によりを得る。 )
2.2.4 Pythonによるシミュレーション
方程式を数値的に解く。手法として、
- 二分法
- 反復法(:恒等写像)
- 加速
- の反復
- 法
を試してみる。
############################ ### 非線形方程式の数値解 ### ############################ # x - e^{-x} = 0を解く import math # 初期値関係 a_0 = 0.0 # 2分法の初期値① b_0 = 2.0 # 2分法の初期値② x_0 = 1.0 # Newton法等の初期値 eps = 1e-8 # 誤差評価の値 def f(x): return x - math.exp(-x) def f_prime(x): return 1 + math.exp(-x) def g(x): return math.exp(-x) def g_prime(x): return -math.exp(-x) ############# ### 2分法 ### ############# val1 = [] error = float('inf') a = a_0 b = b_0 c = (a + b) * 0.5 error = abs(a-b) * 0.5 val1.append(c) while error > eps: f_val = f(c) if f_val > 0: b = c elif f_val < 0: a = c else: break c = (a + b) * 0.5 val1.append(c) error = abs(a-b) * 0.5 ############## ### 反復法 ### ############## val2 = [] x_old = 99999999999.0 x_new = x_0 val2.append(x_new) while abs(x_new - x_old) > eps: x_old = x_new x_new = g(x_old) val2.append(x_new) ###################### ### Aitkenの加速法 ### ###################### val3_1 = [] val3_2 = [] x_old = 99999999999.0 x_new = x_0 val3_1.append(x_new) # 最初にx_1, x_2をつくっておく for i in range(2): x_old = x_new x_new = g(x_old) val3_1.append(x_new) y_old = 9999999.0 y_new = -9999999.0 while abs(y_new - y_old) > eps: x_old = x_new y_old = y_new y_new = val3_1[len(val3_1) - 3] - (val3_1[len(val3_1) - 2] - val3_1[len(val3_1) - 3]) ** 2 / (val3_1[len(val3_1) - 1] - 2.0 * val3_1[len(val3_1) - 2] + val3_1[len(val3_1) - 3]) x_new = g(x_old) val3_1.append(x_new) val3_2.append(y_new) #################### ### Steffensen法 ### #################### val4 = [] x_old = 99999999999.0 x_new = x_0 val4.append(x_new) while abs(x_new - x_old) > eps: x_old = x_new x_new = (x_old * g(g(x_old)) - g(x_old) ** 2) / (g(g(x_old)) - 2 * g(x_old) + x_old) val4.append(x_new) ################ ### Newton法 ### ################ val5 = [] x_old = 99999999999.0 x_new = x_0 val5.append(x_new) while abs(x_new - x_old) > eps: x_old = x_new x_new = x_old - f(x_old)/f_prime(x_old) val5.append(x_new)
- 結果
二分法 | 回 |
|
---|---|---|
反復法 | 回 |
|
加速 | 回 |
|
の反復 | 回 |
|
法 | 回 |
今回の復習
今回はなし
参考文献
- 伊理正夫・藤野和建(1985)「数値計算の常識」(共立出版)
- 菊地文雄・齊藤宣一(2016)「数値解析の原理 現象の解明をめざして」(岩波書店)
- 齊藤宣一(2012)「数値解析入門」(東京大学出版)
- 齊藤宣一(2017)「数値解析」(共立出版)
- 高橋大輔(1996)「理工系の基礎数学8 数値計算」(岩波書店)
- 山本哲朗(2003)「数値解析入門[増訂版]」(サイエンス社)
- 日本応用数理学会 監修・ 櫻井 鉄也 編・ 松尾 宇泰 編・ 片桐 孝洋 編(2018)「数値線形代数の数理とHPC」(共立出版)
- Ridgway Scott, Larkin (2011), "Numerical Analysis", (Princeton University Press)