use functionUtils.frink use allTransforms.frink /** This program tries to help you find a Newton's method iteration for a particular expression. */ NewtonsMethod[f] := { body = functionBody[f] df = transformExpression[makeDerivative[f]] vars = functionArgumentsAsSymbols[f] // println["f = " + inputForm[body]] // println["df = " + inputForm[df]] return transformExpression[vars@0 - body/df] } /** This program tries to help you find a Halley's method iteration for a particular function . */ HalleysMethod[f] := { body = functionBody[f] df = transformExpression[makeDerivative[f]] df2 = transformExpression[makeDerivative[f, 2]] vars = functionArgumentsAsSymbols[f] // println["f = " + inputForm[body]] println["df = " + inputForm[df]] println["df2 = " + inputForm[df2]] return transformExpression[vars@0 - 2 body df / (2 df^2 - df df2)] } symbolicMode[true] /** Newton's method solves for the roots or zeroes of a function f, that is, where f[x]=0 The below creates a two-argument anonymous function that implicitly encodes the condition x^2 - n = 0 or, alternately, x^2 = n or, alternately, x = sqrt[n] which is what we really want to be solving in this case. We want to find a way to transform the equation we want to be solving, e.g. x = sqrt[n] into the form that Newton's method implicitly expects. Which appears to be solving for n, (e.g. n = x^2) and then transforming that into (x^2 - n) === 0 or (n - x^2) === 0 */ f = {|x, n| x^2 - n} println["The next term (Newton's Method) is given by iterating: "] println[inputForm[NewtonsMethod[f]]] println[] println["The next term (Halley's method) is given by iterating: "] println[inputForm[HalleysMethod[f]]]