演算法--迭代法
迭代法
迭代法(Iteration)是一種不斷用變數的舊值遞推出新值的解決問題的方法。迭代演算法是用計算機解決問題的一種基本方法,一般用於數值計算。累加、累乘都是迭代演算法的基礎應用。典型案例:牛頓迭代法”。
步驟:
- 確定迭代模型:分析得出前一個(或幾個)值與其下一個值的迭代關係數學模型;
- 建立迭代關係式
- 對迭代過程進行控制
經典案例:
示例: 斐波那契數列:1、1、2、3、5、8、13、21、34
function fibonacci(n) {
let a = 1, b = 1, c = 1
for(let i = 2; i <= n; i++) {
c = a + b
a = b
b = c
}
return c
}
對於斐波那契數列,當n趨於無窮時,數列最後的兩項的商 (xn-1/xn) 趨於黃金分割數0.618
示例: 最大公約數,採用輾轉相除法(歐幾里得演算法)
定理:兩個整數的最大公約數等於其中較小的那個數,和兩數相除餘數的最大公約數。
gcd(a, b) = gcd(a, a mod b)
function gcd (a, b) {
if (a < b) {
[a, b] = [b, a]
}
let temp
while (b > 0) {
temp = a % b
a = b
b = temp
}
return a
}
示例: 牛頓迭代法
一種在實數域和複數域上近似求解方程的方法,其比一般的迭代法有更高的收斂速度。
首先,選擇一個接近函式 f(x) 零點的點,如圖為 $ (x_n, f(x_n)) $ ,計算相應的切線斜率 $ {f^{’}(x_n)} $ ,$ k = tan\alpha = \frac{y_2 - y_1}{x_2 - x_1}$ 得到如下方式
和 x 軸的交點座標,也就是下面方式的解:
通常
會比
更接近方程的解,接下來繼續迭代,直到達到要求的精度即可。
例: 求
方程的根,係數分別是1,2,3,4。求x在1附件的一個實根。
function f(a, b, c, d) {
let x0, x1 = 1, f0, f1
do {
x0 = x1
f0 = a * Math.pow(x0, 3) + b * Math.pow(x0, 2) + c * x0 + d
// 求導後函式
f1 = 3 * a * Math.pow(x0, 2) + 2 * b * x0 + c
x1 = x0 - f0/f1
} while (Math.abs(x1 - x0) >= Math.pow(Math.E, -4))
return x1
}
例:求根號x的近似值
我想求根號2等於多少,我猜測值為4,根據牛頓迭代定律: x_{n+1} = x - \frac{x^2 - n}{2x} = \frac{1}{2}(x + \frac{n}{x})
function mySqrt (num) {
let x0, x1 = 4, f0, f1
do {
x0 = x1
f0 = Math.pow(x0, 2) - num
// 求導後函式
f1 = 2 * x0
x1 = x0 - f0/f1
} while (Math.abs(x1 - x0) >= Math.pow(Math.E, -4))
return x1
}
引深:
物體直線運動時,路程 s 與時間 t 的函式關係為 ,且 在 時的導數 存在;則在物理上, 表示物體在時刻 $ t_0$ 的瞬時速度 ,而 為加速度,即時間 為加速度!