He codificado las ecuaciones de movimiento en Matlab y estoy usando la función ode45 para simular la dinámica no lineal del F/A-18 Hornet sin ningún controlador (solo el fuselaje). He dado condiciones iniciales como condiciones de ajuste.
d2r = pi/180; % degree to rad
V = 438.653328; % Airspeed , ft/s
beta = 0*d2r; % Sideslip Angle, rad
alpha = 10*d2r; % Angle-of-attack, rad
p = 0*d2r; % Roll rate, rad/s
q = 0*d2r; % Pitch rate, rad/s
r = 0*d2r; % Yaw rate, rad/s
phi = 0*d2r; % Roll Angle, rad
theta = 10*d2r; % Pitch Angle, rad
psi = 0*d2r; % Yaw Angle, rad
pN = 0; % X position in Earth Frame, ft
pE = 0; % Y position in Earth Frame, ft
h = -25000; % Z position in Earth Frame, ft
Durante la primera iteración, C_m tiene un valor pequeño muy positivo (1e-10), lo que genera cierto momento de cabeceo cuando se multiplica por S, c y qbar (aunque es pequeño). Pero, a medida que el tiempo sigue aumentando, este valor de C_m sigue aumentando y, como resultado, se crea un gran momento. Debido a la alta precisión de Matlab, el coeficiente de momento de cabeceo no es para la condición de asiento dada.
Mi pregunta es: ¿debo redondear los valores de C_m a 3 o 4 dígitos? Al redondear, C_m será cero y obtendré M como cero.
La siguiente figura muestra cómo varía la velocidad con el tiempo cuando se dan las condiciones iniciales antes mencionadas.
Esta cifra se obtiene luego de redondear C_m a 4 dígitos significativos .
Esta cifra se obtiene sin redondear C_m a 4 dígitos significativos.
Según su descripción, no es un problema con los coeficientes aerodinámicos. Si, como ha descrito anteriormente , está modelando un F-18, entonces el fuselaje debería ser inestable longitudinalmente. Una desviación de 1e-10 (suponiendo que se aplique también a las tasas y velocidades del cuerpo, etc.) está dentro del límite típico del error de compensación; de hecho, una desviación es inevitable cuando se trata de punto flotante computacional. Pero si es longitudinalmente inestable, cualquier desviación se magnificará exponencialmente con el tiempo.
Las computadoras en estos días no se preocupan por los "dígitos decimales significativos" para el cálculo, ya que utilizan la representación binaria IEEE-754 internamente. Los tamaños de número típicos son float
(la mayoría de las veces 32 bits en estos días) y double
(la mayoría de las veces 64 bits). C ofrece precisión extendida de 80 bits ( long double
) y, a veces, está disponible el doble de 128 bits. Puedes leer sobre tallas aquí . Además, algunos lenguajes y paquetes de programación pueden hacer una precisión arbitraria, pero generalmente es lento.
A menudo hay "casos de esquina" en el modelo que pueden requerir una precisión inusualmente alta. Por ejemplo, la expresión (a-b)/(c-d)
puede ser muy difícil de calcular cuando a
se acerca a b
mientras c
se acerca a d
. Debido a tales casos, normalmente prefiero usar la precisión más alta disponible (el doble menos largo) en las simulaciones. Incluso puede haber casos de esquina que requieran aritmética de tipo complejo, incluso si tanto la entrada como el resultado son del tipo real ( sqrt(-1)**2
).
Los tamaños más pequeños a menudo ni siquiera son más rápidos. A veces tienen sentido si trabaja con matrices de datos tan grandes que la memoria se convierte en un problema, o si usa una tarjeta GPU de jugador para computación que no cuenta con doble precisión.
Para informes legibles por humanos, es común dejar suficientes dígitos decimales para representar el valor con precisión conocida, o uno más, pero no más. Por ejemplo, si el valor se conoce con una precisión de 0,1, podría imprimirse como 0,6 o 0,66, por ejemplo, pero no como 0,6666666666666666. Pero si esta salida de texto no es para humanos y será leída por una computadora, no hay razón para limitar la cantidad de dígitos. Además, si conoce más dígitos, el redondeo solo puede hacer lo mismo o peor.
long double
es de 64 bits , mientras que en gcc es de 80 en el mismo hardware.
Zeus
Pavana
Ene
Zeus
Zeus
Pavana
JZYL
Pavana