Я пишу симулятор самолета, почему мои вычисления становятся нестабильными? - PullRequest
1 голос
/ 31 марта 2020

В настоящее время я пытаюсь кодировать базовую c 2D-симуляцию полета самолета (вычисление ускорения, скорости и положения на каждом временном шаге).

Я наконец достиг удовлетворительного моделирования, но теперь я столкнулся с новой проблемой: через некоторое время мои вычисления начинают становиться нестабильными и быстро расходятся в бесконечность. Пример нестабильности .

Я провел несколько экспериментов, и кажется, что чем выше тета (угол между землей и осью плоскости), тем позднее наступает нестабильность (или нет) даже приезжай). Однако для получения c результатов мне нужно иметь возможность вычислять значения тета в диапазоне от -15 до +15 градусов.

Я думаю, что это может быть связано с приближениями Python относительно небольших значений , Я пытался использовать десятичные дроби, но проблема была та же.

Вот ссылка на код: https://github.com/YannBerthelot/PlaneModel/blob/master/Plane-Env/env/FlightModel_2.py

Кто-нибудь имеет представление о том, как я могу подавить или, по крайней мере, значительно уменьшить нестабильность (чтобы это произошло после намного большее количество шагов)? Проблема может возникнуть из-за неправильного определения динамики, если у вас есть идеи о том, как ее улучшить, пожалуйста, поделитесь :)

Спасибо

1 Ответ

0 голосов
/ 31 марта 2020

Без какого-либо кода невозможно выяснить, что именно не так. Вполне вероятно, что вы используете тригонометрические c функции, такие как «tan», с входными значениями, которые дают значения, близкие к бесконечности - в этом случае даже самая маленькая ошибка в способе работы компьютеров с числами (не особенность Python) будет умножаться Чрезвычайно

In [15]: math.tan(math.pi/2 - 0.000001)                                                                                                             
Out[15]: 1000000.000020701

In [16]: math.tan(math.pi/2 - 0.000002)                                                                                                             
Out[16]: 499999.99996964744

Что вам нужно сделать, это определить в своей формуле, где вы получаете эти убегающие значения, и решить ее символически, получив эквивалентную формулу, которая не потребует вычисления чисел c результаты по этим регионам.

Тогда стандартной точности с плавающей точкой ~ 15 десятичных знаков должно быть более чем достаточно.

...