-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathseries-c-10-rocket.tex
151 lines (120 loc) · 5.28 KB
/
series-c-10-rocket.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
\documentclass[french,a4paper,addpoints,11pt]{exam}
\usepackage{hexercises}
\usepackage[french]{babel}
\usepackage{siunitx}
\usepackage{multicol}
\title{Lanceur Spatial}
\seriesno{\texttt{0x10}}
\department{TIN}
\classroom{INFO1-TIN}
\setlength\answerlinelength{10 cm}
\setlength\answerskip{3ex}
\setlength\answerclearance{1.1ex}
\CorrectChoiceEmphasis{}
\renewcommand{\thepartno}{\alph{partno}}
\renewcommand{\partlabel}{\thepartno.}
\renewcommand{\arraystretch}{1.75} % expand the cells vertically
\begin{document}
\maketitle
\thispagestyle{headandfoot}
\begin{questions}
\begin{multicols}{2}
\question Lanceur Spatial
\section*{Contexte}
L'équation de Constantin Tsiolkovski est l'équation fondamentale de l'astronautique reliant l'accroissement de vitesse au cours d'une phase de propulsion d'un astronef doté d'un moteur à réaction au rapport de sa masse initiale à sa masse finale.
Elle permet de rapidement déterminer l'accroissement de vitesse compte tenu de la perte de masse liée à la combustion des ergols.
\section*{Énoncé}
On considère un lanceur spatial au décollage depuis la terre ; on demande de calculer la vitesse de ce lanceur en fonction du temps.
L'équation de Tsiolkovski est donnée par :
\begin{equation}
\delta V = V_e \cdot ln(\frac{M_0}{M_1})
\end{equation}
où :
\begin{description}
\item[$v_e$] la vitesse d'éjection des gaz de la tuyère,
\item[$M_0$] la masse de la fusée à l'instant $T_{0}$,
\item[$M_1$] la masse de la fusée à l'instant $T_{1}$.
\end{description}
À chaque intervalle de temps $\Delta t$, la masse de la fusée est diminuée d'une certaine quantité de masse. Ceci permet de calculer l'accroissement de la vitesse de la fusée.
Nous considérons un lanceur de type Ariane 5, propulsé par un moteur Vulcain central et deux propulseurs à poudre latéraux. Les caractéristiques sont les suivantes :
\begin{itemize}
\item Masse de la fusée : \SI{750}{\tonne},
\item Masse à vide (sans ergols) : \SI{90}{\tonne},
\item $V_e$ : \SI{4}{\km\per\second},
\item Perte de masse : \SI{4}{\tonne\per\second}.
\end{itemize}
Les effets aérodynamiques sont négligés pour le calcul.
\section*{Travail à réaliser}
On vous demande de réaliser un programme qui calcule la vitesse du lanceur en fonction du temps.
\begin{enumerate}
\item Concevoir le programme et décrivez l'algorithme (pseudo-code...).
\item Écrire un programme complet qui calcule et affiche en mètres par seconde de manière \underline{itérative} par pas de \SI{1}{\second} la vitesse de la fusée depuis l'instant de départ au sol jusqu'à l'instant pour lequel la vitesse n'évolue plus.
\item Calcul de l'altitude du lanceur à chaque pas de calcul.
\end{enumerate}
\section*{Objectifs pédagogiques}
Les objectifs pédagogiques de cet exercice sont les suivants :
\begin{itemize}
\item compréhension d'un problème algorithmique en lien avec le monde réel,
\item sélection de la bonne structure de contrôle ad hoc (boucles) pour résoudre le problème,
\item élaboration de la condition d'arrêt de la boucle,
\item itération par pas de \SI{1}{\second},
\item utilisation de constantes symboliques,
\item calculs simples avec différentes unités.
\end{itemize}
\end{multicols}
\begin{solution}
\begin{lstlisting}
#include <stdio.h>
#include <math.h>
typedef struct Rocket {
union {double f; double fuel_mass;}; // tonnes
union {double m; double rocket_mass;}; // tonnes
union {double ve; double ejection_speed;}; // m/s
union {double me; double ejection_mass;}; // tonnes/s
union {double h; double altitude;}; // m
union {double v; double velocity;}; // m/s
} Rocket;
struct Time {int m; int s;};
struct Time s2ms(double s) {
return (struct Time){.m = s / 60, .s = s - (int)(s / 60) * 60};
}
void display_time(struct Time t) {
printf("%2d:%02d", t.m, t.s);
}
void display_rocket(Rocket r) {
printf("Fuel mass: %.2f t\t", r.fuel_mass);
#ifdef VERBOSE
printf("Rocket mass: %.2f\t", r.rocket_mass);
printf("Ejection speed: %.2f\t", r.ejection_speed / 1000);
printf("Ejection mass: %.2f\t", r.ejection_mass);
#endif
printf("Altitude: %.2f km\t", r.altitude / 1000);
printf("Velocity: %.2f km/s\t", r.velocity / 1000);
printf("\n");
}
int main() {
const double km = 1000;
Rocket r = {
.rocket_mass = 90, // tonnes
.fuel_mass = 750 - 90, // tonnes
.ejection_speed = 4 * km, // m/s
.ejection_mass = 4, // tonnes/s
.altitude = 0, // m
.velocity = 0 // m/s
};
const double dt = 10.0;
double t = 0;
while(r.fuel_mass >= 0) {
display_time(s2ms(t)); putchar('\t');
display_rocket(r);
double new_fuel_mass = r.f - r.me * dt;
r.velocity += r.ve * log((r.m + r.f) / (r.m + new_fuel_mass));
r.altitude += r.v * dt;
r.f = new_fuel_mass;
t += dt;
};
}
\end{lstlisting}
\end{solution}
\end{questions}
\end{document}