迭代法

迭代法(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) 零点的点,如图为
算法--迭代法_javascript算法_02
计算相应的切线斜率
算法--迭代法_迭代法_03 算法--迭代法_javascript算法_04
得到如下方式
算法--迭代法_算法_05
和 x 轴的交点坐标,也就是下面方式的解:
算法--迭代法_迭代法_06
通常 算法--迭代法_javascript算法_07 会比 算法--迭代法_javascript算法_08

算法--迭代法_求根号x的近似值_09
例:算法--迭代法_求根号x的近似值_10

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的近似值
算法--迭代法_javascript算法_11
我想求根号2等于多少,我猜测值为4(首先随便猜一个近似值x),根据牛顿迭代定律:算法--迭代法_算法_12
算法--迭代法_求根号x的近似值_13

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 的函数关系为 算法--迭代法_求根号x的近似值_14 ,且 算法--迭代法_算法_15算法--迭代法_求根号x的近似值_16 时的导数 算法--迭代法_求根号x的近似值_17 存在;则在物理上,算法--迭代法_求根号x的近似值_17 表示物体在时刻 $ t_0$ 的瞬时速度 算法--迭代法_求根号x的近似值_19,而算法--迭代法_迭代法_20 为加速度,即时间 算法--迭代法_求根号x的近似值_21