牛顿迭代法

#include<stdio.h>
#include<math.h>
double func(double x);
double func1(double x);
int Newton(double *x, double precision, int maxcyc);
int main() {
    double x, precision,t;
    int maxcyc=1000000,wei,i;
    printf("输入初始迭代值x0:");
    scanf("%lf", &x);
    // printf("输入最大迭代次数:");
    // scanf("%d", &maxcyc);
    printf("迭代要求的精度:");
    scanf("%lf", &precision);
    t=precision;
    for(i=0;1;i++){
        if(t>0.1){
            break;
        }
    t=t*10;
    }
    wei=i+1;
    if (Newton(&x, precision, maxcyc) == 1) { //若函数返回值为1
        // printf("%d\n",wei);
        printf("该值附近的根为:%.*lf\n",wei,x);
    } else { //若函数返回值为0
        printf("迭代失败!\n");
    }
    return 0;
}
double func(double x) { //函数
    return x * x * x * x - 3 * x * x * x + 1.5 * x * x - 4.0;
}
double func1(double x) { //导函数
    return 4 * x * x * x - 9 * x * x + 3 * x;
}
int Newton(double *x, double precision, int maxcyc) {  //precision  迭代精度  maxcyc  迭代次数 
    double x1, x0;
    int k;
    x0 = *x;
    for (k = 0; k < maxcyc; k++) {
        if (func1(x0) == 0.0) { //若通过初值,函数返回值为0
            printf("迭代过程中导数为0!\n");
            return 0;
        }
        x1 = x0 - func(x0) / func1(x0); //进行牛顿迭代计算
        if (fabs(x1 - x0) < precision || fabs(func(x1)) < precision) { //达到结束条件
            *x = x1; //返回结果
            return 1;
        } else { //未达到结束条件
            x0 = x1; //准备下一次迭代
        }
    }
    printf("迭代次数超过预期!\n"); //迭代次数达到,仍没有达到精度
    return 0;
}
posted @ 2020-04-22 00:01  Linux666  阅读(315)  评论(0编辑  收藏  举报