Python可视化 摆线动图实现

2022-06-11  本文已影响0人  Python_Camp

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

上一篇下一篇

猜你喜欢

热点阅读