2

我需要在指定的时间间隔内绘制一个函数。函数为f1,如下代码所示,区间为[-7,-3];[-1, 1]; [3, 7],步长为 0.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
4

2 回答 2

0

我认为因为 f1 返回一个虚值。我从字面上看是 15 分钟前才开始学习 python,我从海龟开始。所以我可能不完全理解并离开......但总的来说我理解代码......

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

sqrt((-abs(abs(x)-1))

你试图得到一个负数的平方根。那不在笛卡尔平面上。不知道数学是如何解释它的,也不知道乌龟是如何解释它的,但这是我的第一个猜测......

于 2017-10-20T00:27:49.947 回答
0

您正在尝试使用错误的绘图代码来绘制错误的函数。您需要单独调试它们,而不是一起调试。让我们从函数开始。如果我们查看所讨论的三个间隔的开始,-7、-1 和 3 并调用f1()它们,我们得到:

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

首先,在循环开始之前,绘图永远不会像f1(startf11)-3> stopf11一样开始:

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

在其他两种情况下,没有y由于除以零作为

except ZeroDivisionError:
    continue

不能解决这个问题。所以没有情节。这可能无关紧要,因为绘图代码本身不起作用。所有三个f1*功能(它们是相同的,顺便说一句,这没有意义)做:

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()使用工作绘图仪调试您的功能。

于 2017-10-20T06:23:37.217 回答