乌龟画一条曲线

Turtle draws a curve

我有一个带有 x 和 y 坐标的文本文件,我想用这个程序计算一条曲线,但是,结果是一条直线重复自身 数据作为 x 和 y 坐标分别导入。这是处理此数据的代码

def plotDots(t,x_acc,y_acc):                       
    while x_acc and y_acc:
        t.pu()
        t.goto(x_acc[0],y_acc[0])
        t.pd()
        t.stamp()
        x_acc, y_acc=x_acc[1:], y_acc[1:]

def plotRegression(x,x_acc,y_acc):
    ave_x=sum(x_acc)/len(x_acc)                     #Calculating curve
    ave_y=sum(y_acc)/len(y_acc)
    n=len(x_acc)
    m=((x_acc[0]*y_acc[0])-(n*ave_x*ave_y))/(x_acc[0]**2-(n-x_acc[0]**2))
    y=ave_y+m*(x-ave_x)
    return y

def main():
    t=turtle.Turtle()
    wn=turtle.Screen()
    turtle.setworldcoordinates(-1000,-1000,1000,1000)
    doc=open("labdata.txt")
    line=doc.readline()
    y_acc=[]
    x_acc=[]
    while line:
        values=line.split()
        x_acc=x_acc +[float(values[0])]
        y_acc=y_acc +[float(values[1])]
        line=doc.readline()
    plotDots(t,x_acc,y_acc)
    for x in x_acc:
        t.goto(x, plotRegression(x,x_acc,y_acc))

    doc.close()
    wn.exitonclick()

main()

按照我阅读您脚本的方式,您正在为数据拟合一条直线。然后,您正在绘制 fitlinear 线,因为 plotRegression 将 return 拟合值 y 属于您的输入 x (在`t.goto(...).
所以很奇怪你看到一条直线;你应该看到那个。

使用简单

for x, y in zip(x_acc, y_acc):
  t.goto(x, y)

画出你的曲线。


注意:计算一次回归,然后对每个 x 进行评估更有意义。因此,创建一个函数 calcRegression,returns ab,你的拟合参数,然后是一个 evalRegression 接受输入 x(要么浮点数或浮点数数组)和 returns y.
我不会调用函数 plotRegression 如果它实际上没有 plot 任何东西。


如果您打算将其用于科学计算,则最好使用 numpy/scipy/pandas 进行计算,例如用于绘图的 matplotlib。

如果它只是练习的一部分,没问题,但不要将它用于现实世界的问题,因为人们已经解决了这个问题(总体而言,更仔细,更详细)。