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