ПрограммированиеФорумФизика

мат. модель летательного аппарата

Страницы: 1 2 Следующая »
#0
17:22, 5 мая 2008

Реализация найденной в институте мат. модели летательного аппарата
Ни на что не претендует, возможно кому-то пригодится

    public class PlaneSim
    {
        public double _cx0;
        public double _cy0;
        public double _cz0;
        public double _k1;
        public double _k2;
        public double _k3;
        public double _sq;   // площадь крыла
        public double _den;  // плотность воздуха
        public double _m;
        public double _g;
        public double _rz;
        public double _phi;

        public double _P;    // сила тяги
        public double _a;    // угол атаки
        public double _b;    // угол скольжения
        public double _y;    // угол крена

        public double _V;    // скорость
        public double _Q;
        public double _Cr;   // курс
        public double _H;    // высота
        public double _Lt;   // широта
        public double _Ln;   // долгота

        public double _px;
        public double _pz;

        public PlaneSim()
        {
            _cx0 = 0.034;
            _cy0 = 0.42;
            _cz0 = 0.0;
            _k1 = 0.038;
            _k2 = 0.09;
            _k3 = 0.01;
            _sq = 1.775;
            _den = 1.225;
            _m = 63.3;
            _g = 9.81;
            _rz = 6.378 * 1000000.0;
            _phi = 0.0;

            _P = 200.0;
            _a = 0.0;
            _b = 0.0;
            _y = 0.0;

            _V = 30.0;
            _Q = 0.2;
            _Cr = 0.0;
            _H = 200.0;
            _Lt = 0.0;
            _Ln = 0.0;
        }

        public void Integrate(double dt)
        {
            double sinQ, cosQ;
            double sinY, cosY;
            double tanLt, cosCr;
            double sinCr;
            double secLt;

            double f1, f2, f3, f4, f5, f6, f7, f8;
            double dV, dQ, dCr, dH, dLt, dLn;

            sinQ = Math.Sin(_Q);
            cosQ = Math.Cos(_Q);

            sinY = Math.Sin(_y);
            cosY = Math.Cos(_y);

            tanLt = Math.Tan(_Lt);
            cosCr = Math.Cos(_Cr);
            sinCr = Math.Sin(_Cr);

            secLt = 1.0 / Math.Cos(_Lt);

            // dV
            f1 = _cy0 + _k2 * _a;
            f2 = _cx0 + _k1 * f1 * f1 - (_cz0 + _k3 * _b) * _b;
            f3 = _P - f2 * (_den * _V * _V * _sq * 0.5);
            f4 = (f3 / _m) - _g * sinQ;
            dV = f4;

            // dQ
            f1 = _P * ((_a * Utils.DEG2RAD - _phi) * cosY + _b * sinY);
            f2 = _cy0 + _k2 * _a;
            f3 = (_cx0 + _k1 * f2 * f2) * _b * sinY;
            f4 = (_cy0 + _k2 * _a) * cosY;
            f5 = (_cz0 + _k3 * _b) * sinY;
            f6 = f1 - (f3 - f4 + f5) * (_den * _V * _V * _sq * 0.5);
            f7 = (f6 / (_m * _V)) - ((_g * cosQ) / _V) + ((_V * cosQ) / (_rz + _H));
            dQ = f7;

            // dCr
            f1 = _P * ((_a - _phi) * sinY - _b * cosY);
            f2 = _cx0 + _k1 * (_cy0 + _k2 * _a);
            f3 = f2 * f2 * _b * cosY;
            f4 = (_cy0 + _k2 * _a) * sinY;
            f5 = (_cz0 + _k3 * _b) * cosY;
            f6 = f1 + (f3 + f4 + f5) * (_den * _V * _V * _sq * 0.5);
            f7 = f6 / (_m * _V * cosQ);
            f8 = _V * (cosQ / (_rz + _H)) * tanLt * cosCr;
            dCr = -f7 - f8;

            // dH
            dH = _V * sinQ;

            // dLt
            dLt = (_V / (_rz + _H)) * cosQ * sinCr;

            // dLn
            dLn = (_V / (_rz + _H)) * secLt * cosQ * cosCr;

            // Euler
            _V += dV * dt;
            _Q += dQ * dt;
            _Cr += dCr * dt;
            _H += dH * dt;
            _Lt += dLt * dt;
            _Ln += dLn * dt;

            // Position
            _px = (_rz + _H) * _Ln;
            _pz = (_rz + _H) * _Lt;
        }
    }

Пример использования

            mPlaneSim.Integrate(mDeltaTime);

            float alpha = (float)(mPlaneSim._Q + mPlaneSim._a) * Utils.DEG2RAD;
            float cr = (float)mPlaneSim._Cr;
            float gamma = (float)mPlaneSim._y;

            mPlaneDir.X = -cr;
            mPlaneDir.Y = -alpha;
            mPlaneDir.Z = -gamma;

            float scale = 10.0f;
            mPlanePos.X = -(float)mPlaneSim._pz * scale;
            mPlanePos.Y = (float)mPlaneSim._H;
            mPlanePos.Z = (float)mPlaneSim._px * scale;

            PlaneMesh.Position = mPlanePos;
            PlaneMesh.Rotation = mPlaneDir;
            PlaneMesh.Draw();
#1
17:37, 5 мая 2008

леденящий дужу пи:%ец

#2
18:18, 5 мая 2008

ух, жесть жестяная, сразу вспомнил динамику полета ЛА в универе ))

#3
21:39, 5 мая 2008

жесть но работает, это было сделано в маткаде одним из преподавателей, есть вероятность что даже правильно :)

#4
21:52, 5 мая 2008

baga
Мдаа, ребята.. прикинул я так формулы.. интегрирование со вторым порядком точности это, конечно, замечательно, вот только такой говнокод никому нафиг не нужен(

#5
22:01, 5 мая 2008

не нравится не смотри, в чем проблема, если такой умный напиши лучше

#6
22:03, 5 мая 2008

>не нравится не смотри, в чем проблема, если такой умный напиши лучше
no offence, ты что.. я просто выразил своё восхищение университетским подходам. а сам я поидее постоянно пишу симуляции различных физических процессов, но это так, к слову.

#7
22:57, 5 мая 2008

baga
>>если такой умный напиши лучше
жжош....демки видел?

#8
23:05, 12 мая 2008

мож тему открыть, про то, что бывает, когда университетские зубры что-то программируют ? :)

Хотя порой преподаватели выдают интересные идеи. Где-то в мох закромах лежит силовой расчёт плоских рычажных механизмов, который любимая кафедра "теория машин и механизмов" на паскале ваяла, может тоже кому надо )

#9
7:37, 13 мая 2008

cx, cy, cz пипец.
Почему бы не оформить все это в виде векторов?
Код просто ужасен.

#10
10:30, 13 мая 2008

Да нормальный код. Вы не понимаете, профессора так видят - не код, а формулы за ними :).

#11
11:41, 13 мая 2008

А знаете, что ещё замечательно в таком коде? Даа.. Разложение точности до второго порядка - это невозможно круто. Но стоит коэффициент динамического трения поставить в полтора раза побольше, толкнуть самолётик чуть посильнее - и система "взрывается" :) А если бы обошлись неявным интегратором, то мало того, что стабильность бы повысилась, ещё бы время вычислений сократилось, значит, можно было бы меньше таймстеп брать, следовательно, и точность повысилась бы :)

Прошло более 5 лет
#12
11:37, 27 июля 2013

Зачем эти подчёркивания везде, читать же невозможно?

#13
12:33, 27 июля 2013

Интегратор - Эйлер, там это написано даже. Ну, интегратор можно и заменить. А человек делится, для вас старается, а вы его в штыки. ))

#14
3:30, 28 июля 2013

Господи да что вы как маленькие.
Наплевать на код, причесать, переписать не проблема.
Надо проверить, работает ли?

Страницы: 1 2 Следующая »
ПрограммированиеФорумФизика

Тема в архиве.