Ejemplo n.º 1
0
        /// <summary>
        /// получиь параметр распределения вейбулла бета
        /// </summary>
        /// <returns></returns>
        private static double getVeybullBeta(double v0, double veybullGamma)
        {
            double arg = 1d + 1d / veybullGamma;
            double G   = SpecialFunction.gamma(arg);

            return(v0 / G);
        }
        public double kappa(double lambdaL, double lambdaS, double aL, double time)
        {
            //double temp = Math.Sqrt(Math.PI) * (lambdaL - lambdaS) / (2 * aL * Math.Sqrt(time));
            double temp = SpecialFunction.gamma(0.2) * (lambdaL - lambdaS) / (5 * aL * Math.Pow(time, 0.2));

            //double temp = Math.Sqrt(Math.PI) * (lambdaL - lambdaS) / (2 * aL * Math.Sqrt(time));
            return(temp);
        }
Ejemplo n.º 3
0
        private double density(double x)
        {
            double fx2 = 0;

            if (x <= 0)
            {
                fx2 = 0;
            }
            else
            {
                fx2 = (Math.Pow(2, -(size_segs) / 2.0) / SpecialFunction.gamma(size_segs / 2.0)) * Math.Pow(x, (size_segs) / 2.0 - 1) * Math.Exp(-x / 2.0);
            }
            return(fx2);
        }
Ejemplo n.º 4
0
        private double f(double x) // плотность вероятности
        {
            double res = 0;

            if (x <= 0)
            {
                res = 0;
            }
            else
            {
                res = (Math.Pow(2, -((double)k_intervals - 1.0) / 2.0) / SpecialFunction.gamma(((double)k_intervals - 1.0) / 2.0)) * Math.Pow(x, (((double)k_intervals - 1.0) / 2.0) - 1.0) * Math.Exp(-x / 2.0);
            }
            //res = (Math.Pow(2, -((double)k_intervals - 1.0) / 2.0) / SpecialFunction.gamma(((double)k_intervals - 1.0) / 2.0)) * Math.Pow(x, ((double)k_intervals - 1.0) / 2.0 - 1.0) * Math.Exp(-x / 2.0);
            return(res);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// возвращает экстремальную скорость ветра за 50 лет
        /// </summary>
        /// <param name="v0"></param>
        /// <param name="veybullGamma"></param>
        /// <returns></returns>
        private static double getExtremalSpeed(double v0, double veybullGamma)
        {
            double k;

            if (veybullGamma <= 1.77)
            {
                double T = 50d;
                double n = 23037d;
                double a, b, d;
                a = SpecialFunction.gamma(1d + 1d / veybullGamma);
                d = 1 - Math.Exp(Math.Log(1d - 1d / T) / n);
                b = -1 * Math.Log(d);
                k = (1 / a) * Math.Pow(b, 1 / veybullGamma);
            }
            else
            {
                k = 5;
            }
            return(v0 * k);
        }
        static void Main(string[] args)
        {
            //double cS= 1000, cL= 1290, roS= 2679, roL= 2380, L= 390000, tempKrzep= 930, u0= 1213, uI= 298, lambdaL=104,lambdaS= 240;
            //double cS = 690, cL = 800, roS = 7500, roL = 7000, L = 270000, tempKrzep = 1773, u0 = 2213, uI = 323, lambdaL = 33, lambdaS = 30;
            double cS = 25, cL = 26, roS = 10, roL = 10, tempKrzep = 1, u0, uI, /*u0 = 1573, uI =973,*/ lambdaL = 130, lambdaS = 125;
            //double cS = 4217, cL = 4182, roS = 999.82, roL = 998.29, L = 334000, tempKrzep = 273, u0=293, uI=263, /*u0 = 1573, uI =973,*/ lambdaL = 0.6, lambdaS = 0.569;
            int    lbIteracji = 200;
            double a, stalaA, stalaSigma;
            double aL = lambdaL / (roL * cL);
            //double entalpiaL = 3536280000, entalpiaS = 2491470000;
            //double entalpiaL = 11200275000, entalpiaS = 9175275000;
            //double entalpiaL = 500, entalpiaS = 250;
            double entalpiaS, entalpiaL;
            double b = 2;
            double alfa = 0.8;
            int    granica = 0;
            int    n = 1000;
            double deltaX = b / n, deltaT = 0.01;


            //double[] temp0= { 50,50,50,50,50};
            //int n = temp0.Length;


            double[] temp0 = new double[n + 1];


            for (int i = 0; i <= n; i++)
            {
                //temp0[i] = tempKrzep-i*dT;
                //temp0[i] = uI;
                //temp0[i] =Math.Exp(-deltaX*i); /*warunek początkowy T0 */
                temp0[i] = Math.Exp(-deltaX * i);
            }

            double[] aVec = new double[n + 1];
            double[] bVec = new double[n + 1];
            double[] cVec = new double[n + 1];
            double[] dVec = new double[n + 1];
            double[,] tabH        = new double[lbIteracji + 1, n + 1];
            double[,] tabHKreska  = new double[lbIteracji + 1, n + 1];
            double[,] tabHDaszek  = new double[lbIteracji + 1, n + 1];
            double[,] tabH2Kreska = new double[lbIteracji + 1, n + 1];
            double[,] tabH2Daszek = new double[lbIteracji + 1, n + 1];
            int[] tabTx = new int[n + 1]; /*tablica, w której zapisane są czasy tx topnienia dla danego punktu x*/

            double suma = 0;
            int    j    = 1;
            int    l    = 990;

            double[] temperatury = new double[n + 1];


            funkcje.MetodaThomasa thomas = new funkcje.MetodaThomasa(); /* obiekt klasy MetodaThomasa do rozwiązania układu równań */
            double[] wynikThomas;

            funkcje.Temperatura tempZEntalpii = new funkcje.Temperatura(); /* obiekt klasy Temperatura do wyznaczenia temperatury na podstawie entalpii */
            double temp;

            funkcje.FunkcjaG funkcjaG = new funkcje.FunkcjaG(); /* obiekt klasy funkcjaG */
            double           wynikG;

            funkcje.Entalpia entZtemp = new funkcje.Entalpia();
            double           ent;

            funkcje.Kappa kap = new funkcje.Kappa();
            double        kappa;



            for (int i = 0; i <= n; i++)
            {
                tabTx[i] = lbIteracji; /* ustawiamy czas topnienia dla punktu x na lbIteracji */
            }
            kappa     = kap.kappa(lambdaL, lambdaS, aL, 1);
            entalpiaS = cS * roS * tempKrzep;
            entalpiaL = entalpiaS + kappa;

            for (int i = 0; i < temp0.Length; i++)
            {
                if (temp0[i] > tempKrzep)
                {
                    tabH[0, i] = entZtemp.entalpia(temp0[i], tempKrzep, cL, roL, cS, roS, kappa); /* Etap 1: wyznaczamy entalpie w chwili 0 na podstawie T0*/
                }
                else
                {
                    tabH[0, i] = entZtemp.entalpia(temp0[i], tempKrzep, cL, roL, cS, roS, kappa);
                }
            }

            //Console.Write("tabH0[n-1]: {0}", tabH[0, 0]);

            /*Console.Write("tabH0: ");
             * for (int i = 0; i < n; i++)
             *  Console.Write("{0} ", tabH[0, i]);*/


            stalaSigma = 1 / (SpecialFunction.gamma(1 - alfa) * (1 - alfa) * Math.Pow(deltaT, alfa)); /* wartość funkcji sigma */



            //for (int j = 1; j < lbIteracji; j++)
            while (granica < l && j <= lbIteracji)
            {
                a      = lambdaL / (cL * roL); /* Etap 2a: sprowadzamy całość do fazy ciekłej */
                stalaA = a / (Math.Pow(deltaX, 2));

                kappa     = kap.kappa(lambdaL, lambdaS, aL, deltaT * j);
                entalpiaS = cS * roS * tempKrzep;
                entalpiaL = entalpiaS + kappa;


                for (int i = 0; i < temp0.Length; i++)
                {
                    tabHKreska[j - 1, i] = Math.Max(tabH[j - 1, i], entalpiaL);
                }

                //Console.WriteLine(" ");
                //Console.Write("tabHKreska: ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabHKreska[j-1, i]);

                //Console.Write("tabHKreska[n-1]: {0}", tabHKreska[j-1, 0]);

                aVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    aVec[i] = -stalaA;
                }
                aVec[n] = -2 * stalaA;

                bVec[0] = 1;
                for (int i = 1; i < n + 1; i++)
                {
                    bVec[i] = stalaSigma + 2 * stalaA;
                }

                cVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    cVec[i] = -stalaA;
                }
                cVec[n] = 0;

                //u0 = Math.Exp(a*(j)*deltaT);
                u0      = Math.Exp(a * (j) * deltaT);
                dVec[0] = entZtemp.entalpia(u0, tempKrzep, cL, roL, cS, roS, kappa); /* obliczenie entalpii dla brzegowej temperatury u0 */
                Console.WriteLine(dVec[0] > entalpiaL);

                for (int i = 1; i <= n; i++)
                {
                    suma = 0;

                    for (int it = 2; it <= j; it++)
                    {
                        suma = suma + (Math.Pow(it, 1 - alfa) - Math.Pow(it - 1, 1 - alfa)) * (tabHKreska[j - it + 1, i] - tabHKreska[j - it, i]);
                    }

                    dVec[i] = stalaSigma * tabHKreska[j - 1, i] - stalaSigma * suma + cL * roL * funkcjaG.g(i, tabTx[i], tabHKreska, j, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);
                }


                wynikThomas = thomas.nowa(aVec, bVec, cVec, dVec); /* rozwiązanie układu równań metodą Thomasa */

                for (int i = 0; i <= n; i++)
                {
                    tabHDaszek[j, i] = wynikThomas[i];
                }

                //Console.Write("tabHDaszek[n-1]: {0}", tabHDaszek[j, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabHDaszek wyznaczone z Thomasa: ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabHDaszek[j, i]);


                for (int i = 0; i <= n; i++)
                {
                    tabHKreska[j, i] = tabHDaszek[j, i] + (tabH[j - 1, i] - tabHKreska[j - 1, i]); /* korekta entalpii */
                }
                //Console.Write("tabHKreska[n-1]: {0}", tabHKreska[j, 0]);

                /* Console.WriteLine(" ");
                 * Console.Write("tabHKreska po korekcie: ");
                 * for (int i = 0; i < n; i++)
                 *   Console.Write("{0} ", tabHKreska[j, i]); */


                a      = lambdaS / (cS * roS); /* Etap 2b: sprowadzamy całość do fazy stałej  */
                stalaA = a / (Math.Pow(deltaX, 2));


                for (int i = 0; i <= n; i++)
                {
                    tabH2Kreska[j - 1, i] = Math.Min(tabHKreska[j, i], entalpiaS);
                }

                //Console.Write("tabH2Kreska[n-1]: {0}", tabH2Kreska[j-1, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabH2Kreska (minimum): ");
                //for (int i = 0; i < n; i++)
                //    Console.Write("{0} ", tabH2Kreska[j-1, i]);

                aVec[0] = 0;
                for (int i = 1; i < n; i++)
                {
                    aVec[i] = -stalaA;
                }
                aVec[n] = 0;


                for (int i = 0; i < n; i++)
                {
                    bVec[i] = stalaSigma + 2 * stalaA;
                }
                bVec[n] = 1;

                cVec[0] = -2 * stalaA;
                for (int i = 1; i < n; i++)
                {
                    cVec[i] = -stalaA;
                }
                cVec[n] = 0;


                for (int i = 0; i < n; i++)
                {
                    suma = 0;
                    for (int it = 2; it <= j; it++)
                    {
                        suma = suma + (Math.Pow(it, 1 - alfa) - Math.Pow(it - 1, 1 - alfa)) * (tabH2Kreska[j - it + 1, i] - tabH2Kreska[j - it, i]);
                    }

                    dVec[i] = stalaSigma * tabH2Kreska[j - 1, i] - stalaSigma * suma + cL * roL * funkcjaG.g(i, tabTx[i], tabH2Kreska, j, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);;
                }
                uI = Math.Exp(a * (j) * deltaT - 2);
                //uI =Math.Exp(a*(j)*deltaT-1);
                dVec[n] = entZtemp.entalpia(uI, tempKrzep, cL, roL, cS, roS, kappa);
                Console.WriteLine(uI);

                wynikThomas = thomas.nowa(aVec, bVec, cVec, dVec); /* rozwiązanie układu równań metodą Thomasa */


                for (int i = 0; i <= n; i++)
                {
                    tabH2Daszek[j, i] = wynikThomas[i];
                }

                //Console.Write("tabH2Daszek[n-1]: {0}", tabH2Daszek[j, 0]);

                //Console.WriteLine(" ");
                // Console.Write("tabH2Daszek z thomasa: ");
                // for (int i = 0; i < n; i++)
                // Console.Write("{0} ", tabH2Daszek[j, i]);

                for (int i = 0; i <= n; i++)
                {
                    tabH[j, i] = tabH2Daszek[j, i] + (tabHKreska[j, i] - tabH2Kreska[j - 1, i]); /* korekta */
                }
                //Console.Write("tabH[n-1]: {0}", tabH[j, 0]);

                //Console.WriteLine(" ");
                //Console.Write("tabH po korekcie: ");
                //for (int i = 0; i < n; i++)
                //{
                //    Console.Write("{0} ", tabH[j, i]);
                //}

                //Console.WriteLine(" ");
                //Console.Write("temp tabH: ");
                //for (int i = 0; i < n; i++)
                //{
                //    Console.Write("{0} ", tempZEntalpii.temperatura(tabH[j, i]));
                //}

                //Console.WriteLine(" ");

                for (int i = 0; i <= n; i++)
                {
                    if (tabH[j, i] > entalpiaS && tabH[j - 1, i] <= entalpiaS)
                    {
                        tabTx[i] = j;
                    }
                }

                for (int i = 1; i < n; i++)
                {
                    if (tabH[j, i] <= entalpiaS && tabH[j, i + 1] <= entalpiaS && tabH[j, i - 1] > entalpiaS)
                    {
                        granica = i;
                    }
                }


                Console.WriteLine("{0}", j);
                j++;
            }

            Console.Write("tabH: ");
            for (int i = 0; i <= n; i++)
            {
                Console.Write("{0} ", tabH[j - 1, i]);
            }

            string path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\entalpie.csv";

            System.IO.StreamWriter str = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", tabH[j - 1, i]);
            }
            str.Close();

            Console.WriteLine("");
            Console.Write("temp tabH: ");
            for (int i = 0; i <= n; i++)
            {
                temperatury[i] = tempZEntalpii.temperatura(tabH[j - 1, i], tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS);
                Console.Write("{0} ", temperatury[i]);
            }

            path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\temperatury.csv";
            str  = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", temperatury[i]);
            }
            str.Close();

            Console.WriteLine("");
            Console.Write("Wartość tabTx:");
            for (int i = 0; i <= n; i++)
            {
                Console.Write("{0} ", tabTx[i]);
            }

            path = @"C:\Users\agata.chmielowska\Desktop\AlgorytmC1zestawDanych\Wyniki\granica.csv";
            str  = new System.IO.StreamWriter(path, false);

            for (int i = 0; i <= n; i++)
            {
                str.WriteLine("{0} ", tabTx[i] * deltaT);
            }
            str.Close();

            Console.WriteLine("");
            Console.WriteLine("Program zakończył działanie po {0} iteracjach", j - 1);

            Console.WriteLine("");
            Console.WriteLine("Granica znajduje sie w punkcie: {0}", granica);

            temp = tempZEntalpii.temperatura(entalpiaL, tempKrzep, cL, roL, cS, roS, kappa, entalpiaL, entalpiaS);
            Console.WriteLine("Wartosc temperatury: {0}", temp);

            wynikG = funkcjaG.g(5, tabTx[5], tabH, 20, stalaSigma, alfa, cL, cS, roL, roS, tempKrzep, entalpiaL, entalpiaS, kappa);
            Console.WriteLine("Wartość g: {0} ", wynikG);

            Console.WriteLine("Wartość funkcji gamma: {0} ", SpecialFunction.gamma(0.5));



            Console.ReadKey();
            return;
        }
Ejemplo n.º 7
0
        private void button2_Click(object sender, EventArgs e)
        {
            alfa  = Convert.ToDouble(textBox4.Text);
            st_sv = size - 1;
            for (int j = 0; j < size; ++j)
            {
                ni[j] = 0;
            }
            dataGridView2.Rows.Clear();
            dataGridView3.Rows.Clear();
            dataGridView2.RowCount    = size;
            dataGridView2.ColumnCount = 1;
            dataGridView3.ColumnCount = size + 2;
            dataGridView3.RowCount    = 4;

            dataGridView2.Rows[0].Cells[0].Value = Convert.ToString(Int64.MinValue);
            for (int j = 1; j < size; ++j)
            {
                dataGridView2.Rows.Add();
                board[j] = (min + ((max - min) / size) * j);
                dataGridView2.Rows[j].Cells[0].Value = Convert.ToString(board[j]);
            }
            dataGridView2.Rows[size].Cells[0].Value = Convert.ToString(Int64.MaxValue);

            for (int j = 0; j < size + 1; ++j)
            {
                zi[j] = (Convert.ToDouble(dataGridView2.Rows[j].Cells[0].Value));
                dataGridView3.Rows[0].Cells[j + 1].Value = Convert.ToString(zi[j]);
            }

            Refresh();

            for (int i = 0; i < n; i++)
            {
                for (int j = 1; j < size + 1; j++)
                {
                    if ((ksi[i] <= zi[j]) && (ksi[i] >= zi[j - 1]))
                    {
                        ni[j - 1]++;
                        break;
                    }
                }
            }
            double R0 = 0;
            double tt = 0;
            double pp = 0;

            dataGridView3.Rows[1].Cells[0].Value = Convert.ToString("nj");
            dataGridView3.Rows[2].Cells[0].Value = Convert.ToString("qj");
            dataGridView3.Rows[3].Cells[0].Value = Convert.ToString("R0");

            for (int j = 0; j < size; j++)
            {
                dataGridView3.Rows[1].Cells[j + 2].Value = Convert.ToString(ni[j]);
                if (zi[j] < 0)
                {
                    tt = 1 - Math.Pow(Math.E, 0);
                }
                else
                {
                    tt = 1 - Math.Pow(Math.E, -lambda * (zi[j]));
                }
                if (zi[j + 1] < 0)
                {
                    pp = 1 - Math.Pow(Math.E, 0);
                }
                else
                {
                    pp = 1 - Math.Pow(Math.E, -lambda * (zi[j + 1]));
                }
                dataGridView3.Rows[2].Cells[j + 2].Value = (pp - tt);
                R0 += Math.Pow(ni[j] - n * (pp - tt), 2) / (n * (pp - tt));
                dataGridView3.Rows[3].Cells[j + 2].Value = R0;
            }
            label5.Text = Convert.ToString(R0);
            double FR0 = 0;
            double xi2 = 0;
            double R0_ = R0;

            R0 = 0;
            int jj = 0;

            chart1.Series["Series1"].Points.Clear();
            while (R0 < R0_)
            {
                R0 = jj * 0.2;
                for (int i = 1; i < n; i++)
                {
                    xi2 += R0 / (2 * n) * Math.Pow(2, -st_sv / 2) * Math.Pow(SpecialFunction.gamma(st_sv / 2), -1) * (Math.Pow(Math.E, -(R0 * (i - 1) / n) / 2) * Math.Pow((R0 * (i - 1) / n), st_sv / 2 - 1) + Math.Pow(Math.E, -(R0 * i / n) / 2) * Math.Pow((R0 * i / n), st_sv / 2 - 1));
                }
                chart1.Series["Series1"].Points.AddXY(R0, xi2);
                xi2 = 0;
                jj++;
            }

            for (int i = 1; i < n; i++)
            {
                xi2 += R0_ / (2 * n) * Math.Pow(2, -st_sv / 2) * Math.Pow(SpecialFunction.gamma(st_sv / 2), -1) * (Math.Pow(Math.E, -(R0_ * (i - 1) / n) / 2) * Math.Pow((R0_ * (i - 1) / n), st_sv / 2 - 1) + Math.Pow(Math.E, -(R0_ * i / n) / 2) * Math.Pow((R0_ * i / n), st_sv / 2 - 1));
            }
            FR0 = 1 - xi2;


            label8.Text = Convert.ToString(FR0);


            if (FR0 > alfa)
            {
                label9.Text = Convert.ToString("Гипотеза принята");
            }
            else
            {
                label9.Text = Convert.ToString("Гипотеза отвержена");
            }

            R0 = 0;
        }