2012-11-09 60 views
2

我需要在指定的时间间隔内绘制一个函数。函数为f1,代码如下所示,间隔为[-7,-3]; [-1,1]; [3,7],步长为.01。当我执行程序时,什么都没有画出来。有任何想法吗?Python龟图形,如何在一段时间内绘制函数?

import turtle 
from math import sqrt 

wn = turtle.Screen() 
wn.bgcolor("white") 
wn.title("Plotting") 
mypen = turtle.Turtle() 
mypen.shape("classic") 
mypen.color("black") 
mypen.speed(10) 

while True: 
try: 
    def f1(x): 
     return 2 * sqrt((-abs(abs(x)-1)) * abs(3 - abs(x))/((abs(x)-1)*(3-abs(x)))) * \ 
(1 + abs(abs(x)-3)/(abs(x)-3))*sqrt(1-(x/7)**2)+(5+0.97*(abs(x-0.5)+abs(x+0.5))-\ 
3*(abs(x-0.75)+abs(x+0.75)))*(1+abs(1-abs(x))/(1-abs(x))) 

    mypen.penup() 

    step=.01 
    startf11=-7 
    stopf11=-3 
    startf12=-1 
    stopf12=1 
    startf13=3 
    stopf13=7 
    def f11 (startf11,stopf11,step): 
     rc=[] 
     y = f1(startf11) 
     while y<=stopf11: 
      rc.append(startf11) 
      #y+=step 
      mypen.setpos(f1(startf11)*25,y*25) 
      mypen.dot() 
    def f12 (startf12,stopf12,step): 
     rc=[] 
     y = f1(startf12) 
     while y<=stopf12: 
      rc.append(startf12) 
      #y+=step 
      mypen.setpos(f1(startf12)*25, y*25) 
      mypen.dot() 
    def f13 (startf13,stopf13,step): 
     rc=[] 
     y = f1(startf13) 
     while y<=stopf13: 
      rc.append(startf13) 
      #y+=step 
      mypen.setpos(f1(startf13)*25, y*25) 
      mypen.dot() 

    f11(startf11,stopf11,step) 
    f12(startf12,stopf12,step) 
    f13(startf13,stopf13,step) 

except ZeroDivisionError: 
    continue 
+0

因为mypen.penup()? – palsch

+1

不,@ palsch,那是不正确的。OP使用'turtle.dot()'来绘制哪个输出点独立于笔的向上或向下。 – cdlane

回答

0

我想因为f1返回一个虚数值。 我从字面上刚开始学习python就像15分钟前,我开始与乌龟。所以我可能不会完全明白,并且会关闭......但总的来说,我明白代码...

但是,当你定义它;这一点;你的第二任期。

的sqrt(( - ABS(ABS(X)-1))

你要得到一个负数的平方根这不是笛卡尔平面的数学不知道如何解释,没有。想法龟怎么解释它,但这是我的第一个猜测......

0

你正在试图绘制一个使用buggy绘图代码的越野车功能,你需要分别调试它们,而不是在一起,让我们从函数开始。看问题的三个间隔的开始,-7,-1和3,并且对其调用f1(),我们得到:

-7 -> 0.0 
-1 -> division by zero 
3 -> division by zero 

在第一,永远不会启动ploting为f1(startf11)> stopf11又名-3循环开始前:

y = f1(startf11) 
while y <= stopf11: 

在其它两种情况下,没有y由于作为

的被零除
except ZeroDivisionError: 
    continue 

不能解决这个问题。所以没有阴谋。这可能无关紧要,因为绘图代码本身不起作用。所有这三个f1*功能(这是相同的BTW这是没有意义的)做的事:

while y <= stop: 

y永远不会改变所以它是一个无限循环。注释掉y += step会有所帮助,但代码中的位置不同。此外,它试图为每个单独的屏幕像素绘制100个值!这可以通过改变坐标系来适应,但我不会在这里进行讨论,只需将每个屏幕像素的值减少到10个值就可以加快结果。

让我们重新开始使用一个简单的测试功能的绘图代码:

def f1(x): 
    return x 

和获取绘制成功地。这里是我的绘制代码的返工:

from turtle import Turtle, Screen 

def f1(x): 
    return x # dummy test plot 

wn = Screen() 

mypen = Turtle(visible=False) 
mypen.speed('fastest') 
mypen.penup() 

def f11(start, stop, step): 

    y = f1(start) 

    while y <= stop: 

     try: 
      mypen.setpos(f1(start) * 25, y * 25) 
      mypen.dot() 
      y += step 

     except ZeroDivisionError: 
      continue 

step = 0.1 # increased from 0.01 for debugging/speed 

startf11 = -7 
stopf11 = -3 

f11(startf11, stopf11, step) 

startf12 = -1 
stopf12 = 1 

f11(startf12, stopf12, step) 

startf13 = 3 
stopf13 = 7 

f11(startf13, stopf13, step) 

wn.exitonclick() 

这让我们的测试结果:

enter image description here

这似乎合理的为我们的测试功能。现在,您可以使用工作绘图仪更改坐标系以获得更高分辨率的绘图和/或调试您的功能f1()