VectorFields2D

From WeBWorK_wiki
Jump to navigation Jump to search
This article has been retained as a historical document. It is not up-to-date and the formatting may be lacking. Use the information herein with caution.

This problem has been replaced with a newer version of this problem

Vector Field Graphs in Two Dimensions


This PG code shows how to plot a vector field in two dimensions.

You may also be interested in Slope Fields, which also provides a different way to graph a vector field.

Problem Techniques Index

PG problem file Explanation
DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"PGgraphmacros.pl",
"VectorField2D.pl",
);

TEXT(beginproblem());

$refreshCachedImages = 1;

Initialization: We need to include the macros file VectorField2D.pl.

Context()->variables->add(y=>"Real");

#
#  Create a graph canvas
#
foreach my $i (0) {
  $gr[$i] = init_graph(-5,-5,5,5,grid=>[10,10],axes=>[0,0],pixels=>[400,400]);
  $gr[$i]->lb('reset');
  foreach my $j (1..4) {
    $gr[$i]->lb( new Label(-4.7,  $j, $j,'black','center','middle'));
    $gr[$i]->lb( new Label(-4.7, -$j,-$j,'black','center','middle'));
    $gr[$i]->lb( new Label(  $j,-4.7, $j,'black','center','middle'));
    $gr[$i]->lb( new Label( -$j,-4.7,-$j,'black','center','middle'));
  }
  $gr[$i]->lb( new Label(4.7,0.2,'x','black','center','middle'));
  $gr[$i]->lb( new Label(0.2,4.7,'y','black','center','middle'));
}

VectorField2D(
graphobject => $gr[0],
Fx => Formula("x/(x^2+y^2)"),
Fy => Formula("y/(x^2+y^2)"),
xvar => "x",
yvar => "y",
xmin => -5,
xmax =>  5,
ymin => -5,
ymax =>  5,
xsamples => 10,
ysamples => 10,
vectorcolor => "blue",
vectorscale => 1.5,
vectorthickness => 2,
xavoid=>0,
yavoid=>0,
);

Setup: We create a blank graph canvas and add labels to it. Then, using the VectorField2D() subroutine, we specify the formula for the vector field and its parameters. The values for xsamples and ysamples were chosen so that the tails of the vectors would be on lattice points (this routine automatically adds one to the samples values, which is usually what you want since there are 11 integers between -5 and 5 including endpoints). You can uniformly rescale the length of all the vectors in the vector field by setting vectorscale to a different value (natural length is 1). You can avoid one point with coordinates (xavoid,yavoid) where the vector field may be undefined.

BEGIN_TEXT
This is a velocity vector field for an explosion at the origin 
that decreases in speed the farther the distance is from the origin.
$PAR
$BCENTER
\{ image(insertGraph($gr[0]),width=>400,height=>400,tex_size=>700) \}
$ECENTER
END_TEXT

Main Text: The problem text section of the file is as we'd expect.

$showPartialCorrectAnswers = 1;

ENDDOCUMENT();

Answer Evaluation: We didn't ask any questions, so this is uninteresting.

Problem Techniques Index




It is also possible, though not recommended, to plot a two dimensional vector field using LiveGraphics3D.

Problem Techniques Index

PG problem file Explanation
DOCUMENT();

loadMacros(
"PGstandard.pl",
"MathObjects.pl",
"parserVectorUtils.pl",
"PGcourse.pl",
"LiveGraphicsVectorField2D.pl",
);


TEXT(beginproblem());

Initialization:

Context("Numeric");
Context()->variables->are(x=>"Real",y=>"Real",z=>"Real");

$plot = VectorField2D(
Fx => Formula("y"),
Fy => Formula("-x"),
xvar => 'x',
yvar => 'y',
xmin => -1,
xmax =>  1,
ymin => -1,
ymax =>  1,
xsamples => 4,
ysamples => 4,
axesframed => 1,
xaxislabel => "X",
yaxislabel => "Y",
vectorcolor => "RGBColor[1.0,0.0,0.0]",
vectorscale => 0.25,
vectorthickness => 0.01,
outputtype => 4,
);

Setup: The VectorField2D() routine provided by the LiveGraphicsVectorField2D.pl macro is different from the routine by the same name provided by the VectorField2D.pl macro. Its features are the same as for vector fields in three dimensions.

Context()->texStrings;
BEGIN_TEXT
$BCENTER
\{ 
Live3Ddata(
$plot,
image => "cool-vector-field.png", 
size => [400,400],
tex_size => 600,
tex_center => 1,
scale => 1.5,
Live3D => [MOUSE_DRAG_ACTION => "NONE"]
);
\}
$ECENTER
END_TEXT
Context()->normalStrings;

Main Text: This is just like plotting a three dimensional vector field using the LiveGraphics3D.pl macro, except that we must specify Live3D => [MOUSE_DRAG_ACTION => "NONE"] so that the graph is immovable.

$showPartialCorrectAnswers = 1;

ENDDOCUMENT();

Answer Evaluation:

Problem Techniques Index