我需要在指定的时间间隔内绘制一个函数。函数为f1,代码如下所示,间隔为[-7,-3]; [-1,1]; [3,7],步长为.01。当我执行程序时,没有绘制任何内容。有任何想法吗?
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 :(得分:0)
我认为因为f1会返回一个虚数值。 我真的开始像15分钟前开始学习python而且我从乌龟开始。所以我可能不会完全理解和关闭...但总的来说我理解代码......
但是,当你定义它时;这一点;你的第二个任期。
sqrt(( - abs(abs(x)-1))
你正试图获得负数的平方根。那不在笛卡尔飞机上。不知道数学是如何解释的,也不知道乌龟如何解释它,但这是我的第一次猜测...答案 1 :(得分:0)
您正试图使用错误的绘图代码绘制错误的函数。您需要单独调试它们,而不是一起调试它们。让我们从函数开始吧。如果我们查看有问题的三个区间的开始,-7,-1和3并在它们上面调用f1()
,我们得到:
-7 -> 0.0
-1 -> division by zero
3 -> division by zero
首先,在循环开始之前,情节永远不会开始,因为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()
这给了我们测试结果:
这对我们的测试功能来说似乎是合理的。现在,您可以使用工作绘图仪更改坐标系以获得更高分辨率的绘图和/或调试f1()
函数。