コード例 #1
0
        //TempRes temp = new TempRes();
        public override ShrinkageResult[] Calculate(IRollLine line, IFilm film)
        {
            List <lengthsSector> lengthsSpectre = new List <lengthsSector>();

            Line  = line;
            IFilm = film;
            Rolls = line.WorkingRolls.ToList();
            var results = new List <ShrinkageResult>();

            Length[] ls    = new Length[Rolls.Count];
            var      L     = Ls().Select(x => x.l).ToArray();
            var      films = Films();
            //CalcCoveringAngles(ls, Rolls);
            var n   = IFilm.Material.GetScalarValue("n");
            var b   = IFilm.Material.GetScalarValue("b");
            var mu0 = IFilm.Material.GetScalarValue("mu0");
            var Tr  = IFilm.Material.GetScalarValue("Tr");

            var A = IFilm.Material.GetScalarValue("A_mr");
            var B = IFilm.Material.GetScalarValue("B_mr");
            var C = IFilm.Material.GetScalarValue("C_mr");

            var x1 = Math.Pow(2, n + 1);

            //////////

            /*
             * temp.AddStr("Расчет усадки полимерной пленки на базе модели Муни-Ривлина\r\n");
             * temp.AddStr("Индекс степенного закона = " + n.ToString() + "\r\n");
             * temp.AddStr("Температурный индекс = " + b.ToString() + ",1/С\r\n");
             * temp.AddStr("Коэффициент вязкости = " + mu0.ToString() + ",Па*с\r\n");
             * temp.AddStr("Температура приведения = " + Tr.ToString() + ",С\r\n");
             * temp.AddStr("");
             * temp.AddStr("Параметры тела Муни-Ривлина, эмпирические коэффициенты");
             * temp.AddStr("A = " + A.ToString() + "\r\n");
             * temp.AddStr("B = " + B.ToString() + "\r\n");
             * temp.AddStr("C = " + C.ToString() + "\r\n");*/
            //////////

            var gSum   = 0.0;
            var result = new List <double>();


            ///////
            //temp.AddStr("Валок\tТемпература\tВязкость\tНапряжение вытяжки\tПродольная усадка реологического тела Муни-Ривлина\r\n");
            double sumShrinkage = 0, goalShrinkage = 60;
            double sMin = 0, sMax = goalShrinkage * 1.5 / (Rolls.Count - 1);

            for (var i = 0; i < Rolls.Count - 1; ++i)
            {
                var currentRoll = Rolls[i];
                var nextRoll    = Rolls[i + 1];

                var currentFilm = films[i];
                var nextFilm    = films[i + 1];
                var x2          = Math.Pow((currentRoll.Velocity * n) / (L[i] * (1 - n)), n) * Math.Pow(2, n + 1);
                var x3          = Math.Pow(1 - currentRoll.Velocity / nextRoll.Velocity, 1 - n);
                var x4          = (currentFilm.Thickness * currentFilm.Width) / (nextFilm.Thickness * nextFilm.Width);
                var temperature = nextRoll.Temperature - Tr;
                var mu          = mu0 * Math.Exp(-b * temperature);
                var G           = x1 * x2 * x3 * x4 * mu;
                if (!double.IsNaN(G) && !double.IsInfinity(G))
                {
                    gSum = G;
                }
                const double step = 0.1;
                var          sum  = gSum;
                //AddStr("");
                //temp.AddStr(string.Format("\nПоиск корня уравнения: {0}*x^6 + {1}*x^4 + {2}*x^3 - {1}*x^2 - {3}", C, A, B - C - sum, B));
                //temp.AddStr(string.Format("\nна отрезке: [{0}; {1}]", sMin, sMax));
                //var root = MathMethods.ScanRoot(Sl => (C * Math.Pow(Sl, 6) + A * Math.Pow(Sl, 4) + (B - C - sum) * Math.Pow(Sl, 3) - A * Sl * Sl - B), sMin, sMax, 0.0001, 1000);
                var root = MathMethods.BisectRoot(Sl => (C * Math.Pow(Sl, 6) + A * Math.Pow(Sl, 4) + (B - C - sum) * Math.Pow(Sl, 3) - A * Sl * Sl - B), sMin, sMax, 0.0001, 100000);
                //AddStr("");
                //temp.AddStr(string.Format("\nF({0}) = {1}", root, (C * Math.Pow(root, 6) + A * Math.Pow(root, 4) + (B - C - sum) * Math.Pow(root, 3) - A * root * root - B)));

                //sMin += root;
                //sMax += root;
                int ind = 0;
                if (double.IsNaN(root))
                {
                    ind++;
                    break;
                }
                if (!double.IsNaN(root) && Math.Abs(Math.Round(root, 5) - 1) > 0.001)
                {
                    result.Add(root);
                }

                ///////
                //temp.AddStr((i + 1).ToString() + "\t\t" + temperature.ToString() + "С\t" + Math.Round(mu, 4).ToString() + "Па*с\t\t " + Math.Round(root, 4).ToString() + "\t\t" + Math.Round(G, 4) + "\t");
                ///////
                //results.Add(new ShrinkageResult(-result.Sum(x => (x)), ind, 0));
            }

            //////
            //AddStr("");
            //temp.AddStr("Усадка полимерной пленки");
            //temp.AddStr("Ширина\t\tДлина\t\tТолщина");

            /*foreach (var item in results)
             * {
             *  temp.AddStr(Math.Round(item.Sw, 5).ToString() + "% \t" + Math.Round(item.Sl, 5).ToString() + "% \t" + item.Sh.ToString() + "%");
             * }*/

            //temp.SaveToFile("D:\\" + ModelName + ".txt");
            ////////

            return(results.ToArray());
        }