106 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Factor
		
	
	
USING: help.markup help.syntax math math.functions ;
 | 
						|
IN: math.derivatives
 | 
						|
 | 
						|
HELP: derivative
 | 
						|
{ $values { "x" "a position on the function" } { "function" "a differentiable function" } { "m" number } }
 | 
						|
{ $description
 | 
						|
    "Approximates the slope of the tangent line by using Ridders' "
 | 
						|
    "method of computing derivatives, from the chapter \"Accurate computation "
 | 
						|
    "of F'(x) and F'(x)F''(x)\", from \"Advances in Engineering Software, Vol. 4, pp. 75-76 ."
 | 
						|
}
 | 
						|
{ $examples
 | 
						|
    { $example
 | 
						|
        "USING: math math.derivatives prettyprint ;"
 | 
						|
        "4 [ sq ] derivative >integer ."
 | 
						|
        "8"
 | 
						|
    }
 | 
						|
    { $notes
 | 
						|
        "For applied scientists, you may play with the settings "
 | 
						|
        "in the source file to achieve arbitrary accuracy. "
 | 
						|
    }
 | 
						|
} ;
 | 
						|
 | 
						|
HELP: (derivative)
 | 
						|
{ $values
 | 
						|
    { "x" "a position on the function" }
 | 
						|
    { "func" "a differentiable function" }
 | 
						|
    {
 | 
						|
        "h" "distance between the points of the first secant line used for "
 | 
						|
        "approximation of the tangent. This distance will be divided "
 | 
						|
        "constantly, by " { $link con } ". See " { $link init-hh }
 | 
						|
        " for the code which enforces this. H should be .001 to .5 -- too "
 | 
						|
        "small can cause bad convergence. Also, h should be small enough "
 | 
						|
        "to give the correct sgn(f'(x)). In other words, if you're expecting "
 | 
						|
        "a positive derivative, make h small enough to give the same "
 | 
						|
        "when plugged into the academic limit definition of a derivative. "
 | 
						|
        "See " { $link update-hh } " for the code which performs this task."
 | 
						|
    }
 | 
						|
    {
 | 
						|
        "err" "maximum tolerance of increase in error. For example, if this "
 | 
						|
        "is set to 2.0, the program will terminate with its nearest answer "
 | 
						|
        "when the error multiplies by 2. See " { $link check-safe } " for "
 | 
						|
        "the enforcing code."
 | 
						|
    }
 | 
						|
    {   "ans" number }
 | 
						|
    {   "error" number }
 | 
						|
}
 | 
						|
{ $description
 | 
						|
    "Approximates the slope of the tangent line by using Ridders' "
 | 
						|
    "method of computing derivatives, from the chapter \"Accurate computation "
 | 
						|
    "of F'(x) and F'(x)F''(x)\", from \"Advances in Engineering Software, "
 | 
						|
    "Vol. 4, pp. 75-76 ."
 | 
						|
}
 | 
						|
{ $examples
 | 
						|
    { $example
 | 
						|
        "USING: math math.derivatives prettyprint ;"
 | 
						|
        "4 [ sq ] derivative >integer ."
 | 
						|
        "8"
 | 
						|
    }
 | 
						|
    { $notes
 | 
						|
        "For applied scientists, you may play with the settings "
 | 
						|
        "in the source file to achieve arbitrary accuracy. "
 | 
						|
    }
 | 
						|
} ;
 | 
						|
 | 
						|
HELP: derivative-func
 | 
						|
{ $values { "func" "a differentiable function" } { "der" "the derivative" } }
 | 
						|
{ $description
 | 
						|
    "Provides the derivative of the function. The implementation simply "
 | 
						|
    "attaches the " { $link derivative } " word to the end of the function."
 | 
						|
}
 | 
						|
{ $examples
 | 
						|
    { $example
 | 
						|
        "USING: kernel math.derivatives math.functions math.trig prettyprint ;"
 | 
						|
        "60 deg>rad [ sin ] derivative-func call 0.5 .001 ~ ."
 | 
						|
        "t"
 | 
						|
    }
 | 
						|
    { $notes
 | 
						|
        "Without a heavy algebraic system, derivatives must be "
 | 
						|
        "approximated. With the current settings, there is a fair trade of "
 | 
						|
        "speed and accuracy; the first 12 digits "
 | 
						|
        "will always be correct with " { $link sin } " and " { $link cos }
 | 
						|
        ". The following code performs a minumum and maximum error test."
 | 
						|
        { $code
 | 
						|
            "USING: kernel math math.functions math.trig sequences sequences.lib ;"
 | 
						|
            "360"
 | 
						|
            "["
 | 
						|
            "           deg>rad"
 | 
						|
            "            [ [ sin ] derivative-func call ]"
 | 
						|
            "           ! Note: the derivative of sin is cos"
 | 
						|
            "            [ cos ]"
 | 
						|
            "       bi - abs"
 | 
						|
            "] map minmax"
 | 
						|
        }
 | 
						|
    }
 | 
						|
} ;
 | 
						|
 | 
						|
ARTICLE: "derivatives" "The Derivative Toolkit"
 | 
						|
"A toolkit for computing the derivative of functions."
 | 
						|
{ $subsections
 | 
						|
    derivative
 | 
						|
    derivative-func
 | 
						|
    (derivative)
 | 
						|
} ;
 | 
						|
 | 
						|
ABOUT: "derivatives"
 |