[Python] Why python says cannot access local variable 'min_distance' where it is not...

Discussão em 'Python' iniciado por Stack, Outubro 2, 2024.

  1. Stack

    Stack Membro Participativo

    I wrote a code that calculates positions of planets, however for some reason I get the error 'cannot access local variable 'min_distance' where it is not associated with a value' I don't know why, min_distance was already a global value since in the function compute_position(min_distance) I already included min_distance and updated it outside the function.

    I changed the function to be compute_position(min_distance) to just compute_position() and declared min_distance to be global but it didn't work.

    type def compute_position(min_distance,min_distance_Rogue_moon_global,max_distance_Earth_moon_global,
    sub,total_time, dt, G, M_SUN, M_earth, M_VENUS, M_MARS, M_mercury, M_JUPITER, M_SATURN, M_NEPTUNE, M_URANUS, M_Rogue, M_Moon,
    vctr_position_moon, vctr_velocity_moon, vctr_acceleration_moon,
    vctr_position_Rogue, vctr_velocity_Rogue, vctr_acceleration_Rogue,
    vctr_position_earth, vctr_velocity_earth, vctr_acceleration_earth,
    vctr_position_venus, vctr_velocity_venus, vctr_acceleration_venus,
    vctr_position_mars, vctr_velocity_mars, vctr_acceleration_mars,
    vctr_position_mercury, vctr_velocity_mercury, vctr_acceleration_mercury,
    vctr_position_jupiter, vctr_velocity_jupiter, vctr_acceleration_jupiter,
    vctr_position_saturn, vctr_velocity_saturn, vctr_acceleration_saturn,
    vctr_position_neptune, vctr_velocity_neptune, vctr_acceleration_neptune,
    vctr_position_uranus, vctr_velocity_uranus, vctr_acceleration_uranus,
    vctr_position_earth0, vctr_velocity_earth0, vctr_acceleration_earth0,
    Roche_limit_Rogue_Moon_check,Roche_limit_Earth_Moon_check ,Roche_limit_Rogue_Earth_check,
    Roche_limit_Rogue_Moon, Roche_limit_Earth_Moon, Roche_limit_Rogue_Earth, vctr_velocity_Rogue_Z
    ):

    min_distance = float('inf')
    min_distance_Earth_moon = float('inf')
    min_distance_Rogue_moon = float('inf')
    max_distance_Earth_moon = int(0)
    for n in range(1, int(total_time/dt )):
    #print(f"%{int(n/int(total_time/dt)*100)}")


    vctr_acceleration_Rogue[n] = (- G * M_SUN* vctr_position_Rogue[n-1]/np.linalg.norm(vctr_position_Rogue[n-1])**3- G * M_earth * (vctr_position_Rogue[n-1]-vctr_position_earth[n-1])/np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_earth[n-1]**3)
    - G * M_VENUS * (vctr_position_Rogue[n-1]-vctr_position_venus[n-1])/np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_venus[n-1])**3
    - G * M_MARS * (vctr_position_Rogue[n-1]-vctr_position_mars[n-1])/(np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_mars[n-1])**3)
    - G * M_mercury * (vctr_position_Rogue[n-1]-vctr_position_mercury[n-1])/np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_mercury[n-1])**3
    - G * M_JUPITER* (vctr_position_Rogue[n-1]-vctr_position_jupiter[n-1])/np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_jupiter[n-1])**3
    - G * M_Moon* (vctr_position_Rogue[n-1]-vctr_position_moon[n-1])/np.linalg.norm(vctr_position_Rogue[n-1]-vctr_position_moon[n-1])**3
    )
    vctr_velocity_Rogue[n] = vctr_velocity_Rogue[n-1] + vctr_acceleration_Rogue[n-1]*dt
    vctr_position_Rogue[n] = vctr_position_Rogue[n-1] + vctr_velocity_Rogue[n-1]*dt + 0.5*dt**2*vctr_acceleration_Rogue[n-1]


    vctr_acceleration_earth[n] = (
    - G * M_SUN * vctr_position_earth[n-1]/np.linalg.norm(vctr_position_earth[n-1])**3
    - G * M_mercury*(vctr_position_earth[n-1] - vctr_position_mercury[n-1])/np.linalg.norm(vctr_position_earth[n-1] - vctr_position_mercury[n-1])**3
    - G * M_VENUS * (vctr_position_earth[n-1]-vctr_position_venus[n-1])/np.linalg.norm(vctr_position_earth[n-1]-vctr_position_venus[n-1])**3
    - G * M_MARS * (vctr_position_earth[n-1]-vctr_position_mars[n-1])/(np.linalg.norm(vctr_position_earth[n-1]-vctr_position_mars[n-1])**3)
    - G * M_JUPITER* (vctr_position_earth[n-1]-vctr_position_jupiter[n-1])/np.linalg.norm(vctr_position_earth[n-1]-vctr_position_jupiter[n-1])**3
    - G * M_SATURN *(vctr_position_earth[n-1]-vctr_position_saturn[n-1])/np.linalg.norm(vctr_position_earth[n-1]-vctr_position_saturn[n-1])**3
    - G * M_Moon* (vctr_position_earth[n-1] - vctr_position_moon[n-1])/np.linalg.norm(vctr_position_earth[n-1] - vctr_position_moon[n-1])**3
    - G * M_Rogue* (vctr_position_earth[n-1] - vctr_position_Rogue[n-1])/np.linalg.norm(vctr_position_earth[n-1] - vctr_position_Rogue[n-1])**3
    )

    vctr_velocity_earth[n] = vctr_velocity_earth[n-1] + vctr_acceleration_earth[n-1]*dt
    vctr_position_earth[n] = vctr_position_earth[n-1] + vctr_velocity_earth[n-1]*dt + 0.5*dt**2*vctr_acceleration_earth[n-1]

    vctr_acceleration_moon[n] = (- G * M_SUN * vctr_position_moon[n-1]/np.linalg.norm(vctr_position_moon[n-1])**3
    - G * M_Rogue* (vctr_position_moon[n-1] - vctr_position_Rogue[n-1])/(np.linalg.norm(vctr_position_moon[n-1] - vctr_position_Rogue[n-1])**3)
    - G * M_earth*(vctr_position_moon[n-1] - vctr_position_earth[n-1])/(np.linalg.norm(vctr_position_moon[n-1] - vctr_position_earth[n-1])**3)
    )
    vctr_velocity_moon[n] = vctr_velocity_moon[n-1] + vctr_acceleration_moon[n-1]*dt
    vctr_position_moon[n] = vctr_position_moon[n-1] + vctr_velocity_moon[n-1]*dt + 0.5*dt**2*vctr_acceleration_moon[n-1]


    vctr_acceleration_earth0[n] = (-G * M_SUN * vctr_position_earth0[n-1]/np.linalg.norm(vctr_position_earth0[n-1])**3
    - G * M_VENUS * (vctr_position_earth0[n-1]-vctr_position_venus[n-1])/np.linalg.norm(vctr_position_earth0[n-1]-vctr_position_venus[n-1])**3
    - G * M_MARS * (vctr_position_earth0[n-1]-vctr_position_mars[n-1])/(np.linalg.norm(vctr_position_earth0[n-1]-vctr_position_mars[n-1])**3)
    - G * M_JUPITER* (vctr_position_earth0[n-1]-vctr_position_jupiter[n-1])/np.linalg.norm(vctr_position_earth0[n-1]-vctr_position_jupiter[n-1])**3)
    vctr_velocity_earth0[n] = vctr_velocity_earth0[n-1] + vctr_acceleration_earth0[n-1]*dt
    vctr_position_earth0[n] = vctr_position_earth0[n-1] + vctr_velocity_earth0[n-1]*dt + 0.5*dt**2*vctr_acceleration_earth0[n-1]


    vctr_acceleration_venus[n] = (- G * M_SUN * vctr_position_venus[n-1]/np.linalg.norm(vctr_position_venus[n-1])**3
    - G * M_Rogue* (vctr_position_venus[n-1] - vctr_position_Rogue[n-1])/(np.linalg.norm(vctr_position_venus[n-1] - vctr_position_Rogue[n-1])**3))
    vctr_velocity_venus[n] = vctr_velocity_venus[n-1] + vctr_acceleration_venus[n-1]*dt
    vctr_position_venus[n] = vctr_position_venus[n-1] + vctr_velocity_venus[n-1]*dt + 0.5*dt**2*vctr_acceleration_venus[n-1]


    vctr_acceleration_mars[n] = (-G * M_SUN * vctr_position_mars[n-1]/np.linalg.norm(vctr_position_mars[n-1])**3
    - G * M_JUPITER* (vctr_position_mars[n-1]-vctr_position_jupiter[n-1])/np.linalg.norm(vctr_position_mars[n-1]-vctr_position_jupiter[n-1])**3
    - G * M_Rogue* (vctr_position_mars[n-1] - vctr_position_Rogue[n-1])/(np.linalg.norm(vctr_position_mars[n-1] - vctr_position_Rogue[n-1])**3))
    vctr_velocity_mars[n] = vctr_velocity_mars[n-1] + vctr_acceleration_mars[n-1]*dt
    vctr_position_mars[n] = vctr_position_mars[n-1] + vctr_velocity_mars[n-1]*dt + 0.5*dt**2*vctr_acceleration_mars[n-1]

    vctr_acceleration_mercury[n] = (-G * M_SUN * vctr_position_mercury[n-1]/np.linalg.norm(vctr_position_mercury[n-1])**3
    - G * M_Rogue* (vctr_position_mercury[n-1] - vctr_position_Rogue[n-1])/(np.linalg.norm(vctr_position_mercury[n-1] - vctr_position_Rogue[n-1])**3))
    vctr_velocity_mercury[n] = vctr_velocity_mercury[n-1] + vctr_acceleration_mercury[n-1]*dt
    vctr_position_mercury[n] = vctr_position_mercury[n-1] + vctr_velocity_mercury[n-1]*dt + 0.5*dt**2*vctr_acceleration_mercury[n-1]

    vctr_acceleration_jupiter[n] = (-G * M_SUN * vctr_position_jupiter[n-1]/np.linalg.norm(vctr_position_jupiter[n-1])**3
    - G * M_SATURN *(vctr_position_jupiter[n-1]-vctr_position_saturn[n-1])/np.linalg.norm(vctr_position_jupiter[n-1]-vctr_position_saturn[n-1])**3
    - G * M_Rogue * (vctr_position_jupiter[n-1] - vctr_position_Rogue[n-1])/(np.linalg.norm(vctr_position_jupiter[n-1] - vctr_position_Rogue[n-1])**3))
    vctr_velocity_jupiter[n] = vctr_velocity_jupiter[n-1] + vctr_acceleration_jupiter[n-1]*dt
    vctr_position_jupiter[n] = vctr_position_jupiter[n-1] + vctr_velocity_jupiter[n-1]*dt + 0.5*dt**2*vctr_acceleration_jupiter[n-1]

    # Calculate the current distance between Earth and the Rogue planet
    current_distance_Rogue_Earth = np.linalg.norm(vctr_position_earth[n] - vctr_position_Rogue[n])
    current_distance_Rogue_moon = np.linalg.norm(vctr_position_Rogue[n] - vctr_position_moon[n])

    if Roche_limit_Earth_Moon_check == False:
    if (np.linalg.norm(vctr_position_earth[n-1] - vctr_position_moon[n-1]) < Roche_limit_Earth_Moon):
    Roche_limit_Earth_Moon_check = True

    if Roche_limit_Rogue_Moon_check == False:
    if (current_distance_Rogue_moon < Roche_limit_Rogue_Moon):
    Roche_limit_Rogue_Moon_check = True

    # Update min_distance if the current distance is smaller
    if current_distance_Rogue_Earth < min_distance:
    min_distance = current_distance_Rogue_Earth

    current_distance_Earth_moon = np.linalg.norm(vctr_position_earth[n-1] - vctr_position_moon[n-1])

    if current_distance_Earth_moon < min_distance_Earth_moon:
    min_distance_Earth_moon = current_distance_Earth_moon

    if current_distance_Rogue_moon < min_distance_Rogue_moon:
    min_distance_Rogue_moon = current_distance_Rogue_moon

    if current_distance_Earth_moon > max_distance_Earth_moon:
    max_distance_Earth_moon = current_distance_Earth_moon




    new_df = pd.DataFrame(new_data)
    # Mevcut verilerle yeni verileri birleştirin
    combined_df = pd.concat([existing_df, new_df], ignore_index=True)

    # Excel dosyasına yaz
    with pd.ExcelWriter(file_path, engine='openpyxl', mode='w') as writer:
    combined_df.to_excel(writer, index=False)
    print("it worked")


    return min_distance, min_distance_Earth_moon, min_distance_Rogue_moon, max_distance_Earth_moon, vctr_velocity_Rogue_Z




    c = int(0)
    Alpha_Radian = 0
    def CalcD(Alpha_Radian):
    X_Rogue, Y_Rogue = 0, 0
    for D in range(1, 2):
    X_Rogue,Y_Rogue = CalcS(X_Rogue,Y_Rogue)
    Alpha_degree = 0 + D*90
    Alpha_Radian = math.radians(Alpha_degree)
    return Alpha_Radian

    def CalcS(X_Rogue,Y_Rogue):
    Alpha_Radian = 0
    for S in range(1, 2):

    sub = 0.5E+06 + S * 0.5E+06
    X_sub = float(sub*math.sin(Alpha_Radian))
    Y_sub = float(sub*math.cos(Alpha_Radian))

    X_Rogue = X_Earth + X_sub
    Y_Rogue = Y_Earth + Y_sub
    CalcV(vctr_position_Rogue, vctr_velocity_Rogue, vctr_velocity_Rogue_Z, sub)

    return X_Rogue,Y_Rogue

    def CalcV(vctr_position_Rogue,vctr_velocity_Rogue, vctr_velocity_Rogue_Z, sub):
    X_Rogue = float()
    Y_Rogue = float()
    c = 0
    for V in range(1 , 2):

    min_distance_Rogue_moon_global, min_distance_Earth_moon_global , min_distance , max_distance_Earth_moon_global,sub , vctr_velocity_Rogue_Z = compute_position(
    min_distance,min_distance_Rogue_moon_global,max_distance_Earth_moon_global,
    sub,total_time, dt, G, M_SUN, M_earth, M_VENUS, M_MARS, M_mercury, M_JUPITER, M_SATURN, M_NEPTUNE, M_URANUS, M_Rogue, M_Moon,
    vctr_position_moon, vctr_velocity_moon, vctr_acceleration_moon,
    vctr_position_Rogue, vctr_velocity_Rogue, vctr_acceleration_Rogue,
    vctr_position_earth, vctr_velocity_earth, vctr_acceleration_earth,
    vctr_position_venus, vctr_velocity_venus, vctr_acceleration_venus,
    vctr_position_mars, vctr_velocity_mars, vctr_acceleration_mars,
    vctr_position_mercury, vctr_velocity_mercury, vctr_acceleration_mercury,
    vctr_position_jupiter, vctr_velocity_jupiter, vctr_acceleration_jupiter,
    vctr_position_saturn, vctr_velocity_saturn, vctr_acceleration_saturn,
    vctr_position_neptune, vctr_velocity_neptune, vctr_acceleration_neptune,
    vctr_position_uranus, vctr_velocity_uranus, vctr_acceleration_uranus,
    vctr_position_earth0, vctr_velocity_earth0, vctr_acceleration_earth0,
    Roche_limit_Rogue_Moon_check,Roche_limit_Earth_Moon_check ,Roche_limit_Rogue_Earth_check,
    Roche_limit_Rogue_Moon, Roche_limit_Earth_Moon, Roche_limit_Rogue_Earth, vctr_velocity_Rogue_Z
    )


    print(f"Percent calculated:{c/1600*100}")
    c += 1
    vctr_velocity_Rogue_Z = -10 -V*10
    vctr_position_Rogue[0] = np.array([X_Rogue, Y_Rogue, 1e+06])
    vctr_velocity_Rogue[0] = np.array([0, 0, vctr_velocity_Rogue_Z])

    return vctr_position_Rogue,vctr_velocity_Rogue, vctr_velocity_Rogue_Z
    CalcD(Alpha_Radian)
    here

    Continue reading...

Compartilhe esta Página