#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);
}
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;
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);
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);
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;
}