1. 迭代法基本思想
迭代法的实现,一般需要确定以下三个要点。
1.1 确定迭代变量:
迭代变量一般就是要求解的问题的解,利用迭代递推公式可以不断地由旧值递推出新值。根据问题的不同,迭代变量可以是一个,也可以是多个。
确定迭代变量,通常还要根据迭代递推关系给出迭代变量的初始值,这一点也很重要。
1.2 确定迭代递推关系:
迭代递推关系是根据旧值计算新值的关系或公式,这是迭代法实现的关键,如果不能确定迭代关系,则无法用迭代法实现算法。
1.3 确定迭代终止条件:
迭代终止条件是控制迭代过程退出的关键条件。迭代不可能无休止地进行,必须设置迭代终止条件,在适当的时候退出迭代。
迭代终止条件一般有三种假设:
- 其一,是迭代变量已经求得问题的精确值;
- 其二,是迭代变量无法得到精确值,但是某个迭代的值的精度已经满足要求;
- 其三,是指定明确的迭代计算次数。
迭代算法的具体实现,可根据问题的类型选择迭代终止条件。一般情况下,为了防止迭代关系在某个区间上发散(不收敛)使得算法进入死循环,都会把第三个条件作为异常退出条件和其他迭代终止条件配合使用,也就是说,即使无法得到符合条件的解,只要迭代计算次数达到某个限制值,也退出迭代过程。
2. 实例
2.1 用迭代法求 平方根
公式:求 a 的平方根的迭代公式为: Xn+1=(Xn + a/Xn)/2 要求前后两次求出的 x 的差的绝对值小于10-5 时结束,并输出每次迭代的结果和最后结果
def func(a):
i = 0
x = 1.0
ret = 0
while True:
i += 1
previous_ret = ret
ret = (x + a/x)/2.0 # 迭代递推关系
x = ret # 迭代变量
print "i is {}".format(i)
if abs(ret - previous_ret) <= 10**(-5): # 迭代终止条件
break
print "ret is {}".format(ret)
func(81)
2.2 二分迭代求解低阶非线性方程
对于 f(x) = 2x2 + 3.2x - 1.8 求在 [-0.8, 8] 区间使得 f(x) = 0 的解,由于计算机无法对两个浮点数直接做相等的判断,故对其精度误差要求小于 10-9
def fun(x):
f = 2*x**2 + 3.2*x - 1.8
return f
def main(value_range):
begin = value_range[0]
end = value_range[1]
i = 0
while True:
i += 1
print "i is {}".format(i)
mid = (begin + end) / 2
print "mid is {}".format(mid)
if fun(begin) * fun(mid) > 0.0:
begin = mid
else:
end = mid
if abs(begin - end) < 10**(-9):
print mid
break
if __name__ == "__main__":
main([-0.8, 8])