问题五十九:怎么求一元六次方程在区间内的所有不相等的实根(2)

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 tracingsuperellipsoid

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 ---------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值