How can I resolve issues in my chaotic billiards simulation using Python?

Click For Summary
The discussion focuses on resolving issues in a chaotic billiards simulation implemented in Python using numpy and matplotlib. The main problem arises when calculating the new angle, phi_new, which has two solutions, and the user needs to ensure it differs from the original phi. A suggestion was made to define bounds for the optimization to avoid selecting the same phi value, but this did not fully resolve the issue. The user is also uncertain if varying only the phi and alpha parameters adequately covers all possible starting conditions for the simulation. Further debugging and adjustments to the code are necessary to achieve the desired phase space diagram output.
carlosbgois
Messages
66
Reaction score
0
What am I trying to do? I'm trying to implement a simulation of a chaotic billiard system, following the algorithm in this excerpt.

How am I trying it? Using numpy and matplotlib, I implemented the following code

code_polar_bil.jpg


What is the problem? When calculating phi_new, the equation has two solutions (assuming the boundary is convex, which is.) I must enforce that phi_new is the solution which is different from phi but I don't know how to do that. Are there more issues with the code?

What should the output be? A phase space diagram of S x Alpha, looking like this.

Any help is very appreciated! Thanks in advance.
 
Physics news on Phys.org
I don't think I'll be the one to help you, but posting code as an image can almost guarantee that no one will. Repost it as text inside code tags.
 
  • Like
Likes carlosbgois
Here is the code: (I didn't know how to use code tags before, sorry)

Code:
def boundaryFunction(parameter):
    return 1 + 0.1 * np.cos(parameter)

def boundaryDerivative(parameter):
    return -0.1 * np.sin(parameter)

def trajectoryFunction(parameter):
    aux = np.sin(beta - phi) / np.sin(beta - parameter)
    return boundaryFunction(phi) * aux

def difference(parameter):
    return trajectoryFunction(parameter) - boundaryFunction(parameter)

def integrand(parameter):
    rr = boundaryFunction(parameter)
    dd = boundaryDerivative (parameter)
    return np.sqrt(rr ** 2 + dd ** 2)

##### Main #####

length_vals = np.array([], dtype=np.float64)
alpha_vals = np.array([], dtype=np.float64)

# nof initial phi angles, alpha angles, and nof collisions for each.
n_phi, n_alpha, n_cols, count = 10, 10, 10, 0
# Length of the boundary
total_length, err = integrate.quad(integrand, 0, 2 * np.pi)
setPlot('Polar Billiard')

#fig = plt.figure()

for phi in np.linspace(0, 2 * np.pi, n_phi):
    for alpha in np.linspace(0, 2 * np.pi, n_alpha):
        for n in np.arange(1, n_cols):

            nu = np.arctan(boundaryFunction(phi) / boundaryDerivative(phi))
            beta = np.pi + phi + alpha - nu

            # Determines next impact coordinate.
            bnds = (0, 2 * np.pi)
            phi_new = optimize.minimize_scalar(difference, bounds=bnds, method='bounded').x
            if phi_new == phi:
                print 'phi_new = phi'

            nu_new =  np.arctan(boundaryFunction(phi_new) / boundaryDerivative(phi_new))
            # Reflection angle with relation to tangent.
            alpha_new = phi_new - phi + nu - nu_new - alpha
            # Arc length for current phi value.
            arc_length, err = integrate.quad(integrand, 0, phi_new)

            # Append values to list
            length_vals = np.append(length_vals, arc_length / total_length)
            alpha_vals = np.append(alpha_vals, alpha)        count += 1
    print  "{}%" .format(100 * count / (n_phi * n_alpha))
 
Maybe I can be of help after all. I'm not sure your approach is the best, but let's assume that your sticking with optimize.minimize_scalar.

Why don't you define the bounds as ##[\phi + \epsilon, \phi + 2 \pi - \epsilon]##, where ##\epsilon## is a small number, to avoid the solution at ##\phi##?
 
  • Like
Likes carlosbgois
That's a nice solution. Thanks you. What would be a better approach?

Unfortunately, this alone didn't fix the problem. There must be other mistakes, though I did exactly what was in the book excerpt. I'm wondering if varying only Φ and α parameters spans the whole possible starting parameters for the problem, but am not sure about that.
 
Topic about reference frames, center of rotation, postion of origin etc Comoving ref. frame is frame that is attached to moving object, does that mean, in that frame translation and rotation of object is zero, because origin and axes(x,y,z) are fixed to object? Is it same if you place origin of frame at object center of mass or at object tail? What type of comoving frame exist? What is lab frame? If we talk about center of rotation do we always need to specified from what frame we observe?

Similar threads

  • · Replies 1 ·
Replies
1
Views
2K
Replies
7
Views
2K
  • · Replies 2 ·
Replies
2
Views
1K
Replies
1
Views
2K
Replies
3
Views
1K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 4 ·
Replies
4
Views
5K
  • · Replies 4 ·
Replies
4
Views
6K