Пример #1
0
        public static matrica umnozh(matrica m1_, matrica m2_)
        {
            double  pa = m1_.a * m2_.a + m1_.b * m2_.c;
            double  pb = m1_.a * m2_.b + m1_.b * m2_.d;
            double  pc = m1_.c * m2_.a + m1_.d * m2_.c;
            double  pd = m1_.c * m2_.b + m1_.d * m2_.d;
            matrica p_ = new matrica(pa, pb, pc, pd);

            return(p_);
        }
Пример #2
0
        static void Main(string[] args)
        {
            //задаем переменные
            double qv  = 8;
            double Tc  = 293;
            double k   = 0.14;
            double a   = 0.5;
            double Rae = 1;
            double Lae = 8;
            double P   = 0.0000082;
            double Q   = 0.0000017;
            double n0  = 1.8197;
            double R1  = -200;
            double R2  = -200;
            double Lc  = 12;
            double Lc1 = 6;

            //расчет температуры
            double To = Tc + ((qv * Rae * Rae) / (4 * k)) + ((qv * Rae) / (2 * a));
            double dT = (qv * Rae * Rae) / (4 * k);

            //цикл для построения графика зависимости температуры от радиуса
            double[] T = new double[(int)(100 * Rae) + 1];
            for (int i = 0; i <= (int)(100 * Rae); i++)
            {
                T[i] = To - (dT * Math.Pow(Rae, -2) * i * i / 10000);
            }

            //расчет фокусного расстояния
            double fr = (Rae * Rae) / (2 * (P + (Q / 2)) * dT * Lae);
            double ff = (Rae * Rae) / (2 * (P - (Q / 2)) * dT * Lae);
            double f  = (fr + ff) / 2;

            //задаем матрицы
            matrica tonkx = new matrica(0, 0, 0, 0);
            matrica prex  = new matrica(0, 0, 0, 0);
            matrica aftx  = new matrica(0, 0, 0, 0);
            matrica x     = new matrica(0, 0, 0, 0);

            //считаем матрицу для пути в одну сторону для тонкой линзы
            tonkx.a = 1; tonkx.b = 0; tonkx.c = (-1 / f); tonkx.d = 1;
            prex.a  = 1; prex.b = 0.5 * Lae / n0; prex.c = 0; prex.d = 1;
            aftx.a  = 1; aftx.b = 0.5 * Lae / n0; aftx.c = 0; aftx.d = 1;
            x       = umnozh((umnozh(aftx, tonkx)), prex);

            //считаем npov на поверхности и n2 (не показатель преломления, размерность см^-1)
            double npov = n0 + (P * dT / 2) - ((P + (Q / 2)) * dT * 1);
            double n2   = 2 * (n0 - npov) / (Rae * Rae);

            //упрощаем расчет для "толстой" линзы
            matrica y    = new matrica(0, 0, 0, 0);
            double  skob = Lae * Math.Sqrt(n2 / n0);
            double  kor  = Math.Sqrt(n2 * n0);

            //считаем матрицу для пути в одну сторону для "толстой" линзы
            y.a = Math.Cos(skob);
            y.b = (1 / kor) * Math.Sin(skob);
            y.c = (-1 * kor) * Math.Sin(skob);
            y.d = Math.Cos(skob);

            //задаем матрицы для полного обхода резонатора
            double  Lc2      = Lc - Lc1;
            matrica z1       = new matrica(0, 0, 0, 0);
            matrica z2       = new matrica(0, 0, 0, 0);
            matrica pre      = new matrica(0, 0, 0, 0);
            matrica aft      = new matrica(0, 0, 0, 0);
            matrica polntonk = new matrica(0, 0, 0, 0);

            z1.a  = 1; z1.b = 0; z1.c = (-2 / R1); z1.d = 1;
            z2.a  = 1; z2.b = 0; z2.c = (-2 / R2); z2.d = 1;
            pre.a = 1; pre.b = Lc1 - (0.5 * Lae); pre.c = 0; pre.d = 1;
            aft.a = 1; aft.b = Lc2 - (0.5 * Lae); aft.c = 0; aft.d = 1;

            //считаем матрицу для полного обхода резонатора
            polntonk = umnozh(z1, pre);
            polntonk = umnozh(polntonk, prex);
            polntonk = umnozh(polntonk, tonkx);
            polntonk = umnozh(polntonk, aftx);
            polntonk = umnozh(polntonk, aft);
            polntonk = umnozh(polntonk, z2);
            polntonk = umnozh(polntonk, aft);
            polntonk = umnozh(polntonk, aftx);
            polntonk = umnozh(polntonk, tonkx);
            polntonk = umnozh(polntonk, prex);
            polntonk = umnozh(polntonk, pre);

            //проверяем неустойчивость резонатора (>1 неустойчивый)
            double prov = (polntonk.a + polntonk.d) / 2;

            //задаем матрицы для полного обхода эквивалентного резонатора
            matrica plz1    = new matrica(0, 0, 0, 0);
            matrica tl1     = new matrica(0, 0, 0, 0);
            matrica plz2    = new matrica(0, 0, 0, 0);
            matrica tl2     = new matrica(0, 0, 0, 0);
            matrica polnekv = new matrica(0, 0, 0, 0);

            plz1.a = 1; plz1.b = 0; plz1.c = 0; plz1.d = 1;
            tl1.a  = 1; tl1.b = 0; tl1.c = (-1 / R1); tl1.d = 1;
            plz2.a = 1; plz2.b = 0; plz2.c = 0; plz2.d = 1;
            tl2.a  = 1; tl2.b = 0; tl2.c = (-1 / R2); tl2.d = 1;

            //считаем матрицу для полного обхода эквивалентного резонатора
            polnekv = umnozh(tl1, plz1);
            polnekv = umnozh(polnekv, tl1);
            polnekv = umnozh(polnekv, pre);
            polnekv = umnozh(polnekv, prex);
            polnekv = umnozh(polnekv, tonkx);
            polnekv = umnozh(polnekv, aftx);
            polnekv = umnozh(polnekv, aft);
            polnekv = umnozh(polnekv, tl2);
            polnekv = umnozh(polnekv, plz2);
            polnekv = umnozh(polnekv, tl2);
            polnekv = umnozh(polnekv, aft);
            polnekv = umnozh(polnekv, aftx);
            polnekv = umnozh(polnekv, tonkx);
            polnekv = umnozh(polnekv, prex);
            polnekv = umnozh(polnekv, pre);

            //проверяем неустойчивость эквивалентного резонатора (>1 неустойчивый)
            double provekv = polnekv.a * polnekv.d;

            ////проверяем неустойчивость через g1, g2 (>1 неустойчивый)
            double L_    = Lc1 + Lc2 - (Lc1 * Lc2 / f);
            double g1    = 1 - (Lc2 / f) - (L_ / R1);
            double g2    = 1 - (Lc1 / f) - (L_ / R2);
            double provg = g1 * g2;

            //определяем R и mu для усредненного f
            double Rtrue = Math.Pow(R2, -1) + Math.Sqrt((polnekv.c * polnekv.d) / (polnekv.a * polnekv.b));

            Rtrue = Math.Pow(Rtrue, -1);
            double Rfalse = Math.Pow(R2, -1) - Math.Sqrt((polnekv.c * polnekv.d) / (polnekv.a * polnekv.b));

            Rfalse = Math.Pow(Rfalse, -1);
            double mutrue  = (polnekv.a * polnekv.d) + (polnekv.b * polnekv.c) + 2 * Math.Sqrt(polnekv.a * polnekv.b * polnekv.c * polnekv.d);
            double mufalse = (polnekv.a * polnekv.d) + (polnekv.b * polnekv.c) - 2 * Math.Sqrt(polnekv.a * polnekv.b * polnekv.c * polnekv.d);

            //задаем матрицы для вычисления матрицы обхода резонатора для fr и ff
            matrica tonkxr = new matrica(0, 0, 0, 0);
            matrica tonkxf = new matrica(0, 0, 0, 0);

            tonkxr.a = 1; tonkxr.b = 0; tonkxr.c = (-1 / fr); tonkxr.d = 1;
            tonkxf.a = 1; tonkxf.b = 0; tonkxf.c = (-1 / ff); tonkxf.d = 1;
            matrica polnekvr = new matrica(0, 0, 0, 0);
            matrica polnekvf = new matrica(0, 0, 0, 0);

            //считаем R и mu для fr
            polnekvr = umnozh(tl1, plz1);
            polnekvr = umnozh(polnekvr, tl1);
            polnekvr = umnozh(polnekvr, pre);
            polnekvr = umnozh(polnekvr, prex);
            polnekvr = umnozh(polnekvr, tonkxr);
            polnekvr = umnozh(polnekvr, aftx);
            polnekvr = umnozh(polnekvr, aft);
            polnekvr = umnozh(polnekvr, tl2);
            polnekvr = umnozh(polnekvr, plz2);
            polnekvr = umnozh(polnekvr, tl2);
            polnekvr = umnozh(polnekvr, aft);
            polnekvr = umnozh(polnekvr, aftx);
            polnekvr = umnozh(polnekvr, tonkxr);
            polnekvr = umnozh(polnekvr, prex);
            polnekvr = umnozh(polnekvr, pre);
            double Rr = Math.Pow(R2, -1) + Math.Sqrt((polnekvr.c * polnekvr.d) / (polnekvr.a * polnekvr.b));

            Rr = Math.Pow(Rr, -1);
            double mur = (polnekvr.a * polnekvr.d) + (polnekvr.b * polnekvr.c) + 2 * Math.Sqrt(polnekvr.a * polnekvr.b * polnekvr.c * polnekvr.d);

            //считаем R и mu для ff
            polnekvf = umnozh(tl1, plz1);
            polnekvf = umnozh(polnekvf, tl1);
            polnekvf = umnozh(polnekvf, pre);
            polnekvf = umnozh(polnekvf, prex);
            polnekvf = umnozh(polnekvf, tonkxf);
            polnekvf = umnozh(polnekvf, aftx);
            polnekvf = umnozh(polnekvf, aft);
            polnekvf = umnozh(polnekvf, tl2);
            polnekvf = umnozh(polnekvf, plz2);
            polnekvf = umnozh(polnekvf, tl2);
            polnekvf = umnozh(polnekvf, aft);
            polnekvf = umnozh(polnekvf, aftx);
            polnekvf = umnozh(polnekvf, tonkxf);
            polnekvf = umnozh(polnekvf, prex);
            polnekvf = umnozh(polnekvf, pre);
            double Rf = Math.Pow(R2, -1) + Math.Sqrt((polnekvf.c * polnekvf.d) / (polnekvf.a * polnekvf.b));

            Rf = Math.Pow(Rf, -1);
            double muf = (polnekvf.a * polnekvf.d) + (polnekvf.b * polnekvf.c) + 2 * Math.Sqrt(polnekvf.a * polnekvf.b * polnekvf.c * polnekvf.d);

            //задаем переменные для подбора f тепловой линзы резонатора на границе устойчивости
            double fx      = 0;
            double L_x     = 0;
            double g1x     = 0;
            double g2x     = 0;
            double provgx  = 0;
            double dprovgx = 100;
            double mfx     = 0;
            double mg1x    = 0;
            double mg2x    = 0;

            //подбираем f тепловой линзы резонатора на границе устойчивости
            for (int i = 10; i <= 1000; i++)
            {
                fx     = i;
                L_x    = Lc1 + Lc2 - (Lc1 * Lc2 / fx);
                g1x    = 1 - (Lc2 / fx) - (L_x / R1);
                g2x    = 1 - (Lc1 / fx) - (L_x / R2);
                provgx = g1x * g2x;
                if ((Math.Abs(1 - provgx)) < dprovgx)
                {
                    dprovgx = Math.Abs(1 - provgx);
                    mfx     = fx;
                    mg1x    = g1x;
                    mg2x    = g2x;
                }
            }

            Console.WriteLine("fr и ff тепловой линзы");
            Console.WriteLine(fr);
            Console.WriteLine(ff);
            Console.WriteLine();
            Console.WriteLine("f тепловой линзы");
            Console.WriteLine(f);
            Console.WriteLine();
            Console.WriteLine("тонкая линза: матрица пути в одну сторону");
            Console.WriteLine(x.a);
            Console.WriteLine(x.b);
            Console.WriteLine(x.c);
            Console.WriteLine(x.d);
            Console.WriteLine();
            Console.WriteLine("толстая линза: матрица пути в одну сторону");
            Console.WriteLine(y.a);
            Console.WriteLine(y.b);
            Console.WriteLine(y.c);
            Console.WriteLine(y.d);
            Console.WriteLine();
            Console.WriteLine("стандартный резонатор: матрица полного обхода");
            Console.WriteLine(polntonk.a);
            Console.WriteLine(polntonk.b);
            Console.WriteLine(polntonk.c);
            Console.WriteLine(polntonk.d);
            Console.WriteLine();
            Console.WriteLine("стандартный резонатор: критерий устойчивости");
            Console.WriteLine(prov);
            Console.WriteLine();
            Console.WriteLine("эквивалентный резонатор: матрица полного обхода");
            Console.WriteLine(polnekv.a);
            Console.WriteLine(polnekv.b);
            Console.WriteLine(polnekv.c);
            Console.WriteLine(polnekv.d);
            Console.WriteLine();
            Console.WriteLine("эквивалентный резонатор: критерий устойчивости");
            Console.WriteLine(provekv);
            Console.WriteLine();
            Console.WriteLine("критерий устойчивости через g1, g2");
            Console.WriteLine(provg);
            Console.WriteLine();
            Console.WriteLine("R и mu для усредненного f");
            Console.WriteLine(Rtrue);
            Console.WriteLine(mutrue);
            Console.WriteLine();
            Console.WriteLine("R и mu для fr");
            Console.WriteLine(Rr);
            Console.WriteLine(mur);
            Console.WriteLine();
            Console.WriteLine("R и mu для ff");
            Console.WriteLine(Rf);
            Console.WriteLine(muf);
            Console.WriteLine();
            Console.WriteLine("f, при котором резонатор находится на границе устойчивости");
            Console.WriteLine(mfx);
            Console.WriteLine();
            Console.WriteLine("g1 и g2");
            Console.WriteLine(mg1x);
            Console.WriteLine(mg2x);
            Console.WriteLine();
            Console.WriteLine();
            for (int i = 0; i <= (int)(100 * Rae); i++)
            {
                Console.WriteLine(i * 0.01);
            }
            Console.WriteLine();
            for (int i = 0; i <= (int)(100 * Rae); i++)
            {
                Console.WriteLine(T[i]);
            }

            Console.ReadLine();
        }