diff options
| author | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
|---|---|---|
| committer | Elizabeth Alexander Hunt <me@liz.coffee> | 2026-07-02 11:55:17 -0700 |
| commit | 6bf4b90c90f15f4ab60833bddf5b5756d1a6b1f6 (patch) | |
| tree | ed97e39ec77c5231ffd2c394493e68d00ddac5a4 /Homework/math4610/inc | |
| download | misc-undergrad-main.tar.gz misc-undergrad-main.zip | |
Diffstat (limited to 'Homework/math4610/inc')
| -rw-r--r-- | Homework/math4610/inc/lizfcm.h | 100 | ||||
| -rw-r--r-- | Homework/math4610/inc/macros.h | 58 | ||||
| -rw-r--r-- | Homework/math4610/inc/types.h | 24 |
3 files changed, 182 insertions, 0 deletions
diff --git a/Homework/math4610/inc/lizfcm.h b/Homework/math4610/inc/lizfcm.h new file mode 100644 index 0000000..1dcdb6b --- /dev/null +++ b/Homework/math4610/inc/lizfcm.h @@ -0,0 +1,100 @@ +#include "macros.h" +#include "types.h" + +#ifndef LIZFCM_H +#define LIZFCM_H + +extern float smaceps(); +extern double dmaceps(); + +extern double central_derivative_at(double (*f)(double), double a, double h); +extern double forward_derivative_at(double (*f)(double), double a, double h); +extern double backward_derivative_at(double (*f)(double), double a, double h); + +extern double sum_v(Array_double *v); +extern Array_double *scale_v(Array_double *v1, double m); +extern Array_double *add_v(Array_double *v1, Array_double *v2); +extern Array_double *minus_v(Array_double *v1, Array_double *v2); +extern double v_dot_v(Array_double *v1, Array_double *v2); +extern double l2_norm(Array_double *v); +extern double l1_norm(Array_double *v); +extern double linf_norm(Array_double *v); +extern double vector_distance(Array_double *v1, Array_double *v2, + double (*norm)(Array_double *)); +extern double l2_distance(Array_double *v1, Array_double *v2); +extern double l1_distance(Array_double *v1, Array_double *v2); +extern double linf_distance(Array_double *v1, Array_double *v2); +extern Array_double *copy_vector(Array_double *v1); +extern Array_double *add_element(Array_double *v, double x); +extern Array_double *slice_element(Array_double *v, size_t x); +extern void free_vector(Array_double *v); +extern void format_vector_into(Array_double *v, char *s); +extern int vector_equal(Array_double *a, Array_double *b); + +extern Matrix_double *put_identity_diagonal(Matrix_double *m); +extern Matrix_double **lu_decomp(Matrix_double *m); +extern Array_double *bsubst(Matrix_double *u, Array_double *b); +extern Array_double *fsubst(Matrix_double *l, Array_double *b); +extern Array_double *solve_matrix_lu_bsubst(Matrix_double *m, Array_double *b); +extern Matrix_double *gaussian_elimination(Matrix_double *m); +extern Array_double *solve_matrix_gaussian(Matrix_double *m, Array_double *b); +extern Array_double *m_dot_v(Matrix_double *m, Array_double *v); +extern Matrix_double *m_dot_m(Matrix_double *a, Matrix_double *b); +extern Matrix_double *transpose(Matrix_double *m); +extern Array_double *col_v(Matrix_double *m, size_t x); +extern Matrix_double *copy_matrix(Matrix_double *m); +extern Matrix_double *add_column(Matrix_double *m, Array_double *col); +extern Matrix_double *slice_column(Matrix_double *m, size_t col); +extern void free_matrix(Matrix_double *m); +extern void format_matrix_into(Matrix_double *m, char *s); +extern int matrix_equal(Matrix_double *a, Matrix_double *b); + +extern Line *least_squares_lin_reg(Array_double *x, Array_double *y); + +extern Array_double *find_ivt_range(double (*f)(double), double start_x, + double delta, size_t max_steps); +extern Array_double *bisect_find_root(double (*f)(double), double a, double b, + double tolerance, size_t max_iterations); +extern double bisect_find_root_with_error_assumption(double (*f)(double), + double a, double b, + double tolerance); +extern double fixed_point_iteration_method(double (*f)(double), + double (*g)(double), double x_0, + double tolerance, + size_t max_iterations); +extern double fixed_point_newton_method(double (*f)(double), + double (*fprime)(double), double x_0, + double tolerance, + size_t max_iterations); +extern double fixed_point_secant_method(double (*f)(double), double x_0, + double x_1, double tolerance, + size_t max_iterations); +extern double fixed_point_secant_bisection_method(double (*f)(double), + double x_0, double x_1, + double tolerance, + size_t max_iterations); + +extern double dominant_eigenvalue(Matrix_double *m, Array_double *v, + double tolerance, size_t max_iterations); +extern double shift_inverse_power_eigenvalue(Matrix_double *m, Array_double *v, + double shift, double tolerance, + size_t max_iterations); +extern double least_dominant_eigenvalue(Matrix_double *m, Array_double *v, + double tolerance, + size_t max_iterations); +extern Array_double *partition_find_eigenvalues(Matrix_double *m, + Matrix_double *guesses, + double tolerance, + size_t max_iterations); +extern Matrix_double *leslie_matrix(Array_double *age_class_surivor_ratio, + Array_double *age_class_offspring); + +extern double rand_from(double min, double max); + +extern Array_double *jacobi_solve(Matrix_double *m, Array_double *b, + double tolerance, size_t max_iterations); +extern Array_double *gauss_siedel_solve(Matrix_double *m, Array_double *b, + double l2_convergence_tolerance, + size_t max_iterations); + +#endif // LIZFCM_H diff --git a/Homework/math4610/inc/macros.h b/Homework/math4610/inc/macros.h new file mode 100644 index 0000000..d081869 --- /dev/null +++ b/Homework/math4610/inc/macros.h @@ -0,0 +1,58 @@ +#include <stddef.h> +#include <stdlib.h> +#include <string.h> + +#ifndef MACROS_H +#define MACROS_H + +#define DEFINE_ARRAY(TYPE) \ + typedef struct { \ + TYPE *data; \ + size_t size; \ + } Array_##TYPE + +#define DEFINE_MATRIX(TYPE) \ + typedef struct { \ + Array_##TYPE **data; \ + size_t cols; \ + size_t rows; \ + } Matrix_##TYPE + +#define InitArray(TYPE, ...) \ + ({ \ + TYPE temp[] = __VA_ARGS__; \ + Array_##TYPE *arr = malloc(sizeof(Array_##TYPE)); \ + arr->size = sizeof(temp) / sizeof(temp[0]); \ + arr->data = malloc(arr->size * sizeof(TYPE)); \ + memcpy(arr->data, temp, arr->size * sizeof(TYPE)); \ + arr; \ + }) + +#define InitArrayWithSize(TYPE, SIZE, INIT_VALUE) \ + ({ \ + Array_##TYPE *arr = malloc(sizeof(Array_##TYPE)); \ + arr->size = SIZE; \ + arr->data = malloc(arr->size * sizeof(TYPE)); \ + for (size_t i = 0; i < arr->size; i++) \ + arr->data[i] = INIT_VALUE; \ + arr; \ + }) + +#define InitMatrixWithSize(TYPE, ROWS, COLS, INIT_VALUE) \ + ({ \ + Matrix_##TYPE *matrix = malloc(sizeof(Matrix_##TYPE)); \ + matrix->rows = ROWS; \ + matrix->cols = COLS; \ + matrix->data = malloc(matrix->rows * sizeof(Array_##TYPE *)); \ + for (size_t y = 0; y < matrix->rows; y++) \ + matrix->data[y] = InitArrayWithSize(TYPE, COLS, INIT_VALUE); \ + matrix; \ + }) + +#define c_max(x, y) (((x) >= (y)) ? (x) : (y)) +#define c_min(x, y) (((x) <= (y)) ? (x) : (y)) + +#define true 1 +#define false 0 + +#endif // MACROS_H diff --git a/Homework/math4610/inc/types.h b/Homework/math4610/inc/types.h new file mode 100644 index 0000000..95ab96d --- /dev/null +++ b/Homework/math4610/inc/types.h @@ -0,0 +1,24 @@ +#include "macros.h" +#include <stdint.h> + +#ifndef TYPES_H +#define TYPES_H + +DEFINE_ARRAY(int); +DEFINE_ARRAY(uint32_t); +DEFINE_ARRAY(int32_t); +DEFINE_ARRAY(float); +DEFINE_ARRAY(double); + +DEFINE_MATRIX(int); +DEFINE_MATRIX(uint32_t); +DEFINE_MATRIX(int32_t); +DEFINE_MATRIX(float); +DEFINE_MATRIX(double); + +typedef struct Line { + double m; + double a; +} Line; + +#endif // TYPES_H |
