Unable to properly increment variable in Python

Question:

I am having an issue with my code. The increment in the last if statement doesn’t properly increment. My main issue is that for frac and dfrac, I receive a value of zero, which I assume is because hit is being read as zero.

import LT.box as B
import numpy as np
import matplotlib.pyplot as plt
import sys
import math

#width (cm)
w = 15
#length (cm)
l = 20
#distance between panels (cm)
d = 80
#number of events
n = 10000

print('Width cm:', w)
print('Length cm:', l)
print('Distance cm:', d)
print('Number of events:', n)


hit = 0
for i in range(n):
    if i % 5000 == 0:
        print("Event %6d out of %dr" % (i, n))
        sys.stdout.flush()

    # accepted number of rays
    cost = np.random.random()**(1/3)
    phi = np.random.random()*2.0*np.pi
    xtop =np.random.random()*w
    ytop = np.random.random()*l
    sinp = np.sin(phi)
    cosp = np.cos(phi)
    sint = np.sqrt(1.0 - cost*cost)
    tant = sint/cost
    tantx = tant*sinp
    tanty = tant*cosp
    xbot = xtop-tantx*d
    ybot = ytop-tanty*d

    # check if event goes through both panels
    if (0 <= xbot <= w) and (0 <= ybot <= l):
        if (w <= xbot+d <= 2*w) and (0 <= ybot <= l):
            hit +=1

frac = hit / n
dfrac = math.sqrt(hit) / n

I tried making an increment function and other methods of incrementation, but I wasn’t able to implement it. I either got the same value of zero in frac or I received a syntax error.

Asked By: IJ1217

||

Answers:

The problem with the original code is that the two conditions set for xbot are incompatible. The first condition states that xbot must be between 0 and 15, while the second condition states that xbot + 80 must be between 15 and 30. However, if a variable has a value between 0 and 15, adding 80 to it will never make it have a value between 15 and 30.

Here are the two conditions that xbot needs to satisfy, in order for hit to be incremented:

  1. 0 <= xbot <= 15
  2. 15 <= xbot + 80 <= 30

If you analyze the lower and up bounds that the first condition requires, then the smallest value xbot can have is 0 and the maximum value is 15. If you add those bounds to the second condition, you would have:

  • For xbot = 0: 15 <= 80 <= 30 (FAILS)
  • For xbot = 15: 15 <= 95 <= 30 (FAILS)

Simply putting, if a variable has a value between 0 and 15, adding 80 to it will never make it have a value between 15 and 30.

Now, I don’t know exactly what you’re trying to achieve, but the simplest solution to your problem would be to either remove one of the conditions set to xbot, or find two conditions that are compatible:

    # ...
    # check if event goes through both panels
    if (0 <= xbot <= w) and (0 <= ybot <= l):
        hit +=1
    # ...
Answered By: Ingwersen_erik
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.