Python多参数非线性拟合 python 非线性拟合_迭代


4 基本数值算法

4.3 非线性方程组

4.3.1 非线性方程的特性

存在性和唯一性

非线性方程解存在性和唯一性的情形,要比线性方程复杂得多

一个非线性方程的解,可能的情形有很多种

如果f是闭区间


上的连续函数,且有


,则在区间


内一定有一维非线性方程


的解,但这个有根判别准则很难推广到n维空间。


如果


但是


,则


是非线性方程的m重根。


敏感性和变态性

非线性方程



是方程的近似解,可能有两种描述:


说明残差很小


近似解与真解的接近程度,前向误差(更为准确)


只有在问题良态的条件下,残差小才意味着解是精确的。

方程


的绝对条件数为


,函数求值


的绝对条件数为


,因为


,所以不能用相对条件数。


非线性方程


,如果在解


处的切线接近水平,则求根问题是病态的,所以具有重根的问题是病态的。


4.3.2 非线性方程的求解

二分法、不动点迭代、牛顿法、割线法、反插

两大类方法,第一类需要知道根所在的区间,但求解过程相对简单,收敛性能保证;另一类从某个初值出发进行迭代,求解过程相对复杂,而且收敛性不能保证,和初值的选取很有关系。

第一类的代表方法是二分法;第二类方法包括牛顿法、割线法等。

二分法:每次确定解在某一半区间内

迭代法的讨论:设方程的真解为


,第k步得到的近似解为


,则相应的误差为


,如果满足下式(C为大于零的常数),称迭代法的收敛速度为r



若r=1且C<1,收敛是线性的;若r>1,收敛是超线性的;若r=2,收敛是平方的。

二分法的收敛速度是线性的。

线性收敛和超线性收敛,差别在于每次迭代后,近似解的有效数字增加是否是一个常数。

解是否足够好,还需要关注问题的病态性和残差



不动点迭代:

若对于函数


,存在x满足


,则称x为g的不动点。记


,则g的不动点就是方程


的根。


不动点迭代就是利用迭代式


,求解方程



有很多不动点函数,但是不同的不动点函数,迭代求解的效果完全不同。

不动点迭代的收敛性:


,对于不动点迭代



是前向误差,而


是后向误差,因此函数g在


的绝对条件数为


。因此当不动点迭代线性收敛时,条件数


正好是收敛速度。而


,则表明不动点迭代的收敛速度是超线性的。



为g的不动点:


如果


,存在一个包含


的区间,如果初值落在这个区间内,则不动点迭代是收敛的;


如果


,不动点迭代是发散的;


如果


,不动点收敛的速度是线性的;


如果


,不动点收敛的速度至少是超线性的。


牛顿法

按照这个迭代公式求解非线性方程


的方法叫牛顿法:




,则符合不动点迭代的形式



牛顿法至少是超线性收敛的。

经过一通暴算得到:



,所以牛顿法是平方收敛的。


需要注意:初值的选取很重要,必须接近方程的根,并且



举一个例子:

求解


,导数



牛顿迭代法公式:




,迭代求解的过程如下:



多重根

如果


是非线性方程


的m重根,


,则:



牛顿迭代公式:




对多重根的迭代收敛速度退化为线性。

割线法:

是一种准牛顿法,采用迭代过程前面两个点



形成的割线来拟合切线:



割线法的迭代公式为:



反插:

割线法利用前两次的迭代值决定一条直线,用这条直线与x轴的交点作为下一次的迭代值。

可以通过高阶的多项式拟合来提高收敛速度,但如果


与x轴没有交点,迭代就会失败。


因此,拟合二次多项式



与x轴的交点为下一次的迭代值,这样的插值方法被称为反二次插值,收敛速度是超线性的。


保护法:综合二分法的安全和牛顿法的超线性收敛,在一个较小的有根区间外采用安全的二分法,在区间内采用高效的迭代方法。