1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
type function_x =
| X
| R of float
| Sin of function_x
| Cos of function_x
| Tan of function_x
| Log of function_x
| Exp of function_x
| Power of function_x * float
| Add of function_x * function_x
| Mul of function_x * function_x
let factor p = match p with
| R(1.),u -> u
| u,v -> Mul(u,v)
let product p = match p with
| R(a),Mul(R(b),u) -> factor(R(a*.b),u)
| Mul(R(a),u),R(b) -> factor(R(a*.b),u)
| Mul(R(a),u),Mul(R(b),v) -> factor(R(a*.b),Mul(u,v))
| u,Mul(R(k),v) -> Mul(R(k),Mul(u,v))
| Mul(R(k),u),v -> Mul(R(k),Mul(u,v))
| u,v -> factor(u,v)
let rec deriv f =
match f with
| X -> R(1.)
| R(k) -> R(0.)
| Add(u,R(k)) -> deriv(u)
| Add(u,v) -> Add(deriv(u),deriv(v))
| Mul(R(k),X) -> R(k)
| Mul(R(k),u) -> product(R(k),deriv(u))
| Mul(u,v) -> Add(product(deriv(u),v),product(u,deriv(v)))
| Sin(u) -> product(deriv(u),Cos(u))
| Cos(u) -> product(R(-1.),product(deriv(u),Sin(u)))
| Tan(u) -> product(deriv(u),Power(Cos(u),-2.))
| Log(u) -> product(deriv(u),Power(u,-1.))
| Exp(u) -> product(deriv(u),Exp(u))
| Power(u,2.) -> product(R(2.),product(deriv(u),u))
| Power(u,a) -> product(R(a),product(deriv(u),Power(u,a-.1.))) |
Partager