# Message Boards

Posted 4 months ago
560 Views
|
3 Replies
|
0 Total Likes
|
 Hello, it could be, that plenty of people asked this question already. I didn't search the right way. Sorry!My Problem is with very basic usage of Mathematica:First I define my new Function: myFunction[x_, y_] := x^2 - x^4 then I define the gradient of this function as a function: myGradient[x_, y_] := Grad[myFunction[x, y], {x, y}] When I want to StreamPlot[myGradient[x,y], {x, -2, 2}, {y, -2, 2}] I got an empty diagram. When I use the output of the second last command (myGradient...) the Plotting works fine (StreamPlot[%6, {x, -2, 2}, {y, -2, 2}]).Why does it not work like this and how do I do it right? In general I want to use the output of some input as the value of a function.Thanks!
3 Replies
Sort By:
Posted 4 months ago
 Suppose StreamPlot starts by calculating what to display for x= -2 and y= -2.So it calls myGradient[-2,-2]Your definition of myGradient then starts to calculate Grad[myFunction[-2,-2],{-2,-2}]You can probably see how that is going to be a problem.You might try removing the : and thus changing your code to myGradient[x_, y_] = Grad[myFunction[x, y], {x, y}] That graph will display, but might look a little odd, changing your function to x^2 - y^4 might give a StreamPlot that looks more reasonable.What the differences are between := and = and exactly why the evaluation does what it does in your example is a deeper issue. Understanding the depths of how evaluation works in Mathematica is key.You also need to be aware of any cached prior definitions of functions which can sometimes change the behavior that you might be expecting. Those might be responsible for some of the problems you are seeing. You can quit the kernel or clear individual definitions or restart Mathematica to eliminate those.
 The documentation for StreamPlot shows that StreamPlot is expecting a vector as its argument. The "Details and options" lists show three statements that apply. StreamPlot does not show streamlines at any positions for which the Subscript[v, i] etc. do not evaluate to real numbers. StreamPlot has attribute HoldAll, and evaluates the Subscript[v, i] etc. only after assigning specific numerical values to x and y. In some cases it may be more efficient to use Evaluate to evaluate the Subscript[v, i] etc. symbolically before specific numerical values are assigned to x and y. With these in mind the command to ensure a plot follows. StreamPlot[Evaluate[myGradient[x, y]], {x, -2, 2}, {y, -2, 2}] We can see that the argument was being held unevaluated by running a Trace. Trace[StreamPlot[myGradient[x, y], {x, -2, 2}, {y, -2, 2}]] I hope this was also helpful.