Condition sur les valeurs d'un tableau en Python

Résolu/Fermé
Surispliff - 1 nov. 2022 à 14:59
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 - 1 nov. 2022 à 18:43

Bonjour,

J'ai fait un programme simulant un orbite autour d'un astre en fonction des conditions initiales. Mais pour l'instant, le programme affiche tout l'orbite, y compris la partie de l'orbite théorique sous la surface. Je voulais savoir comment faire pour afficher uniquement la partie émerger de l'orbite (l'orbite réel quoi) ? C'est a dire tel que r >= R, ou R est le rayon de l'astre. Sachant que r est un tableau mais pas un tableau numpy classique, c'est une valeure inclus dans un tableau odeint avec des histoire d'intégration. Donc j'ai essayer de faire any(r) >= R ou all(r) >= R, mais ca marche pas.

Merci


Windows / Chrome 106.0.0.0

A voir également:

4 réponses

yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 Ambassadeur 1 533
1 nov. 2022 à 15:33

bonjour,

si tu veux nous montrer ton code, merci d'utiliser ceci: https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
from scipy.integrate import odeint
import numpy as np
from matplotlib import pyplot as plt
from math import pi
from math import sqrt
t = np.linspace(0, 50000, 10000)  

G = 6.67e-11
M = 8.6e19
R = 252.2
A = 0

def F(f, t):
    [r, rp, theta] = f
    thetap = C /(r**2)
    return [rp,r*thetap**2-G*M/(r**2),thetap]

n = input("\n" + "Vitesse orthoradiale initiale en m/s: ") 
p = input("\n" + "Vitesse radiale initiale en m/s: ") 
m = input("\n" + "Altitude initiale par rapport à la surface en km: ")

r0 = float(m)*1000 + float(R)*1000
thetap0 = float(n) / r0
C = thetap0 * (r0 ** 2)
f0 = [r0, p, 0]
f = odeint(F, f0, t)
r = f[:, 0]
theta = f[:, 2]
# =============================================================================
# 
# ============================================================================= 
x = (r * np.cos(theta))/1000
y = (r * np.sin(theta))/1000


circle1 = plt.Circle((0, 0), R+A , color='b')
circle2 = plt.Circle((0, 0), R , color='sienna')
fig, ax = plt.subplots()
ax.set_aspect(1)
ax.add_artist(circle1)
ax.add_artist(circle2)

plt.plot(x, y, "steelblue")
plt.axis("equal") 
plt.show()
    
    
a = round(((max(r)/1000)-R), 2)
           
p = round(((min(r)/1000)-R), 2)

d = ((a+p+2*R)/2)*1000

P = sqrt((4*(pi**2)*(d**3))/(G*M))

k = round((P/60), 2)
           
print("\n" + "Périgée = " + str(p) + " km" + "\n", "Apogée = " + str(a) + " km")

print("\n" + "Période de révolution = " + str(k) + " min" )

if a < A:
    print("\n" + """Votre orbite pénètre l'atmosphère !""")
if p < A:
    print("\n" + """Votre orbite pénètre l'atmosphère !""")

if p < 0:
    print("\n" + "Votre orbite pércute le sol !")

Donc la les paramètres de M, R et A sont ceux de Encelade mais peut importe. C'est surtout au niveau de plt.plot et par la qu'il faut que j'ajoute une condition pour afficher uniquement l'orbite au dessus de la surface.

0
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533
1 nov. 2022 à 16:31

peut-être ainsi:

Rm=R*1000
r[r<Rm]=None
0
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533 > yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024
1 nov. 2022 à 16:40

ou bien:

r = f[:, 0]
Rm=R*1000
fl=r>Rm
r=r[fl]
theta = f[:, 2]
theta=theta[fl]
0
PierrotLeFou
1 nov. 2022 à 17:54

Si j'ai bien compris, tu veux afficher seulement ce qui est au dessus de l'écliptique?
J'imagine que tu devras calculer les projections sur l'écliptique et ne garder que les position avec l'autre coordonnée positive?

0
yg_be Messages postés 23184 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 15 septembre 2024 1 533
1 nov. 2022 à 18:43

Il souhaite ne pas afficher la partie de la trajectoire qui est sous la surface de l'astre. 

Comme il utilise des coordonnées polaires, centrée sur le centre de l'astre, il est très simple d'identifier les points à éliminer.

J'ai fait deux suggestions, une qui remplace par "none" la coordonnée "distance" des points à éliminer, l'autre qui élimine les points non désirés.

0

Merci mais l'astuce de ygbe fonctionne.

0