编辑代码

#include <stdio.h>
#include <math.h>

#define TOL 1e-6
#define MAX_ITER 1000

double f(double x) {
    return x * x * x - 2 * x - 5;
}

double df(double x) {
    return 3 * x * x - 2;
}

double g_fixed(double x) {
    return cbrt(2 * x + 5); // 不动点迭代的 g(x)
}

void fixed_point() {
    double x_prev = 2.0, x_next, error, error_prev = 0.0, ratio;
    int iter = 0;

    printf("Fixed-point Method:\n");
    do {
        x_next = g_fixed(x_prev);
        error = fabs(x_next - x_prev);
        iter++;
        
        if (iter >= 2) {
            ratio = error / error_prev; // 收敛速度比率 (p=1)
            printf("Convergence ratio (p=1): %.4e\n", ratio);
        }
        
        error_prev = error;
        x_prev = x_next;
        
        if (iter >= MAX_ITER) break;
    } while (error > TOL || fabs(f(x_next)) > TOL);

    printf("(a) Approximate root: %.8f\n", x_next);
    printf("(b) Initial guess: 2.0\n");
    printf("(c) Iterations: %d\n", iter);
    printf("(d) Termination: |x_{n+1}-x_n| < %.1e & |f(x)| < %.1e\n\n", TOL, TOL);
}

void newton() {
    double x_prev = 2.0, x_next, error, fx, dfx, e_prev = 0.0, ratio;
    int iter = 0;

    printf("Newton's Method:\n");
    do {
        fx = f(x_prev);
        dfx = df(x_prev);
        if (fabs(dfx) < 1e-10) break;
        
        x_next = x_prev - fx / dfx;
        error = fabs(x_next - x_prev);
        iter++;
        
        if (iter >= 2) {
            ratio = error / (e_prev * e_prev); // 收敛速度比率 (p=2)
            printf("Convergence ratio (p=2): %.4e\n", ratio);
        }
        
        e_prev = error;
        x_prev = x_next;
        
        if (iter >= MAX_ITER) break;
    } while (error > TOL || fabs(fx) > TOL);

    printf("(a) Approximate root: %.8f\n", x_next);
    printf("(b) Initial guess: 2.0\n");
    printf("(c) Iterations: %d\n", iter);
    printf("(d) Termination: |x_{n+1}-x_n| < %.1e & |f(x)| < %.1e\n\n", TOL, TOL);
}

void secant() {
    double a;
double x0;
double x1;
double x_next;
double fx0;
double fx1;
double error;
double error_prev;
double ratio;

// 赋值
x0         = 2.0;
x1         = 3.0;
fx0        = f(x0);
fx1        = f(x1);
error_prev = 0.0;
    int iter = 0;

    printf("Secant Method:\n");
    do {
        if (fabs(fx1 - fx0) < 1e-10) break;
        
        x_next = x1 - fx1 * (x1 - x0) / (fx1 - fx0);
        error = fabs(x_next - x1);
        iter++;
        
        if (iter >= 2) {
            ratio = error / pow(error_prev, 1.618); // 收敛速度比率 (p≈1.618)
            printf("Convergence ratio (p=1.618): %.4e\n", ratio);
        }
        
        error_prev = error;
        x0 = x1;
        fx0 = fx1;
        x1 = x_next;
        fx1 = f(x1);
        
        if (iter >= MAX_ITER) break;
    } while (error > TOL || fabs(fx1) > TOL);

    printf("(a) Approximate root: %.8f\n", x_next);
    printf("(b) Initial interval: [2.0, 3.0]\n");
    printf("(c) Iterations: %d\n", iter);
    printf("(d) Termination: |x_{n+1}-x_n| < %.1e & |f(x)| < %.1e\n\n", TOL, TOL);
}

int main() {
    fixed_point();
    newton();
    secant();
    return 0;
}