# Streamline plots#

class sage.plot.streamline_plot.StreamlinePlot(xpos_array, ypos_array, xvec_array, yvec_array, options)[source]#

Primitive class that initializes the StreamlinePlot graphics type

get_minmax_data()[source]#

Returns a dictionary with the bounding box data.

EXAMPLES:

sage: x, y = var('x y')
sage: d = streamline_plot((.01*x, x+y), (x,10,20), (y,10,20))[0].get_minmax_data()
sage: d['xmin']
10.0
sage: d['ymin']
10.0

>>> from sage.all import *
>>> x, y = var('x y')
>>> d = streamline_plot((RealNumber('.01')*x, x+y), (x,Integer(10),Integer(20)), (y,Integer(10),Integer(20)))[Integer(0)].get_minmax_data()
>>> d['xmin']
10.0
>>> d['ymin']
10.0

sage.plot.streamline_plot.streamline_plot(f_g, xrange, yrange, plot_points=20, density=1.0, frame=True, **options)[source]#

Return a streamline plot in a vector field.

streamline_plot can take either one or two functions. Consider two variables $$x$$ and $$y$$.

If given two functions $$(f(x,y), g(x,y))$$, then this function plots streamlines in the vector field over the specified ranges with xrange being of $$x$$, denoted by xvar below, between xmin and xmax, and yrange similarly (see below).

streamline_plot((f, g), (xvar, xmin, xmax), (yvar, ymin, ymax))


Similarly, if given one function $$f(x, y)$$, then this function plots streamlines in the slope field $$dy/dx = f(x,y)$$ over the specified ranges as given above.

PLOT OPTIONS:

• plot_points – (default: 200) the minimal number of plot points

• density – float (default: 1.); controls the closeness of streamlines

• start_points – (optional) list of coordinates of starting points for the streamlines; coordinate pairs can be tuples or lists

EXAMPLES:

Plot some vector fields involving $$\sin$$ and $$\cos$$:

sage: x, y = var('x y')
sage: streamline_plot((sin(x), cos(y)), (x,-3,3), (y,-3,3))
Graphics object consisting of 1 graphics primitive

>>> from sage.all import *
>>> x, y = var('x y')
>>> streamline_plot((sin(x), cos(y)), (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3)))
Graphics object consisting of 1 graphics primitive

sage: streamline_plot((y, (cos(x)-2) * sin(x)), (x,-pi,pi), (y,-pi,pi))
Graphics object consisting of 1 graphics primitive

>>> from sage.all import *
>>> streamline_plot((y, (cos(x)-Integer(2)) * sin(x)), (x,-pi,pi), (y,-pi,pi))
Graphics object consisting of 1 graphics primitive


We increase the density of the plot:

sage: streamline_plot((y, (cos(x)-2) * sin(x)),
....:                 (x,-pi,pi), (y,-pi,pi), density=2)
Graphics object consisting of 1 graphics primitive

>>> from sage.all import *
>>> streamline_plot((y, (cos(x)-Integer(2)) * sin(x)),
...                 (x,-pi,pi), (y,-pi,pi), density=Integer(2))
Graphics object consisting of 1 graphics primitive


We ignore function values that are infinite or NaN:

sage: x, y = var('x y')
sage: streamline_plot((-x/sqrt(x^2+y^2), -y/sqrt(x^2+y^2)),
....:                 (x,-10,10), (y,-10,10))
Graphics object consisting of 1 graphics primitive

>>> from sage.all import *
>>> x, y = var('x y')
>>> streamline_plot((-x/sqrt(x**Integer(2)+y**Integer(2)), -y/sqrt(x**Integer(2)+y**Integer(2))),
...                 (x,-Integer(10),Integer(10)), (y,-Integer(10),Integer(10)))
Graphics object consisting of 1 graphics primitive


Extra options will get passed on to show(), as long as they are valid:

sage: streamline_plot((x, y), (x,-2,2), (y,-2,2), xmax=10)
Graphics object consisting of 1 graphics primitive
sage: streamline_plot((x, y), (x,-2,2), (y,-2,2)).show(xmax=10)  # These are equivalent

>>> from sage.all import *
>>> streamline_plot((x, y), (x,-Integer(2),Integer(2)), (y,-Integer(2),Integer(2)), xmax=Integer(10))
Graphics object consisting of 1 graphics primitive
>>> streamline_plot((x, y), (x,-Integer(2),Integer(2)), (y,-Integer(2),Integer(2))).show(xmax=Integer(10))  # These are equivalent


We can also construct streamlines in a slope field:

sage: x, y = var('x y')
sage: streamline_plot((x + y) / sqrt(x^2 + y^2), (x,-3,3), (y,-3,3))
Graphics object consisting of 1 graphics primitive

>>> from sage.all import *
>>> x, y = var('x y')
>>> streamline_plot((x + y) / sqrt(x**Integer(2) + y**Integer(2)), (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3)))
Graphics object consisting of 1 graphics primitive


We choose some particular points the streamlines pass through:

sage: pts = [[1, 1], [-2, 2], [1, -3/2]]
sage: g = streamline_plot((x + y) / sqrt(x^2 + y^2),
....:                     (x,-3,3), (y,-3,3), start_points=pts)
sage: g += point(pts, color='red')
sage: g
Graphics object consisting of 2 graphics primitives

>>> from sage.all import *
>>> pts = [[Integer(1), Integer(1)], [-Integer(2), Integer(2)], [Integer(1), -Integer(3)/Integer(2)]]
>>> g = streamline_plot((x + y) / sqrt(x**Integer(2) + y**Integer(2)),
...                     (x,-Integer(3),Integer(3)), (y,-Integer(3),Integer(3)), start_points=pts)
>>> g += point(pts, color='red')
>>> g
Graphics object consisting of 2 graphics primitives


Note

Streamlines currently pass close to start_points but do not necessarily pass directly through them. That is part of the behavior of matplotlib, not an error on your part.