算法设计思想(3)— 迭代法

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])
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值