New package for drawing direction fields with gnuplot



Dnia Fri, 19 Nov 2010 15:11:39 -0700, Robert Dodier napisa?(a):

> Evaluating f(x, y) with symbolic arguments triggers the error. Try
> postponing evaluation of f, e.g. drawdf(f, ...) (not sure if that works)
> or drawdf('(f(x, y)), ...).
> 
> HTH
> 
> Robert Dodier
> 
> On 11/19/10, Adam Majewski <adammaj1 at o2.pl> wrote:
>> Dnia Fri, 19 Nov 2010 15:11:14 -0500, Mark H Weaver napisa?(a):
>>
>>> Adam Majewski <adammaj1 at o2.pl> writes:
>>>> soln_at draw field lines, so how can I draw equipotential lines ?
>>>
>>> With the attached patch to drawdf.mac, does the following command do
>>> what you want?
>>>
>>> drawdf(x*x+y*y, [x,-2,2], [y,-2,2],
>>>   field_color=gray, proportional_axes='xy, aspect_ratio=1, color=red,
>>>   solns_at(makelist([k/2,-k/2],k,-3,3)), color=green,
>>>   equipots_at(makelist([k/2,k/2],k,-3,3)))$
>>>
>>> Note that equipots_at uses the same numerical integrator as solns_at,
>>> so you may sometimes have to mess around with options such as duration
>>> and tstep to get good results.
>>>
>>>     Mark
>>>
>>>
>>> --- drawdf-orig.mac	2010-11-17 20:09:09.000000000 -0500 +++ drawdf.mac
>>> 2010-11-19 14:57:11.000000000 -0500 @@ -204,6 +204,13 @@
>>>    if curve=[] then curve:[pt],
>>>    [ 'point_type='none, funmake('soln_curve, [curve, 'soln_arrows =
>>>    soln_arrows]) ] )$
>>>
>>> +/*
>>> + * Ideally, this should probably detect and remove overlaps in the
>>> curve. + */
>>> +equipotential_plot(pt) := block(
>>> +  [ dxdt:dydt, dydt:-dxdt, soln_arrows:false, soln_direction:'both ],
>>> +
>>>  solution_plot(pt) )$
>>> +
>>>  linearize_at(pt, derivs, vars) := block(
>>>    [ subs: map("=", vars, pt) ],
>>>    subst(subs, apply('matrix, outermap('diff, derivs, vars))))$
>>> @@ -348,6 +355,10 @@
>>>      then pre_graphics: append(reverse(solution_plot(args(param))),
>>>      pre_graphics) else if operatorp(param, 'solns_at) then for pt in
>>>      list_of_points_from(param) do pre_graphics:
>>>      append(reverse(solution_plot(pt)), pre_graphics)
>>> +    else if operatorp(param, 'equipot_at) +    then pre_graphics:
>>> append(reverse(equipotential_plot(args(param))), pre_graphics) +   
>>> else if operatorp(param, 'equipots_at) +    then for pt in
>>> list_of_points_from(param) do pre_graphics:
>>> append(reverse(equipotential_plot(pt)), pre_graphics)
>>>      else if operatorp(param, 'saddle_at)
>>>      then pre_graphics: append(reverse(saddle_plot(args(param))),
>>>      pre_graphics) else if operatorp(param, 'saddles_at)
>>> _______________________________________________ Maxima mailing list
>>> Maxima at math.utexas.edu
>>> http://www.math.utexas.edu/mailman/listinfo/maxima
>>
>> I have done :
>>
>>  patch < drawdf-equipot.diff
>> (Stripping trailing CRs from patch.)
>> patching file drawdf.mac
>> Hunk #1 succeeded at 206 (offset 2 lines). Hunk #2 succeeded at 357
>> (offset 2 lines).
>>
>>
>> Yes, it works fine.
>>
>>
>> I have also tried :
>>
>> f(zx,zy):=block([i:0,zx2,zy2,cx:0,cy:0,ER2:4,iMax:20],
>> zx2:zx*zx,zy2:zy*zy,
>> while zx2+zy2<ER2 and i<iMax do
>> (zy:2*zx*zy+cy,zx:zx2-zy2+cx,zx2:zx*zx,zy2:zy*zy,i:i+1), return(i));
>>
>>
>> drawdf(f(x,y), [x,-2,2], [y,-2,2]);
>>
>> Unable to evaluate predicate y^2+x^2<4 #0: f(zx=x,zy=y)
>>  -- an error. To debug this try: debugmode(true);
>>
>> Adam
>>
>> _______________________________________________ Maxima mailing list
>> Maxima at math.utexas.edu
>> http://www.math.utexas.edu/mailman/listinfo/maxima
>>
> _______________________________________________ Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima




(%i10) drawdf('f(x,y), [x,-2,2], [y,-2,2]);
draw: graphical 2d object errexp1 is not recognized
#0: drawdf(params=['f(x,y),[x,-2,2],[y,-2,2]])
 -- an error. To debug this try: debugmode(true);


(%i11) drawdf(f, [x,-2,2], [y,-2,2]);
Warning-> f is an undefined global variable.
Maxima encountered a Lisp error:
 Argument X is not a NUMBER:
   (#1=(MPLUS . #2=(SIMP)) 1.9333333333333327
    (#3=(MTIMES . #2#) -0.5
     (#4=(MEXPT . #2#) (#1# 87.890625 (#3# 47.265624999999986 (#4# $F 2)))
      -0.5)))
Automatically continuing.
To enable the Lisp debugger set *debugger-hook* to nil.

Adam