symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
1open Expr
2open Integrate
3
4let fourier_transform expr var =
5 let omega = "omega" in
6 let integrand = Mul (expr, Exp (Mul (Mul (Const (-1.0), SymConst E), Mul (Var omega, Var var)))) in
7 match integrate var integrand with
8 | Some result -> Some result
9 | None ->
10 match expr with
11 | Const c -> Some (Mul (Const c, Const 0.0))
12 | Exp (Mul (Const a, Var v)) when v = var && a < 0.0 ->
13 Some (Div (Const 1.0, Add (Const a, Mul (SymConst E, Var omega))))
14 | Sin (Mul (Const a, Var v)) when v = var ->
15 Some (Div (Const a, Sub (Pow (Var omega, Const 2.0), Pow (Const a, Const 2.0))))
16 | Cos (Mul (Const a, Var v)) when v = var ->
17 Some (Div (Var omega, Sub (Pow (Var omega, Const 2.0), Pow (Const a, Const 2.0))))
18 | _ -> None
19
20let inverse_fourier_transform _expr _omega =
21 None
22
23let laplace_transform expr t =
24 let s = "s" in
25 match expr with
26 | Const c -> Some (Div (Const c, Var s))
27 | Var v when v = t -> Some (Div (Const 1.0, Pow (Var s, Const 2.0)))
28 | Pow (Var v, Const n) when v = t && Float.is_integer n && n >= 0.0 ->
29 let rec factorial n =
30 if n <= 1.0 then 1.0
31 else n *. factorial (n -. 1.0)
32 in
33 Some (Div (Const (factorial n), Pow (Var s, Const (n +. 1.0))))
34 | Exp (Mul (Const a, Var v)) when v = t ->
35 Some (Div (Const 1.0, Sub (Var s, Const a)))
36 | Sin (Mul (Const a, Var v)) when v = t ->
37 Some (Div (Const a, Add (Pow (Var s, Const 2.0), Pow (Const a, Const 2.0))))
38 | Cos (Mul (Const a, Var v)) when v = t ->
39 Some (Div (Var s, Add (Pow (Var s, Const 2.0), Pow (Const a, Const 2.0))))
40 | Sinh (Mul (Const a, Var v)) when v = t ->
41 Some (Div (Const a, Sub (Pow (Var s, Const 2.0), Pow (Const a, Const 2.0))))
42 | Cosh (Mul (Const a, Var v)) when v = t ->
43 Some (Div (Var s, Sub (Pow (Var s, Const 2.0), Pow (Const a, Const 2.0))))
44 | Mul (Exp (Mul (Const a, Var v1)), Sin (Mul (Const b, Var v2)))
45 when v1 = t && v2 = t ->
46 Some (Div (Const b,
47 Add (Pow (Sub (Var s, Const a), Const 2.0), Pow (Const b, Const 2.0))))
48 | Mul (Exp (Mul (Const a, Var v1)), Cos (Mul (Const b, Var v2)))
49 when v1 = t && v2 = t ->
50 Some (Div (Sub (Var s, Const a),
51 Add (Pow (Sub (Var s, Const a), Const 2.0), Pow (Const b, Const 2.0))))
52 | _ -> None
53
54let inverse_laplace_transform expr s =
55 let t = "t" in
56 match expr with
57 | Div (Const c, Var v) when v = s -> Some (Const c)
58 | Div (Const 1.0, Pow (Var v, Const n)) when v = s && Float.is_integer n && n > 0.0 ->
59 let rec factorial n =
60 if n <= 1.0 then 1.0
61 else n *. factorial (n -. 1.0)
62 in
63 Some (Div (Pow (Var t, Const (n -. 1.0)), Const (factorial (n -. 1.0))))
64 | Div (Const 1.0, Sub (Var v, Const a)) when v = s ->
65 Some (Exp (Mul (Const a, Var t)))
66 | Div (Const a, Add (Pow (Var v, Const 2.0), Pow (Const b, Const 2.0))) when v = s ->
67 Some (Mul (Const (a /. b), Sin (Mul (Const b, Var t))))
68 | Div (Var v, Add (Pow (Var v2, Const 2.0), Pow (Const b, Const 2.0)))
69 when v = s && v2 = s ->
70 Some (Cos (Mul (Const b, Var t)))
71 | _ -> None
72
73let z_transform _expr _n =
74 None
75
76let inverse_z_transform _expr _z =
77 None