Skip to content Skip to sidebar Skip to footer

Thoughts And Question When Implementing Animation Plot Of Collatz Conjecture (3X+1)

Thanks to Veritasium great video about the topic, I was planning to do a quick replication of the animation he showed in the video where the number bouncing up and down until hit t

Solution 1:

I have rewritten your code (works on my machine), and will try to answer your questions

You cannot start from an empty list for y because the collatz() function needs a starting point. Hence, if y is empty, there is nothing to start from and the function fails. In the new code below I have added a parameter start to your function (in the code: 49). This is now the new starting point of your function. Note that if you want a random starting point instead of one defined by you, you can delete start, and replace y = [start] with y = [int(np.random.randint(1, 100, 1))] or another code that draws a random integer.

Now collatz uses a while loop: it works as long as y is larger than 1 (hence for y = 0 or 1 it will stop). Note that the -1 operator means 'the last element added to y'. For each number it does the even() or odd() function, and then it adds the number to the list using append. This ensures that the list is only as long as it needs to be. Note that in this case a while loop is the best option since you don't know how long the loop will last. When you have a fixed amount of iterations, a for loop should be chosen.

Finally, x is determined based on the length of y.

from matplotlib.animation import FuncAnimation
from matplotlib import pyplot as plt

def odd(num):
    return (num*3)+1

def even(num):
    return num // 2

def collatz(start):
    y = [start]
    while y[-1] > 1:
            if y[-1] % 2 == 0:
                y.append(even(y[-1]))
            else:
                y.append(odd(y[-1]))

    return y

y = collatz(49)
x = list(range(len(y)))

fig = plt.figure()
plt.xlim(1,len(y))
plt.ylim(1,max(y))

draw, = plt.plot([],[])
def update(idx):
    draw.set_data(x[:idx], y[:idx])
    return draw

a = FuncAnimation(fig, update, frames=len(x), interval=90)
plt.show()

Post a Comment for "Thoughts And Question When Implementing Animation Plot Of Collatz Conjecture (3X+1)"