diff --git a/practical_work/rc_circuit/main.c b/practical_work/rc_circuit/main.c
new file mode 100644
index 0000000000000000000000000000000000000000..82b3938d7ce69db91a97eb32b0a4667ebb2c7d48
--- /dev/null
+++ b/practical_work/rc_circuit/main.c
@@ -0,0 +1,20 @@
+#include "rc.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+int main() {
+    rc_state rc = rc_state_create(1.0, 1.0, 1.0);
+
+    double v, v_ini;
+    v = v_ini = 0.0;
+
+    double dt = 0.001;
+    double max_t = 5.0;
+    for (double t = 0.0; t < max_t; t += dt) {
+        double ve = exact_solution(t, v_ini, &rc);
+        printf("t = %f, v = %f, v_e = %f, diff = %f\n", t, v, ve, ve - v);
+        v = rc_advance(v, dt, &rc);
+    }
+
+    return EXIT_SUCCESS;
+}
\ No newline at end of file
diff --git a/practical_work/rc_circuit/rc.c b/practical_work/rc_circuit/rc.c
new file mode 100644
index 0000000000000000000000000000000000000000..0c338c08d4166a819dbd7787c7ba2dabeba0eff7
--- /dev/null
+++ b/practical_work/rc_circuit/rc.c
@@ -0,0 +1,23 @@
+#include <math.h>
+#include "rc.h"
+#include "ode_o1.h"
+
+rc_state rc_state_create(double r, double c, double eps) {
+    rc_state rc = {.r = r, .c = c, .eps = eps};
+    return rc;
+}
+
+double rc_g(double v, void *rc) {
+    rc_state *rcs = (rc_state*)rc;
+    return 1.0 / (rcs->r * rcs->c) * (rcs->eps - v);
+}
+
+double rc_advance(double v0, double dt, rc_state *state) {
+    return advance(rc_g, v0, dt, state);
+}
+
+double exact_solution(double t, double v_ini, rc_state *state) {
+    return v_ini * exp(-t/(state->c * state->r)) - state->eps * exp(-t/(state->c * state->r)) + state->eps;
+}
+
+