# functionUtilsTest.frink

```/** These are tests for the functionUtils.frink library.   It demonstrates     how to find derivatives and integrals of functions, including functions     defined in Frink. */ use functionUtils.frink use allTransforms.frink symbolicMode[true] showApproximations[false] // Test with named function squareFunc[x] := x^2 fSquare = getFunction["squareFunc", 1] println["Function is:    " + inputForm[fSquare]] derivativeFunc1 = makeDerivative[fSquare] println["Before solve:   \$derivativeFunc1"] derivative1 = transformExpression[derivativeFunc1] println["Derivative is:  \$derivative1"] integral1 = transformExpression[makeIntegral[fSquare]] println["Integral is:    \$integral1"] println["-----------------------------------\n\n"] // Test with named function (sin) which uses built-in function. // This needs to recognize that there's no Frink-defined function // body and use any defined transformations to calculate its derivative. // For example, the derivative of sin[x] is defined in derivatives.frink. fSin = getFunction["sin", 1] println["Function is:    " + inputForm[fSin]] derivativeFunc1 = makeDerivative[fSin] println["Before solve:   \$derivativeFunc1"] derivative1 = transformExpression[derivativeFunc1] println["Derivative is:  \$derivative1"] integral1 = transformExpression[makeIntegral[fSin]] println["Integral is:    \$integral1"] println["-----------------------------------\n\n"] // Test with anonymous function anonFunc = { |x| x sin[x] } println["Function is:    " + inputForm[anonFunc]] derivativeFunc2 = makeDerivative[anonFunc] println["Before solve:   \$derivativeFunc2"] derivative2 = transformExpression[derivativeFunc2] println["Derivative is:  \$derivative2"] println["-----------------------------------\n\n"] // The following four lines are essentially equivalent because the === is a // special form of expression that is used for symbolic transformations and // does not evaluate either side of the expression by default. // // solve = makeSolve[noEval[x], noEval[y^3 + 2 y^2 + 3 y + 4], noEval[y]] // solve = makeSolve[noEval[x === y^3 + 2 y^2 + 3 y + 4], noEval[y]] // solve = makeSolve[x === y^3 + 2 y^2 + 3 y + 4, noEval[y]] solve = noEval[solve[x === y^3 + 2 y^2 + 3 y + 4, y]] println["Going to solve:\t\$solve"] solutions = transformExpression[solve] for sol = solutions {    // The solution comes back as something like x === 3 y + 2    // So the right-hand-side (child 1) = (3 y + 2) will be the solution    right = getChild[sol, 1]    println["Solution:  \$right\n"]    substituted = substituteExpression[right, noEval[x], 2]  // Substitute x -> 2    println["Substituted:  \$substituted\n"]    retransformed = transformExpression[substituted]    if ! structureEquals[substituted, retransformed]       println["Re-Transformed:  \$retransformed\n"]        println["Evaluated solution: " + eval[retransformed] + "\n"]    println[] } ```