symbolic mathematics engine in OCaml with differentiation, integration, simplification, and numerical methods
17

Configure Feed

Select the types of activity you want to include in your feed.

leibniz / lib / transforms.ml
3.2 kB 77 lines
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