# ANN: SymbolicControlSystems.jl

**URL:** <https://discourse.julialang.org/t/ann-symboliccontrolsystems-jl/83733>\
**Category:** Package Announcements\
**Tags:** control, dsp, c\
**Created:** [July 4, 2022, 9:09am UTC](https://discourse.julialang.org/t/ann-symboliccontrolsystems-jl/83733 "2022-07-04T09:09:14Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![baggepinnen](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/baggepinnen/32/693_2.png) [@baggepinnen](https://discourse.julialang.org/u/baggepinnen)\
**Post date:** [July 4, 2022, 9:09am UTC](https://discourse.julialang.org/t/ann-symboliccontrolsystems-jl/83733/1 "2022-07-04T09:09:14Z")

</div>

[SymbolicControlSystems.jl](https://github.com/JuliaControl/SymbolicControlSystems.jl) is a newly registered package in the [JuliaControl](https://github.com/JuliaControl/) org that

- Makes it easier to work with control systems with symbolic coefficients
- Write C-code for your controller or filter

We currently support C-code generation from LTI transfer functions and statespace systems, as well as basic code generation for gain-scheduled / interpolated systems.

#### Example:

The following defines a filter that has symbolic parameters and writes C-code for filtering. The symbolic parameters appearing in the filter transfer function will be expected as inputs to the C-code

```julia
using ControlSystems, SymbolicControlSystems
@vars w T d # Define symbolic variables
h = 0.01 # Sample time
G = tf([w^2], [1, 2*d*w, w^2]) * tf(1, [T, 1])
Gd = tustin(G, h) # Discretize
code = SymbolicControlSystems.ccode(Gd, cse=true)

```

C-code output:

```C
#include <stdio.h>

#include <math.h>

double transfer_function(double ui, double T, double d, double w) {
    static double u[4] = {0};
    static double y[4] = {0};
    int i;
    for (i=3; i > 0; --i) {
        u[i] = u[i-1];
    }
    u[0] = ui;
    for (i=3; i > 0; --i) {
        y[i] = y[i-1];
    }
    y[0] = 0;
    double x0 = pow(w, 2);
    double x1 = 8000000.0*T;
    double x2 = 200.0*T*x0;
    double x3 = d*w;
    double x4 = 400.0*x3;
    double x5 = x2 + x4;
    double x6 = 80000.0*T*x3;
    double x7 = 1.0*x0 + x6 + 40000.0;
    double x8 = 1.0/(x1 + x5 + x7);
    double x9 = x0*x8;
    double x10 = 3*x9;
    double x11 = 24000000.0*T;
    double x12 = 3.0*x0 - x6 - 40000.0;
    double x13 = -x2 - x4;
    y[0] += (x9)*u[0];
    y[0] += (x10)*u[1];
    y[0] += (x10)*u[2];
    y[0] += (x9)*u[3];
    y[0] += (-x8*(-x11 + x12 + x5))*y[1];
    y[0] += (-x8*(x11 + x12 + x13))*y[2];
    y[0] += (-x8*(-x1 + x13 + x7))*y[3];
    return y[0];
}

```
