已知是科学,未知是神学,已知和未知之间的是哲学。 ——罗素
上一次讲过了“黄金分割法”缩小单峰区间,值得再次强调的是,“二次插值法”缩小区间的思路也是在每次迭代中将原本的区间分割,然后抛弃掉区间不存在极小值点的那一部分,从而使区间缩小。
二次插值法——不断缩小单峰区间求得极值
首先,让我们重新审视一下进退法求得的单峰区间,我们知道区间的端点值,也知道其中必然存在一个极小值点,也就是说函数在区间内的变化趋势是我们是大体知道的,极小值点左侧递减,在极小值点右侧递增,但是它增大和减小的规律,也就是变化率,是不规律的。
但是,我们可以想到有一种简单的函数,也有着类似的函数形状,那就是二次函数。所以二次插值法的思考方式是这样的,如果我们在[a,b]区间内任取一点c,并求出a、b、c三个点的函数值,那么我们可以利用这三个点确定一个二次函数(即二次插值),这个二次函数是完全已知的,我们可以直接得到这个二次插值函数的极值点。随着区间的不断缩小,插值函数的极小值点与原函数的极小值点的距离会不断缩小,最终会满足我们的精度要求,这就实现了用已知近似未知。
虽然思路是这样,但是具体怎么去划分区间,然后再作出取舍呢?
首先,我们在[a,b]区间内任取一点c,并求出a、b、c三个点的函数值,并计算出二次插值函数和二次插值函数的极小值点d。现在我们就有了区间内的两个点,可以把区间分成三份。我接下来仍然像黄金分割法那样,比较c、d两点的函数值,然后抛弃极值点不在的一侧就好了。
有一个问题,d点一定会像上图那样在c点的右边出现么?答案当然是不会,所以我们首先要确定的是d点的c点的相对位置,因为相对位置的不同,会导致取舍区间的不同。一共有下面四种情况。
如果d点在c点的右边,即
如果d点在c点的右边,即
如果d点在c点的左边,即
如果d点在c点的左边,即
以上就是二次插值法,再让我们举个栗子
用二次插值法计算目标函数
主程序如下:
clc
函数定义如下:
function
二次插值法函数定义如下:
%-----------二次插值法---主函数-----------%
得出计算结果: