diff --git a/2025.05.02/04Ex/comp.h b/2025.05.02/04Ex/comp.h index 6b09d43..0c6fb08 100644 --- a/2025.05.02/04Ex/comp.h +++ b/2025.05.02/04Ex/comp.h @@ -44,7 +44,7 @@ static inline int is_null (const double a) static inline int is_eps (const double a, const double eps) { - return (((a < 0) ? -a : a) - eps) < DBL_EPSILON; + return ((a < 0) ? -a : a) < eps; } #endif diff --git a/2025.05.02/04Ex/solve.c b/2025.05.02/04Ex/solve.c index 634e532..d8897a9 100644 --- a/2025.05.02/04Ex/solve.c +++ b/2025.05.02/04Ex/solve.c @@ -28,7 +28,8 @@ int t4_solve ( for (it = 1; it <= m; ++it) { - c = b - ((b - a) / (y_b - y_a)) * y_b; + // c = b - ((b - a) / (y_b - y_a)) * y_b; + c = a - ((b - a) / (y_b - y_a)) * y_a; y = f(c); if (is_eps(y, eps)) diff --git a/2025.05.02/08Ex/comp.h b/2025.05.02/08Ex/comp.h new file mode 100644 index 0000000..6b09d43 --- /dev/null +++ b/2025.05.02/08Ex/comp.h @@ -0,0 +1,50 @@ +#ifndef COMP_H +#define COMP_H + +#include +#include + +static inline double * fpmax (double *pa, double *pb, double fa, double fb, double *max_f_p) +{ + if ((fa - fb) > DBL_EPSILON) + { + *max_f_p = fa; + return pa; + } else + { + *max_f_p = fb; + return pb; + } +} + +static inline double * fp_abs_max (double *pa, double *pb, double *fa, double *fb, double **max_f_p) +{ + if ((fabs(*fa) - fabs(*fb)) > DBL_EPSILON) + { + *max_f_p = fa; + return pa; + } else + { + *max_f_p = fb; + return pb; + } +} + +static inline int is_equal (const double a, const double b) +{ + double diff = a - b; + double max_val = (a > b) ? a : b; + return ((diff < 0) ? -diff : diff) < (DBL_EPSILON * max_val); +} + +static inline int is_null (const double a) +{ + return ((a < 0) ? -a : a) < DBL_EPSILON; +} + +static inline int is_eps (const double a, const double eps) +{ + return (((a < 0) ? -a : a) - eps) < DBL_EPSILON; +} + +#endif diff --git a/2025.05.02/08Ex/solve.c b/2025.05.02/08Ex/solve.c index de3a921..a4268b9 100644 --- a/2025.05.02/08Ex/solve.c +++ b/2025.05.02/08Ex/solve.c @@ -6,17 +6,54 @@ int t8_solve ( double (*f) (double), double a, double b, - double eps, int m, double *x + double eps, int m, double *res ) { int it = 1; - double x_l = 0, y_l = 0, c = a, y = f(a); + double h = a - b; + double x_l = 0, y_l = 0, x = a, y = f(a); if (fabs(b - a) < DBL_EPSILON) { - *x = a; + *res = a; return 1; } + while (it <= m) + { + h *= -0.1; + + while (1) + { + it++; + + if (it > m) + return -1; + + x_l = x; + y_l = y; + + x += h; + + if ((a - x) > DBL_EPSILON || (x - b) > DBL_EPSILON) { + *res = x_l; + return it; + } + + y = f(x); + if ((y_l - y) > DBL_EPSILON) { + if ((y_l - y) < eps) { + *res = x_l; + return it; + } + break; + } + } + } + + return -1; +} + +/* for (double h = (b - a) * 0.1; fabs(h) > DBL_EPSILON; h *= -0.1) { do { @@ -54,4 +91,4 @@ int t8_solve ( return it; } - +*/ diff --git a/2025.05.02/08Ex/solve.h b/2025.05.02/08Ex/solve.h index f028ddf..cb0876b 100644 --- a/2025.05.02/08Ex/solve.h +++ b/2025.05.02/08Ex/solve.h @@ -4,7 +4,7 @@ int t8_solve ( double (*f) (double), double a, double b, - double eps, int m, double *x + double eps, int m, double *res ); #endif diff --git a/2025.05.02/tests/main_test.sh b/2025.05.02/tests/main_test.sh index 14a0360..80e58e7 100755 --- a/2025.05.02/tests/main_test.sh +++ b/2025.05.02/tests/main_test.sh @@ -1,5 +1,7 @@ script_name="$(basename "$0")" + iter="1000" +eps="1e-14" if [ "$#" -ne 1 ]; then echo "Не указан как параметр номер программы" @@ -34,15 +36,15 @@ i=2 for (( k = 3 ; k < 7; k++ )); do for (( a = -100 ; a < -40 ; a++ )); do for (( b = -9 ; b < 10 ; b++ )); do - echo "./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k" - echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k)" + echo "./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k" + echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k)" ((i+=2)) done done for (( a = -9 ; a < 10 ; a++ )); do for (( b = 11 ; b < 100 ; b++ )); do - echo "$i ./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k" - echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" 1e-16 $iter $k)" + echo "$i ./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k" + echo "$i $(./a0$prog.out "$(echo "$a / 10" | bc -l)" "$(echo "$b / 10" | bc -l)" $eps $iter $k)" ((i+=2)) done done