C中的二分法

问题描述

我写了一段代码,用二分法求四次多项式的根。我也为第三个多项式编写了相同的代码效果很好。我只是复制和粘贴,并添加了 4 度术语,但效果不佳。这是我的代码

double root4(double a0,double a1,double a2,double a3,double a4,double xs,double xe)
{
    /*0.000001 is stop point*/
    double xs_value,xe_value,stop_condition,pos_root,pos_root_val;  /*Here "y" means f(y) and pos means possible*/
    int n = 1,temp;
    do
    {
        xs_value = (a4*(xs*xs*xs*xs)) + (a3*(xs*xs*xs)) + (a2*(xs*xs)) + (a1*xs) + a0;
        xe_value = (a4*(xe*xe*xe*xe)) + (a3*(xe*xe*xe)) + (a2*(xe*xe)) + (a1*xe) + a0;
        stop_condition = (xe-xs)/(pow(2,n));
        pos_root = (xs + xe) / 2;
        pos_root_val =(a4*(pos_root*pos_root*pos_root*pos_root))+(a3*(pos_root*pos_root*pos_root))+(a2*(pos_root*pos_root))+(a1*pos_root)+a0;
        if(xs_value * pos_root_val < 0)
            xe = pos_root;
        if(xe_value * pos_root_val < 0)
            xs = pos_root;      
        n++;
    }
    while(stop_condition >= 0.000001);
    return pos_root;
}

当我给出这些值

root4(1,10,7,3,-4,-50,50)); last two number means interval like [-50,50]

它给了我

0.000000

当我将间隔更改为 [-50,51] 时,输出变为 0.500000 我认为问题在于边界,但正如我所说,它适用于 3 次多项式。

解决方法

您的多项式如下所示(注意 y 轴缩小了很多):

enter image description here

特别是,函数在区间两边都是负的。为了使二分法收敛到一个根,函数必须在区间的一侧为正,在另一侧为负。对于 3 次(或任何奇次)多项式,如果您采用足够大的间隔,情况总是如此。对于第四学位(或任何偶数学位),情况正好相反。

最重要的是,这不是您的算法中的错误。只是你给它的初始条件不好。