diff --git a/practical_work/rc_circuit/.gitignore b/practical_work/rc_circuit/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..79be7b0bcb3292b5aef3781452e6458dd25c5877 --- /dev/null +++ b/practical_work/rc_circuit/.gitignore @@ -0,0 +1,3 @@ +*.o +main +*.gch diff --git a/practical_work/rc_circuit/Makefile b/practical_work/rc_circuit/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..4879775f3361556c67d2abd2566f512ba2cc4608 --- /dev/null +++ b/practical_work/rc_circuit/Makefile @@ -0,0 +1,25 @@ +CC=clang +OPTS=-g -O3 -Wall -Wextra -fsanitize=address -fsanitize=leak -std=c11 +LINK=-lm -fsanitize=address -fsanitize=leak + +# OPTS=-g -O3 -Wall -Wextra -std=c11 +# LINK=-lm + +main: main.o rc.o ode_o1.o + $(CC) $(OPTS) -o $@ $^ $(LINK) + +main.o: main.c + $(CC) $(OPTS) -c $^ + +ode_o1.o: ode_o1.c ode_o1.h + $(CC) $(OPTS) -c $^ + +rc.o: rc.c rc.h + $(CC) $(OPTS) -c $^ + +test: + make -C tests test + +clean: + rm -f *.o main + make -C tests clean diff --git a/practical_work/rc_circuit/ode_o1.c b/practical_work/rc_circuit/ode_o1.c new file mode 100644 index 0000000000000000000000000000000000000000..55cf1138010479072943fa39c110d9a9548d8e29 --- /dev/null +++ b/practical_work/rc_circuit/ode_o1.c @@ -0,0 +1,10 @@ +#include "ode_o1.h" + +// a * df/dt + b * f = c + +// (f(t + dt) - f(t)) / dt = g(f(t)) => f(t + dt) = f(t) + dt * g(f(t)). + +double advance(double (*g)(double, void *), double f0, double dt, void *state) { + return f0 + dt * g(f0, state); +} + diff --git a/practical_work/rc_circuit/ode_o1.h b/practical_work/rc_circuit/ode_o1.h new file mode 100644 index 0000000000000000000000000000000000000000..bfb3d311e4515d9d5b9d501ec6690048146e2727 --- /dev/null +++ b/practical_work/rc_circuit/ode_o1.h @@ -0,0 +1,9 @@ +#ifndef _ODE_O1_H_ +#define _ODE_O1_H_ + +// a * df/dt + b * f = c +// (f(t + dt) - f(t)) / dt = g(f(t)) => f(t + dt) = f(t) + dt * g(f(t)). + +double advance(double (*g)(double, void *), double f0, double dt, void *state); + +#endif diff --git a/practical_work/rc_circuit/rc.h b/practical_work/rc_circuit/rc.h new file mode 100644 index 0000000000000000000000000000000000000000..48610878ac10faa4b6e401b2f2641d8289eefebc --- /dev/null +++ b/practical_work/rc_circuit/rc.h @@ -0,0 +1,21 @@ +#ifndef _RC_H_ +#define _RC_H_ + +// rc ode: +// R * C * dV_c/dt + V_c = epsilon +// dV_c / dt = (epsilon - V_c) / R * C // g is the R.h.s of this equation +// V_c(t + dt) = V_c(t) + dt / (R * C) * (epsilon - V_c) + +typedef struct _rc_state { + double r, c, eps; +} rc_state; + +rc_state rc_state_create(double r, double c, double eps); + +double rc_g(double v, void *rc); + +double rc_advance(double v0, double dt, rc_state *state); + +double exact_solution(double t, double v_ini, rc_state *state); + +#endif \ No newline at end of file