From: J Davis on 25 Jul 2010 01:58 Looking at this example in the documentation... points = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}}; VectorPlot[{-1 - x^2 + y, 1 + x - y^2}, {x, -2, 2}, {y, -2, 2}, VectorPoints -> points, VectorScale -> .25, Epilog -> {Red, PointSize[Medium], Point[points]}] I would prefer for the *tail* of the vector to be situated at "points" rather than the tip (or as Mathematica draws them, the base of the arrowhead at the tip). I was hoping there was an option I could call to VectorPlot to make the desired behavior happen but I don't find any. Suggestions? Or do I need to manually translate all the vectors? I was hoping to avoid that since students would be utilizing the code and I want to keep it as clean and simple as possible. Once I accomplish the task above, I was looking for a clean way to plot the level curves of a surface and then superimpose the gradient vector field---but here's the catch---where the only vectors shown were the ones along the level curves (meaning their *tails* are along the level curves). I tried RegionFunction but didn't get satisfactory results. Any help is appreciated. Thanks, John
From: Patrick Scheibe on 26 Jul 2010 06:41 Hi, this is far away from being *clean*: Take a potential and calculate the gradient. Combine DensityPlot and ContourPlot (or LineIntegralConvolution with vectorlength coloring if you like) on the potential. If it's an artificial student-example use an easy potential which you solve explicitely in one variable. So you can choose your points on the wanted level and use VectorPlot to visualize the vectors only on the curve. For the tails of the arrows I have no better idea then replacing: << VectorAnalysis` pot = x^2 + x y - Sin[y^2] f = -Most(a)Grad[pot, Cartesian[x, y, z]] dp = Show[{DensityPlot[pot, {x, -3, 3}, {y, -3, 3}, ColorFunction -> "TemperatureMap"], ContourPlot[pot == 0.2, {x, -3, 3}, {y, -3, 3}, ContourStyle -> {Thick, Black}]}]; ys = Table[y, {y, -4, 4, 6/40.}]; sol = Solve[pot == 2/10, x]; pts = Flatten[Table[{x, y} /. sol, {y, ys}], 1]; vp = VectorPlot[f, {x, -3, 3}, {y, -3, 3}, VectorPoints -> pts, VectorScale -> 0.25, VectorStyle -> {Black, Arrowheads[0.02]}] /. Arrow[{p1_, p2_}] :> Arrow[{p1 + (p2 - p1)/2, p2}]; Show[{dp, vp}] Hope this gives you a starting point. Cheers Patrick On Sun, 2010-07-25 at 01:57 -0400, J Davis wrote: > Looking at this example in the documentation... > > points = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}}; VectorPlot[{-1 - x^2 + > y, 1 + x - y^2}, {x, -2, 2}, {y, -2, 2}, VectorPoints -> points, > VectorScale -> .25, > Epilog -> {Red, PointSize[Medium], Point[points]}] > > I would prefer for the *tail* of the vector to be situated at "points" > rather than the tip (or as Mathematica draws them, the base of the > arrowhead at the tip). > > I was hoping there was an option I could call to VectorPlot to make > the desired behavior happen but I don't find any. > > Suggestions? Or do I need to manually translate all the vectors? I was > hoping to avoid that since students would be utilizing the code and I > want to keep it as clean and simple as possible. > > Once I accomplish the task above, I was looking for a clean way to > plot the level curves of a surface and then superimpose the gradient > vector field---but here's the catch---where the only vectors shown > were the ones along the level curves (meaning their *tails* are along > the level curves). I tried RegionFunction but didn't get satisfactory > results. > > Any help is appreciated. > > Thanks, > John > >
From: Jae Bum Jung on 27 Jul 2010 04:18 There's undocumented option (like "RightArrow", "LeftArrow") you can use in VectorStyle. For example, points={{-1,-1},{-1,1},{1,-1},{1,1}};VectorPlot[{-1-x^2+y,1+x-y^2},{x,-2,2},{y,-2,2},VectorPoints->points,VectorScale->.25,Epilog->{Red,PointSize[Medium],Point[points]}, VectorStyle->"LeftArrow"] or Show[{dp, VectorPlot[f, {x, -3, 3}, {y, -3, 3}, VectorPoints -> pts, VectorScale -> {.15, .2}, VectorStyle -> {"LeftArrow", Black, Arrowheads[0.02]}]}] Just make sure these are undocumented, i.e., it's subject to be changed in the future version of Mathematica. - Jaebum On 7/26/10 5:36 AM, Patrick Scheibe wrote: > Hi, > > this is far away from being *clean*: Take a potential and calculate the > gradient. Combine DensityPlot and ContourPlot (or > LineIntegralConvolution with vectorlength coloring if you like) on the > potential. If it's an artificial student-example use an easy potential > which you solve explicitely in one variable. So you can choose your > points on the wanted level and use VectorPlot to visualize the vectors > only on the curve. > > For the tails of the arrows I have no better idea then replacing: > > << VectorAnalysis` > pot = x^2 + x y - Sin[y^2] > f = -Most(a)Grad[pot, Cartesian[x, y, z]] > > dp = Show[{DensityPlot[pot, {x, -3, 3}, {y, -3, 3}, > ColorFunction -> "TemperatureMap"], > ContourPlot[pot == 0.2, {x, -3, 3}, {y, -3, 3}, > ContourStyle -> {Thick, Black}]}]; > > ys = Table[y, {y, -4, 4, 6/40.}]; > sol = Solve[pot == 2/10, x]; > pts = Flatten[Table[{x, y} /. sol, {y, ys}], 1]; > > vp = VectorPlot[f, {x, -3, 3}, {y, -3, 3}, VectorPoints -> pts, > VectorScale -> 0.25, VectorStyle -> {Black, Arrowheads[0.02]}] /. > Arrow[{p1_, p2_}] :> Arrow[{p1 + (p2 - p1)/2, p2}]; > > Show[{dp, vp}] > > Hope this gives you a starting point. > > Cheers > Patrick > > On Sun, 2010-07-25 at 01:57 -0400, J Davis wrote: >> Looking at this example in the documentation... >> >> points = {{-1, -1}, {-1, 1}, {1, -1}, {1, 1}}; VectorPlot[{-1 - x^2 + >> y, 1 + x - y^2}, {x, -2, 2}, {y, -2, 2}, VectorPoints -> points, >> VectorScale -> .25, >> Epilog -> {Red, PointSize[Medium], Point[points]}] >> >> I would prefer for the *tail* of the vector to be situated at "points" >> rather than the tip (or as Mathematica draws them, the base of the >> arrowhead at the tip). >> >> I was hoping there was an option I could call to VectorPlot to make >> the desired behavior happen but I don't find any. >> >> Suggestions? Or do I need to manually translate all the vectors? I was >> hoping to avoid that since students would be utilizing the code and I >> want to keep it as clean and simple as possible. >> >> Once I accomplish the task above, I was looking for a clean way to >> plot the level curves of a surface and then superimpose the gradient >> vector field---but here's the catch---where the only vectors shown >> were the ones along the level curves (meaning their *tails* are along >> the level curves). I tried RegionFunction but didn't get satisfactory >> results. >> >> Any help is appreciated. >> >> Thanks, >> John >> >> >
|
Pages: 1 Prev: Strange use of time... Next: Prediction Bands and Confidence Intervals |