美文网首页
Python可视化 摆线动图实现

Python可视化 摆线动图实现

作者: Python_Camp | 来源:发表于2022-06-11 11:28 被阅读0次

    pip install pyglot
    代码:

    import numpy as np
    import matplotlib as plt
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    r = 1
    theta = np.arange(0,6.4,0.1)
    xCircle0 = np.cos(theta)
    yCircle0 = 1+np.sin(theta)
    
    fig = plt.figure(figsize=(15,4))
    ax = fig.add_subplot(autoscale_on=False,
        xlim=(1,10),ylim=(0,2))
    ax.grid()
    
    circle, = ax.plot(xCircle0,yCircle0,'-',lw=1)
    point, = ax.plot([1],[1],'o')
    trace, = ax.plot([],[],'-', lw=1)
    theta_text = ax.text(0.02,0.85,'',transform=ax.transAxes)
    textTemplate = '''x = %.1f°\n'''
    xs,ys = [], []
    
    def animate(x):
        if(x==0):
            xs.clear()
            ys.clear()
        xCycloid = x + r*np.cos(-x) #由于是向右顺时针滚,所以角度为负
        yCycloid = 1 + r*np.sin(-x)
    
        xCircle = xCircle0+x
        xs.append(xCycloid)
        ys.append(yCycloid)
        circle.set_data(xCircle,yCircle0)
        point.set_data([xCycloid],[yCycloid])
        trace.set_data(xs,ys)
        theta_text.set_text(textTemplate % x)
        return circle, point, trace, theta_text
    
    frames = np.arange(0,10,0.02)
    ani = animation.FuncAnimation(fig, animate, frames,
        interval=5, blit=True)
    ani.save("Cycloid.gif")
    
    plt.show()
    
    

    记着安装库

    函数式程序

    任务:你有一个值的序列和一些关于这些值的谓词。你想删除最长的元素前缀,使每个元素的谓词都为真。我们称这个为 dropWhile 函数。它接受两个参数。第一个是值的序列,第二个是谓词函数。该函数不会改变原始序列的值。

    def isEven(num):
    return num % 2 == 0

    arr = [2,4,6,8,1,2,5,4,3,2] 。

    dropWhile(arr, isEven) == [1,2,5,4,3,2] # True

    你的任务是实现dropWhile函数。如果你身边有一个span函数,这就是一个单行本!或者,如果你有一个takeWhile函数,这就是一个单行本。或者,如果你手上有一个takeWhile函数,那么结合dropWhile函数,你可以在一行中实现span函数。这就是函数式编程的魅力所在:有一大堆有用的函数,其中许多都可以相互实现。

    from itertools import dropwhile
    
    def drop_while(arr, pred):
        return list(dropwhile(pred, arr))
    

    准确秤量任务

    两个空烧杯容量是9升和11.25升:

    C9AuEl812n.png

    容许用这些动作:

    从水龙头处完全灌满一个容器
    将一个容器内的水完全倒在地上
    把一个容器倒入另一个容器中,直到它完全装满或倒入的那个容器完全空了为止,
    你能准确地测量出以下哪一个数量?

    提示:想一想你能测出的最小的量。四个选项有一是?
    1.5升
    3.25升
    5升
    6.75升

    容许下面的操作:
    99升的容器盛满水后,倒入11.2的容器。
    再次填满9升的容器。接着将9升的容器倒入11.25的容器中,直到后者被装满。
    这时,9升容器里还剩下6.75升,而另一个容器已经满了。正好测出6.75升。

    解法
    考虑两个比所给的容器大4倍的容器:
    一个能容纳9×4=36升
    另一个能容纳11.25×4=45升
    如果我们能用这两个容器量出N升,那么我们就可以用原来的9升和11.25升的容器来测量 N/4升

    我们可以用36升和45升的容器测量出的水的总量,其形式为
    36x+45y
    36x+45y
    其中x和y是整数。如果x是正数,那么36升的容器就被装了x次。如果它是负数,那么36升的容器已经被清空了|x|次。y和45升容器的情况也是如此。

    36x+45y的表达式必然是9的倍数,因为
    36x=9(4x)
    36x=9(4x)

    45y=9(5y)。
    45y=9(5y)。
    也就是说,两个容器中的水的总量是9升的倍数。

    那么,对于99升和11.2511.25升的容器,水的总量是 9/4 = 2.25的倍数
    2.25在给定的选项中,只有 6.75=3×2.25是可能的。

    我们可以用以下的动作顺序来测量。
    装满9升的容器。
    将99升的容器倒入11.25的容器。
    再次填满9升的容器,然后
    将9升的容器倒入11.25的容器中,直到后者被装满。这时,9升容器里还剩下6.75升,而另一个容器已经满了--把它倒出来,我们正好测出6.75升。

    任务升级

    包括6.75升,还有哪些可以准确秤量出的容量?

    option = [1.5,3.25,5,6.75]
    
    def pourMin(u,U): # u=small, U=larger
        i,j,s = 2,1,True
        ans = [float('INF')]
        minvol = u*i - U*j
        step = 0
        while minvol <= u+U:#minvol <= 两个杯子容量之和
            s = not(s)
            minvol = abs(u*i - U*j)
            i += s
            j += not(s)
            ans.append(minvol)      
        return sorted(set(ans))[:-2],[i for i in set(ans) if i in option]
    u,U = 9,11.25
    print(pourMin(u,U))
    
    ([0.0, 2.25, 4.5, 6.75, 9.0, 11.25, 13.5, 15.75, 18.0, 20.25],
     [6.75])
    

    共有 9 个不同的称量结果:
    2.25, 4.5, 6.75, 9.0, 11.25, 13.5, 15.75, 18.0, 20.25

    符合题目的是 6.75

    相关文章

      网友评论

          本文标题:Python可视化 摆线动图实现

          本文链接:https://www.haomeiwen.com/subject/lwwimrtx.html