Re: 3D graph with assumptions

*To*: mathgroup at smc.vnet.net*Subject*: [mg50889] Re: [mg50814] 3D graph with assumptions*From*: Garry Helzer <gah at math.umd.edu>*Date*: Sun, 26 Sep 2004 05:31:52 -0400 (EDT)*References*: <200409220411.AAA18719@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Mukhtar, Some years ago I wrote a package to address this question using Mathematica version 2. A description finally appeared in The Mathematica Journal volume 8, number 4 (Title: Clipping Polygons). A syntax change in version 5 broke the package but it can be repaired by replacing FindRoot[f[p+t(q-p)]==0,{t,{0,1}}] with FindRoot[f[p+t(q-p)]==0,{t,0,1}] throughout (one less pair of curly braces). The package handles general situations. Here is a rough and ready approach for your case. The idea is to chop your set of xy values into small polygons (triangles or quadrilaterals), map the polygons to space, and display them. Mapping the polygons is easy. Suppose that your function is f[x,y] and poly2D is a list of polygons in the plane. Define (note the braces) F[{x_,y_}]:={x,y,f[x,y]}. The list of transformed polygons is displayed by poly3D=poly2D/.Polygon[a_]:>Polygon[F/@a] Show[Graphics3D[poly3D], . . . your choice of options here. . .] Note that this code is indifferent to the nesting levels at which the polygons appear in the lists. The annoying part is producing the list poly2D. Since you are using the area under the curve h[x], start with, say, the left endpoint Riemann sum. d=(b-a)/n poly2D=Table[Polygon[{{a+k d,0},{a+(k+1)d,0},{a+(k+1)d,h[a+k d},{a+(k+1)d,h[a+k d}}],{k,0,n}] These rectangles need to be chopped up into shorter rectangles. A function that will chop each rectangle in a list into two rectangles is(we will need the segment ab horizontal) halve[L_]:=L/.Polygon[{a_,b_,c_,d_}]:>{{Polygon[{a,b,(b+c)/2,(a+d)/ 2}],Polygon[{(a+d)/2,(b+c)/2,c,d}]} To split each Riemann rectangle horizontally into 2^m rectangles use poly2D=Nest[halve,poly2D,m] The rectangles in poly2D can be made as small as you like by choosing m and n large enough. I have come to believe that, except in the simplest cases, it is better to ignore Mathematica's built in Plot functions and go directly to the primitives. On Sep 22, 2004, at 12:11 AM, Mukhtar wrote: > Suppose I have f(x,y) that I need to Plot in 3D, however, the range of > x is (0,1) while the range of y is (0,g(x)), where g(x) is some > explicit function of x, say x^1/2. Is there a way to do it since > specifying it directly the way I outlined above in Plot3D gives me the > error message that "Plot3D :: plln: Limiting value g(x) in {y,0,g(x)} > is not a machine-size real number". Perhaps I can do this indirectly > by plotting two surfaces and then consider the relevant part of > surface f(x,y), however, it would look ugly. Thanks. > > Garry Helzer gah at math.umd.edu

**References**:**3D graph with assumptions***From:*mbekkali@gmail.com (Mukhtar)