A maior rede de estudos do Brasil

Grátis
433 pág.
Apostila PyOpenGL

Pré-visualização | Página 50 de 50

line of code. So, if you place try: above the equation set (indenting the equations!) 
 197
and except: after the equation set (with an indented pass below except:) we 
should be able to use any of these equations without the fear of generating an error. 
 
9) We are going to take a closer look at the function z = z - sin(z)/cos(z) from 
exercise 8. The figure that represents this plot is found in figure Exercise 7a. 
Uncomment the equation for this function (commenting all others!) into your 
Newton’s method program and modify hcenter to hcenter = 1.55 and axrng to 
axrng = 0.50. These modifications should center and zoom into the interesting 
figure on the right side of the graphics window. Your plot should look something like 
the plot shown in figure Exercise 9a. Now set axrng = 0.30 and run the 
program again. You should see something like figure Exercise 9b. 
 
10) We don’t have to use integer powers when using Newton’s Method. We can find the 
complex iteration of z3.5 – 1 just as easily as we can an integer power. Modify the 
equation line as follows (or simply add this equation to your list): 
 
 z = z - (z**3.5 - 1)/(3.5*z**2.5) 
 
 Using the color code block from the original Newton’s Method program, we will get a 
plot similar to the one shown in figure Exercise 10a. A somewhat more 
interesting plot can be found by comment out the original color code block (as we did 
in exercise 4) and substituting this color assignment prior to the glVertex2f 
statement: 
 
 if z.imag < 0: 
 glColor3f(sin(n),cos(n),sin(z.real)) 
 else: 
 glColor3ub(5*abs(z),cos(z.real),1.5*abs(z)) 
 
 The resulting plot is found in figure Exercise 10b. I didn’t say it was pretty! 
 
 You can also try other z equations (with any color scheme) such as: 
 
 z = z - (z**4.5 - 1)/(4.5*z**3.5) 
 z = z – (z**4.8 – 1)/(4.8*z**3.8) 
 z = z – (z**3.75 – 1)/(3.75*z**2.75) 
 
 By now you may have some idea of how to find the derivative of a simple polynomial 
function? If so, you might try making up some of your own z equations. 
 
11) Here is a "small" list of equations you may want to try in your program. Make certain 
that you comment out every equation except the one you want to try! 
 
# Newton's Method Equation 
#z = z - (sin(z)/cos(z) - 1)/(1/((cos(z)*cos(z)))) 
#z = z - (z**4 + .84*z**2 - .16)/(4*z**3 + 1.68*z) 
#z = z - (z**3 - 1)/(3*z**2) 
#z = z - sin(z)/cos(z) 
z = z - (z**5 - 1)/(5*z**4) 
#z = z - log(z)/(1/z) 
#z = z - (z**3 + z**2 + z - 2)/(3*z**2 + 2*z + 1) 
#z = z - (z**4 + .84*z**3 + .16*z - 2)/(4*z**3 + 2.52*z**2 + .16) 
#z = z - (z**4 + .84*z**2 - .16)/(4*z**3 + 1.68*z) 
 198
#z = z - (z**3 - 5*z)/(3*z**2 - 5) 
#z = z - (sin(z*z) - z*z + 1)/(2*z*cos(z*z) - 2*z) 
#z = z - (z**3.7 - 1)/(3.7*z**2.7) 
#z = z - (sin(z*z) - z*z*z + cos(z*z*z))/(2*z*cos(z*z) - 3*z*z - 3*z*z*sin(z*z*z)) 
#z = z - (z**z - 3**z - z**3 - 1)/((1+log(z))*z**z - log(3)*3**z - 3*z**2) 
 
Can you tell which equation we are trying to plot? 
 
One final modification you might try is to uncomment TWO equations at the same 
time. What will happen? I don't know... try it! Here's what I THINK will happen. z 
will be calculated using the first equation and then the complex value for z will be 
"fed" to the second equation for calculation/iteration. Certainly the plot will take 
longer to create. What is uncertain is how interesting the final result will be. This is 
an excellent opportunity for you to experiment! 
 
12) There are some excellent freeware fractal programs available online. I would 
recommend that you Google for “fractals” and “freeware” and see what you can find. 
Some of the current programs that you might find very interesting are “Xaos”, 
“Chaospro”, and “Fractint”. There may be others as well. What we are programming 
here can hardly be termed a professional application, but hopefully you will get the 
flavor of fractals and find them interesting enough to explore them further on your 
own. Another interesting program is Gnofract 4D, which runs on linux. You also 
should definitely look up "Newton's Method Fractals" and see what you find. You 
may be able to take the information you find online and convert the equations to a 
Python program. Give yourself extra credit if you can do so! 
 
13) One of the most important aspects of a computer program is interactivity. In a future 
section we will explore mouse interaction with our graphics window. In this exercise 
we are going to add some additional keyboard options. Until now, in order to view a 
different Newton's Method fractal we had to comment and uncomment specific 
equations. What if we could simply press a number key and have the equations 
automatically change for us? Here's how we might do that. First, add a new global 
variable, global newtfrac, to the variable section at the beginning of the program 
and set its initial value equal to 1 (How?). Add the following def keyboard 
function to your program: 
 
 def keyboard(key, x, y): 
 global newtfrac 
 if key == chr(27) or key == "q": 
 sys.exit() 
 else: 
 newtfrac = eval(key) 
 if newtfrac > 0 and newtfrac < 10: 
 glutPostRedisplay() 
 
Since we are going to change the value of the newtfrac variable, we need to 
declare it as global in this def keyboard function. The program will end if we 
press the "q" or "Esc" keys. If we press any other key, its numeric value will be 
stored in newtfrac by the eval(key) function. If this value is between 0 and 10 
(in other words, 1 through 9), then we update the display. Note: What statement 
must we add to def main() in order for the keyboard function to work? The real 
 199
work is done in the display function. Modify your display function by changing/adding 
the following: 
 
 while n < 1000 and endit == 0: 
 n+=1 
 old = z 
 
 # Newton's Method Equation 
 try: 
 if newtfrac == 1: 
 z = z - (z**3 - 1)/(3*z**2) 
 elif newtfrac == 2: 
 z = z - (z**4 + .84*z**2)/(4*z**3 + 1.68*z) 
 elif newtfrac == 3: 
 z = z - (z**5.4-1)/(5.4*z**4.4) 
 elif newtfrac == 4: 
 z = z - sin(z)/cos(z) 
 elif newtfrac == 5: 
 z = z - (z**5 - 1)/(5*z**4) 
 elif newtfrac == 6: 
 z = z - log(z)/(1/z) 
 elif newtfrac == 7: 
 z = z - (z**3.7 - 1)/(3.7*z**2.7) 
 elif newtfrac == 8: 
 z = z - (3**z - 1)/(log(3)*3**z) 
 else: 
 z = z - (z**3 - 5*z)/(3*z**2 - 5) 
 except: 
 pass 
 
 if abs(z - old) < 0.000001: 
 endit = 1 
 
 
The above is not completely new, obviously. Simply modify the appropriate section 
of code in the def drawnewton() function to match what you see here. Run the 
program. Once the original Newton's Method fractal has finished drawing, press any 
number key other than 1 or 0 and see what happens. How does this work? Look 
carefully at the if...elif...else code block and see if you can understand the 
logic. How does this particular block of code work with the keyboard function? Why 
did I not need to specifically check for the number "9"? If 9 works, why doesn't the 
number "0" trigger the else statement? 
 
 200
 Exercise 1 Exercise 2 
 
 Exercise 3 Exercise 4 
 
 Exercise 5a Exercise 5b 
 201
 Exercise 5c Exercise 6 
 
 Exercise 7a Exercise 7b 
 
 Exercise 7c Exercise 7d 
 202
 Exercise 7e Exercise 7f 
 
 Exercise 9a Exercise 9b 
 
 Exercise 10a Exercise 10b 
 203
Addendum: 
 
 I want to encourage you to explore some of these (and other) fractals on your 
own. Try zooming in on various locations and see what happens. If you generate an 
error message, what might be causing the error? Are you dividing by zero? Figure 
glitch on the next page illustrates another type

Crie agora seu perfil grátis para visualizar sem restrições.