Download or view functionUtilsTest.frink in plain text format
/** 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[]
}
Download or view functionUtilsTest.frink in plain text format
This is a program written in the programming language Frink.
For more information, view the Frink
Documentation or see More Sample Frink Programs.
Alan Eliasen, eliasen@mindspring.com