add symbolic differentiation