add conv for hw2 and complement main.c

This commit is contained in:
2025-09-26 20:02:31 +09:00
parent 40064d644b
commit e172984338
4 changed files with 399 additions and 8 deletions

View File

@@ -2,6 +2,7 @@
#include <stdio.h>
#include <stdlib.h>
#include "convergence.h"
#include "muller.h"
#include "nr.h"
@@ -28,6 +29,10 @@ int main() {
1. using zbrak, find all possible intervals with roots.
2. and use routines and enumerate all roots.
*/
printf("===============================\n");
printf("A report of root-finding\n");
printf("student name: Hajin Ju, id: 2024062806\n");
printf("--------------------------------\n");
printf("=== A Program that find bessj0 roots in [1, 10] ===\n");
printf("--------------------------------\n");
float a = 1.0, b = 10.0;
@@ -41,10 +46,6 @@ int main() {
int i;
zbrak(bessj0, a, b, n, xb1, xb2, &nb);
/* for (i = 1; i <= nb; i++) {
printf("[%f, %f]\n", xb1[i], xb2[i]);
} */
float *roots_bisect = calloc(sizeof(float), nb);
float *roots_linter = calloc(sizeof(float), nb);
float *roots_secant = calloc(sizeof(float), nb);
@@ -117,7 +118,7 @@ int main() {
xb1 = calloc(sizeof(float), n);
xb2 = calloc(sizeof(float), n);
nb = 0;
zbrak(test_func, a, b, n, xb1, xb2, &nb);
float *roots_interesting = calloc(sizeof(float), nb);
@@ -128,7 +129,8 @@ int main() {
roots_interesting[i] = rtsafe(test_funcd, l, r, xacc);
}
printf("I want to find roots of `x * sin(x) - 1`\n");
printf("I want to find roots of `x * sin(x) - 1`\nwhere x in [%.02f, %.02f]\n", a, b);
printf("-------------------------------\n");
printf("roots: ");
for (i = 0; i < nb; i++) {
printf("%f ", roots_interesting[i]);
@@ -139,5 +141,134 @@ int main() {
free(xb2);
free(roots_interesting);
printf("\n");
printf("=== Discuss the convergence speed ===\n");
printf("--------------------------------\n");
a = 2.0f;
b = 3.0f;
printf("Find a root of bessj0(x) where x in [%.02f, %.02f].\n", a, b);
printf("We want to get convergence speed(iteration count).\n");
printf("-------------------------------\n");
ConvergenceData conv_bisect = rtbis_with_conv(bessj0, a, b, xacc);
ConvergenceData conv_flsp = rtflsp_with_conv(bessj0, a, b, xacc);
ConvergenceData conv_secant = rtsec_with_conv(bessj0, a, b, xacc);
ConvergenceData conv_newt = rtnewt_with_conv(dbessj0, a, b, xacc);
ConvergenceData conv_newtsafe = rtsafe_with_conv(dbessj0, a, b, xacc);
ConvergenceData conv_muller = rtmuller_with_conv(bessj0, a, b, xacc);
printf("Convergence History(where root ~ 2.404825):\n");
printf("bisect iteration count: %d\n", conv_bisect.size);
printf("bisect iteration history: ");
for (i = 0; i < conv_bisect.size; i++) {
printf("%f ", conv_bisect.data[i]);
}
printf("\n");
printf("lin-interpoalation iteration count: %d\n", conv_flsp.size);
printf("lin-interpoalation iteration history: ");
for (i = 0; i < conv_flsp.size; i++) {
printf("%f ", conv_flsp.data[i]);
}
printf("\n");
printf("secant iteration count: %d\n", conv_secant.size);
printf("secant iteration history: ");
for (i = 0; i < conv_secant.size; i++) {
printf("%f ", conv_secant.data[i]);
}
printf("\n");
printf("newton-raphson iteration count: %d\n", conv_newt.size);
printf("newton-raphson iteration history: ");
for (i = 0; i < conv_newt.size; i++) {
printf("%f ", conv_newt.data[i]);
}
printf("\n");
printf("newton with bracketing iteration count: %d\n", conv_newtsafe.size);
printf("newton with bracketing iteration history: ");
for (i = 0; i < conv_newtsafe.size; i++) {
printf("%f ", conv_newtsafe.data[i]);
}
printf("\n");
printf("muller method iteration count: %d\n", conv_muller.size);
printf("muller method iteration history: ");
for (i = 0; i < conv_muller.size; i++) {
printf("%f ", conv_muller.data[i]);
}
printf("\n");
printf("-------------------------------\n");
printf("Convergence Error\n");
float res;
printf("bisect convergence error: ");
res = conv_bisect.data[conv_bisect.size - 1];
for (i =0;i < conv_bisect.size; i++) {
printf("%f ", fabs(conv_bisect.data[i] - res) / res);
}
printf("\n");
printf("flsp convergence error: ");
res = conv_flsp.data[conv_flsp.size - 1];
for (i =0;i < conv_flsp.size; i++) {
printf("%f ", fabs(conv_flsp.data[i] - res) / res);
}
printf("\n");
printf("secant convergence error: ");
res = conv_secant.data[conv_secant.size - 1];
for (i =0;i < conv_secant.size; i++) {
printf("%f ", fabs(conv_secant.data[i] - res) / res);
}
printf("\n");
printf("newton-raphson convergence error: ");
res = conv_newt.data[conv_newt.size - 1];
for (i =0;i < conv_newt.size; i++) {
printf("%f ", fabs(conv_newt.data[i] - res) / res);
}
printf("\n");
printf("newton with bracketing convergence error: ");
res = conv_newtsafe.data[conv_newtsafe.size - 1];
for (i =0;i < conv_newtsafe.size; i++) {
printf("%f ", fabs(conv_newtsafe.data[i] - res) / res);
}
printf("\n");
printf("muller method convergence error: ");
res = conv_muller.data[conv_muller.size - 1];
for (i =0;i < conv_muller.size; i++) {
printf("%f ", fabs(conv_muller.data[i] - res) / res);
}
printf("\n");
printf("-------------------------------\n");
printf("Convergence Iteration Counts Table:\n");
printf("--------------------------------------------------------------\n");
printf("| Method | Iter |\n");
printf("--------------------------------------------------------------\n");
printf("| Bisection | %-04d |\n", conv_bisect.size);
printf("| Linear Interpolation | %-04d |\n", conv_flsp.size);
printf("| Secant | %-04d |\n", conv_secant.size);
printf("| Newton-Raphson | %-04d |\n", conv_newt.size);
printf("| Newton with Bracketing | %-04d |\n", conv_newtsafe.size);
printf("| Muller | %-04d |\n", conv_muller.size);
printf("--------------------------------------------------------------\n");
printf("As a result, In order of performance(faster convergence speed),\n");
printf("Newton-Raphson, Newton with Bracketing, Muller, Secant, Linear Interpolation, Bisection\n");
printf("-------------------------------\n");
printf("===============================\n");
return 0;
}