【c++】牛顿法求方程的解

 

 

例:

 

 

 

point:牛顿法易失败,需要更换初始值重新进行迭代计算。

double Newton(double t, double y, double x ) {
    double epsilon = 1e-14;
    int M = 1000;
    double F;
    double dF;
    double ddy;
    int count;
    double dy;
    double dy_ = 0.0;
    int flag = 0;
START:
    dy = dy_;
    count = 0;
    while (1) {
        F = pow(dy, 3) - 6 * pow(t, 3) * x * pow(y, 2) * dy + pow(t, 3) * pow(x, 3) + 8 * pow(t, 6) * pow(y, 6);
        dF = 3 * pow(dy, 2) - 6 * pow(t, 3) * x * pow(y, 2);
        ddy = F / dF;
        if (fabs(ddy / dy) <= epsilon) {
            return dy;
        }
        else {
            dy -= ddy;
            count++;
        }
        if (count < M) {
            continue;
        }
        else {
            flag++;
            if (dy_ == 0) {
                dy_ -= 2;
            }
            else if (dy_ < 0) {
                dy_ = -dy_;
            }
            else {
                dy_ += 2;
                dy_ = -dy_;
            }
            //std::cout << "迭代不成功,更换初始值为: " << dy << "\n";
            if (flag >= 1000) {
                std::cout << "牛顿法失败" << '\n';
                return 0;
            }
            
        }
            goto START;
            
    }
    return 0;
}

 

posted @ 2023-01-31 21:41  致命一姬  阅读(175)  评论(0)    收藏  举报