59.2 求一元六次方程在区间内的所有不相等的实根
59.2.1 理论分析
在“59.1”中,我们已经求得一元六次方程在区间内不相等的实根的总个数。接下来,我们将具体求出方程在区间内的所有不相等的实根。
分两步进行:
第一步:将区间分成若干个只包含一个不相等实根的子区间。
1.1,计算整个区间[l,r]内实根的个数N(59.1中已经完成);
1.2,若该区间内实根的个数>1,用二分法将该区间对分,计算[l,(l+r)/2]内实根的个数;
1.3,若新区间内实根的个数>1,继续二分区间,计算新二分区间内实根的个数;
若新区间内实根的个数=0,计算[(l+r)/2,r]内实根的个数;
第二步:若新区间内实根的个数=1,用牛顿迭代法求得该实根。
在如下章节有介绍过牛顿迭代法:
“问题四十六:怎么用ray tracing画superellipsoid”
http://blog.csdn.net/libing_zeng/article/details/54564227
注意:
牛顿迭代法,求得的实根不一定是区间内的实根。
比如:
某一元六次方程在区间[-5,5]有-4、-3、-2、2、3、4六个实根,在区间[-2.5, -1.5]进行迭代时,我们是想求”-2”这个实根,但是迭代的结果可能是”2”。
这时,我们的做法是:舍弃结果,返回迭代失败,求根总次数+1(因为失败了一次,需要再来一次),区间二分回到第一步重新开始(理论上,只要区间足够小,一定可以迭代到满足精度要求的实根。也有例外情况,如果区间小到误差范围,又知道该区间内有一个实根,直接将区间端值作为要求的实根)
另外,数据类型最好用double
59.2.2 看C++代码实现
----------------------------------------------vec3.h ------------------------------------------
vec3.h
bool roots_equation_6th(float ee6[7], float a, float b, float tol, float (&roots)[7]);
----------------------------------------------vec3.cpp ---------