Я написал код, вычисляющий положения планет, однако по какой-то причине получаю ошибку 'невозможно получить доступ к локальной переменной 'min_distance', где она не связана со значением'
Я не знаю почему, min_distance уже было глобальным значением, так как в функцию Compute_position(min_distance) я уже включил min_distance и обновил его вне функции.
Я изменил функцию на Compute_position( min_distance) просто вычислить_position() и объявил min_distance глобальным, но это не сработало.
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
Подробнее здесь: https://stackoverflow.com/questions/790 ... s-not-asso
Почему Python говорит, что не может получить доступ к локальной переменной min_distance, если она не связана со значение ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблемы с использованием функции std::distance для переменной типа py::array_t в pybind11
Anonymous » » в форуме Python - 0 Ответы
- 13 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблемы с использованием функции std::distance для переменной типа py::array_t в pybind11
Anonymous » » в форуме C++ - 0 Ответы
- 8 Просмотры
-
Последнее сообщение Anonymous
-