Image:Graph of sliding derivative line.gif
From Wikipedia, the free encyclopedia

No higher resolution available.
Graph_of_sliding_derivative_line.gif (250 × 250 pixels, file size: 202 KB, MIME type: image/gif)
Summary
| Description | Boulder, Colorado Graph of sliding derivative line |
|---|---|
| Source |
self-made |
| Date |
February 19, 2008 |
| Author |
dino ( talk) |
| Permission ( Reusing this image) |
See below. |
Licensing
![]() |
I, the copyright holder of this work, hereby release it into the public domain. This applies worldwide. In case this is not legally possible, |
I made this with SAGE, an open-source math package, and release it to the world.
A version of the source code lives at this link.
A wikipedian asked, so the SAGE source code I used to generate the image follows, verbose documentation and all.
Below. The current image has different constants than the original code I posted,
number_of_plot_points = 50
and
figure_size = 2.5
Anyone wishing to use/modify/shoot at this source code is free to:
#*****************************************************************************
# Copyright (C) 2008 Dean Moore < deanlorenmoore@gmail.com >,
# < dino@boulder.net >
#
# Distributed under the terms of the GNU General Public License (GPL)
# http://www.gnu.org/licenses/
#*****************************************************************************
#################################################################################
# #
# What this program does, needed input, boilerplate info & disclaimers: #
# #
# This program was written for the mathematical package SAGE (by implication, #
# using the Python programming language), and animates a sliding derivative #
# line to a given one-variable single-valued function, defined as *f* (below). #
# #
# A picture paints a thousand words, and it's best to look at some sample #
# output. In short, it's an animated illustration of a standard Calc I #
# concept. #
# #
# Once function *f* is defined, parameters *a* and *b* define the top & bottom #
# x-values, as the interval [a, b]. The program is designed to churn without #
# further input, doing all needed calculations after definition of the #
# function & interval; the user may wish to vary a few other parameters as: #
# #
# The number of frames in the final "movie," the length, thickness & color of #
# the function's curve, the length, thickness & color of the tangent line, and #
# a few others (below documentation). #
# #
# Caveat: don't use unbounded functions, e.g., f(x) = 1/x on (0,1]. No #
# functions with unbounded first derivatives, e.g., f(x) = x^(1/3) about x = 0. #
# #
# Doubtless there are other ways to break the code of which I have not #
# thought. If the user finds it amusing, fine with me. #
# #
# User-input material: #
# #
# f: The function. No unbounded functions; no unbounded first derivatives. #
# #
# a: lower x-bound. #
# b: upper x-bound. #
# #
# number_of_plot_points: Number of frames in final "movie." #
# #
# thickness_of_curve: Thickness of function's curve. #
# color_of_curve: By name. #
# #
# length_of_deriv_line: Length of line that slides along, always tangent to #
# the function *f*; its slope always the derivative of #
# *f* at point of tangency. #
# thickness_deriv_line: Thickness of derivative line. #
# color_of_deriv_line: By name. #
# #
# sliding_point_size: By name, how big is the tracing point See output. #
# color_of_sliding_point: A point traces the curve; this is its colour. #
# #
# figure_size: Regulates size of final image. #
# #
# delay_between_frames: Delay between frames of final "movie." #
# #
# The code isn't that error-checking, assuming certain numbers positive, #
# assuming b > a, assuming *f* "nice" with a "nice" derivative. The program #
# isn't designed to be idiot-proof. #
# #
#################################################################################
#################################################################################
# #
# Why did I write it? A challenge to learn more, to do it in SAGE. I looked #
# at < http://en.wikipedia.org/wiki/Derivative > & thought, "Gee, maybe some #
# more lively images. It's 2008." #
# #
# The code's not perfect. The sliding line runs faster where the curve is #
# steep, and kind of slow where it's flat. This is an unavoidable consequence #
# of breaking interval [a, b] into equal subintervals. I can scope in my head #
# one way to make the sliding line run at a somewhat consistent rate, but it #
# would be CPU-intensive & bothersome. #
# #
# Written by Dean Moore, February, 2008. #
# #
#################################################################################
# User-defined material:
f = x*sin(x^2) # The function.
a = -1 # Bottom x-value
b = 3 # Top x-value
number_of_plot_points = 125 # Number of points at which the function & derivative
# are sampled: the more, the smoother runs the final
# "movie" -- and the slower the program runs, the
# slower the "movie" & the more bytes to the image.
thickness_of_curve = 0.75 # Thickness of function's curve.
color_of_curve = (0, 0, 1) # By name.
length_of_deriv_line = 3 # Length of "sliding" derivative line.
thickness_deriv_line = 1 # Thickness of derivative line.
color_of_deriv_line = (1, 0, 0) # By name.
sliding_point_size = 20 # By name; how big is the tracing point.
color_of_sliding_point = (0, 0, 0) # A point traces the curve; this is its colour.
figure_size = 4 # Regulates size of final picture. The bigger, the
# more bytes / image, and the slower it runs.
delay_between_frames = 0 # Time between "frames" of final "movie."
# End user-defined material.
# The rest of the program churns without user input. The disinterested user
# may safely ignore the rest, unless s/he wishes to modify the code -- or I
# made some error I didn't catch.
# Top matter, no nice way to classify. Stuff that needs done:
v = [] # This will hold graphic image of function's curve.
length_of_deriv_line /= 2 # We draw half below, half
# above. User doesn't need to know this.
# We use the same loop several times, from bottom of interval at *a* to
# to top at *b* by an obvious step; put the range in a parameter. Note
# we include the endpoint:
loop_range = srange(a, b + (b - a)/number_of_plot_points, (b - a)/number_of_plot_points) # Done with this.
# We use each function value three times; place them
# in a dictionary for efficiency.
function_values = {} # Blank dictionary to hold function values.
for i in loop_range:
function_values[i] = f(i) # Done filling dictionary.
f_prime = f.derivative() # Derivative of function *f* (above).
def deriv_line(x0,x): # A function of two variables:
return f_prime(x0)*x + ( f(x0) - f_prime(x0)*x0 ) # Draws a line through (x0, f(x0)),
# slope (df/dx)(x0). The derivative
# and function are evaluated at
# "fixed" *x0*; the "real" independent
# variable is *x*. Parens are only
# for clarity, y = mx + b form.
# End top matter.
# The next code is more involved. We need to make a sliding derivative
# line of constant length. While experimenting I tried from, say, one
# below & one above on the x-axis, and it looked awful.
# Define four dictionaries that will hold coordinates of line segments:
bottom_x_points = {}
bottom_y_points = {}
top_x_points = {}
top_y_points = {}
# Next loop populates the dictionaries with coordinates of line segments of
# constant length *length_of_deriv_line* (well, its original value, twice
# its current value):
for i in loop_range:
theta = RDF(arctan(f_prime(i))) # Angle of derivative line.
# Use trig & basic calc
# to verify next block:
c = RDF(cos(theta)) # Both of these are
s = RDF(sin(theta)) # used twice, never
# outside this block.
# Note sign patterns in next:
bottom_x_points[i] = i - length_of_deriv_line*c # Bottom x-value of deriv line
bottom_y_points[i] = function_values[i] - length_of_deriv_line*s # Bottom y-value of deriv line.
top_x_points[i] = i + length_of_deriv_line*c # Top x-value of deriv line
top_y_points[i] = function_values[i] + length_of_deriv_line*s # Top y-value of deriv line.
# Done computing line segments that comprise the sliding derivative line.
# We find max & min x-values for the graph, so the display looks nice:
max_x_val = max(max(top_x_points.values()), max(bottom_x_points.values())) # Not perfect, but if parameter
min_x_val = min(min(top_x_points.values()), min(bottom_x_points.values())) # *number_of_plot_points* is large
# enough for a fairly fine "mesh,"
# good enough.
# We find max & min y-values for graph:
max_y_val = max(max(top_y_points.values()), max(bottom_y_points.values())) # See above documentation of
min_y_val = min(min(top_y_points.values()), min(bottom_y_points.values())) # *max_x_val* & *min_x_val*.
# Graph the sliding derivative line:
sliding_deriv_line = animate(line([(bottom_x_points[i], bottom_y_points[i]),
(top_x_points[i], top_y_points[i]
)],
thickness = thickness_deriv_line,
rgbcolor = color_of_deriv_line)
for i in loop_range
)
# Graph the point that slides along the graph.
sliding_points = animate([point((i,function_values[i]),
rgbcolor = color_of_sliding_point,
pointsize = sliding_point_size)
for i in loop_range
],
xmin = min_x_val, ymin = min_y_val,
xmax = max_x_val, ymax = max_y_val,
figsize = [figure_size,figure_size]
)
# Of note on next: when I first did the graph, it was "wiggly." This
# led to a note to sage-support, which led to a ticket, which someone
# fixed (thanks!), but the fix won't come out until the next version
# of SAGE. So for this code I use a work-around.
# Animate the graph:
graph = (plot(f, [a, b], thickness = thickness_of_curve,
rgbcolor = color_of_curve))
for i in loop_range:
v.append(graph) # End of i-loop.
curve = animate(v) # Must be done.
# Now show the final "movie":
(curve + sliding_points + sliding_deriv_line).show(delay = delay_between_frames)
# Done with program.
--- Done source code.
File history
Click on a date/time to view the file as it appeared at that time.
| Date/Time | Dimensions | User | Comment | |
|---|---|---|---|---|
| current | 03:40, 22 February 2008 | 250×250 (202 KB) | Oleg Alexandrov ( Talk | contribs) | (Reverted to version as of 02:46, 22 February 2008, my image is bigger than this) |
| revert | 03:37, 22 February 2008 | 174×200 (294 KB) | Oleg Alexandrov ( Talk | contribs) | (Crop a bit) |
| revert | 02:46, 22 February 2008 | 250×250 (202 KB) | Dino ( Talk | contribs) | (Fewer bytes, about 208 kb) |
| revert | 01:41, 21 February 2008 | 500×500 (842 KB) | Dino ( Talk | contribs) | (Got rid of "wiggling"; thanks to some person on sage-support for fixing this ticket; I did a work-around.) |
| revert | 17:16, 20 February 2008 | 400×400 (550 KB) | Dino ( Talk | contribs) | |
| revert | 02:32, 20 February 2008 | 400×400 (547 KB) | Dino ( Talk | contribs) | ({{Information |Description=Graph of sliding derivative line |Source=self-made |Date=February 19, 2008 |Location=Boulder, Colorado |Author=~~~ |other_versions= }}) |
See the setup instructions for more information.
File links
The following file is a duplicate of this file:
