Пример #1
0
        //Методы для вычисления значений функций начальных условии и граничных условий
        private double sigma1Fun(double x)
        {
            Dictionary <string, FloatingPoint> xPackage = new Dictionary <string, FloatingPoint>();

            xPackage.Add("x", x);
            return(Exp.Parse(sigma1).Evaluate(xPackage).RealValue);
        }
Пример #2
0
        private double phi2Fun(double t)
        {
            Dictionary <string, FloatingPoint> tPackage = new Dictionary <string, FloatingPoint>();

            tPackage.Add("t", t);
            return(Exp.Parse(phi2).Evaluate(tPackage).RealValue);
        }
Пример #3
0
        //Инициализация СНАУ с клавиатуры
        public void InitSNAE()
        {
            int maxValNumber = 0;

            variables = new Expr[0];
            Console.WriteLine("Введите количество уравнений " +
                              "(количество неизвестных должно совпадать с кол-вом уравнений или быть меньше): ");
            expressionsNumber = Convert.ToInt32(Console.ReadLine());

            for (int i = 0; i < expressionsNumber; i++)
            {
                Console.WriteLine("Введите уравнение номер {0}:", i + 1);
                // expressions.Add(Console.ReadLine().Replace(' ', '\0')); TODO исправить удаление лишних пробелов
                freeTerms.Add(Double.Parse(expressions.Last().Split('=')[1]));
                symbolicExpressions.Add(Expr.Parse(expressions.Last().Split('=')[0] + "-" + freeTerms.Last().ToString()));
                Console.WriteLine(symbolicExpressions.Last().ToString());
                if (symbolicExpressions.Last().CollectVariables().ToArray().Length > maxValNumber)
                {
                    variables    = symbolicExpressions.Last().CollectVariables().ToArray();
                    maxValNumber = variables.Length;
                }
            }

            varNumber = maxValNumber;
            if (varNumber > expressionsNumber)
            {
                Console.WriteLine("Ошибка! Количество неизвестных больше количества уравнений!");
            }

            Console.WriteLine("Введите точность нахождения корня эпсилон:");
            epsilon = Convert.ToDouble(Console.ReadLine());

            currentJakobiMatrix = new Matrix <Expr>(expressionsNumber, varNumber);
            currentJakobiValues = new NumericMatrix(expressionsNumber, varNumber);
        }
Пример #4
0
        static void Main(string[] args)
        {
            var ass = Expr.Parse("cos(2 / 5 * pi) + cos(4 / 5 * pi) - cos(6 / 5 * pi) - cos(8 / 5 * pi)");

            Console.WriteLine(ass.TrigonometricContract());
            Console.WriteLine(ass.TrigonometricExpand());
            Console.WriteLine(ass.TrigonometricSimplify());
            Console.WriteLine(ass.Evaluate(new Dictionary <string, FloatingPoint>()));
            Console.WriteLine(ass.RationalReduce());
        }
Пример #5
0
 public static double EvaluateExpression(string input)
 {
     if (input.Any(char.IsLetter))
     {
         //there is a letter (variable) that has not been dealt with, so the expression will fail
         return(0.0);
     }
     else
     {
         //try this, might need to do .Compile("")(0);
         return(Expr.Parse(input).RealNumberValue);
     }
 }
Пример #6
0
        //Получение точек приближенного решения системы ОДУ методом Рунге-Кутты 4-го порядка на заданном промежутке с заданным шагом
        public List <Dictionary <string, FloatingPoint> > GetFunctionsAccurateSolution()
        {
            string pb_answers = "Yeah_yeah_yes_y_Y_Д_ДА_да_Да_дA_Yes_Ага_ага_конечно_Конечно";
            string answer     = "NO";
            double x_i        = startVector["x"].RealValue;
            Dictionary <string, FloatingPoint> vector_package = new Dictionary <string, FloatingPoint>();


            Console.WriteLine("Вы знаете точное решение системы ОДУ?");
            answer = Console.ReadLine();
            if (pb_answers.Contains(answer))
            {
                accurateSolutionsNumbers.Clear();
                foreach (Expr var in variables)
                {
                    if (!var.ToString().Equals("x"))
                    {
                        Console.WriteLine("Введите функцию вида {0} = f(x) - точное значение переменной {0}" +
                                          "(с учетом начальных условий - конкретные значения C1, ... Cn):", var);
                        accurateSolution.Add(var.ToString(), Expr.Parse(Console.ReadLine().Split('=')[1]));
                    }
                }

                vector_package.Add("x", x_i);
                foreach (string var in accurateSolution.Keys)
                {
                    vector_package.Add(var, accurateSolution[var].Evaluate(vector_package).RealValue);
                }

                accurateSolutionsNumbers.Add(new Dictionary <string, FloatingPoint>(vector_package));
                vector_package.Clear();
                for (int i = 0; i < stepsNumber; i++)
                {
                    x_i += step;
                    vector_package.Add("x", x_i);
                    foreach (string var in accurateSolution.Keys)
                    {
                        vector_package.Add(var, accurateSolution[var].Evaluate(vector_package).RealValue);
                    }

                    accurateSolutionsNumbers.Add(new Dictionary <string, FloatingPoint>(vector_package));
                    vector_package.Clear();
                }
                GetErrors();
            }
            else
            {
                return(null);
            }
            return(accurateSolutionsNumbers);
        }
Пример #7
0
        //Получение точек функций-приближений на заданном пользователем отрезке
        public List <Dictionary <string, FloatingPoint> > GetPoints()
        {
            List <Dictionary <string, FloatingPoint> > namedVector   = new List <Dictionary <string, FloatingPoint> >();
            Dictionary <string, FloatingPoint>         vectorPackage = new Dictionary <string, FloatingPoint>();
            double x_i = startValues["x"].RealValue;

            for (int i = 0; i < stepsNumber; i++)
            {
                x_i += step;
                vectorPackage.Add("x", x_i);
                for (int j = 0; j < equasionCount; j++)
                {
                    vectorPackage.Add("y" + (j + 1),
                                      Expr.Parse(currentYApproxima[j]).Evaluate(vectorPackage).RealValue);
                }

                namedVector.Add(new Dictionary <string, FloatingPoint>(vectorPackage));
                vectorPackage.Clear();
            }
            return(namedVector);
        }
Пример #8
0
        private void Algorithm()
        {
            _main.Header();
            var result = "U(";
            var p_values = "";
            var xi = "";
            for (int i = 1; i <= _main.CountParams; i++)
            {
               

                if (i == _main.CountParams)
                {
                    xi += "x_" + i;
                    _alpha_ln_xi += _main.ConvertCommaToDot(_alpha[i - 1].ToString()) + "*\\ln(x_" + i + ")";

                }
                else
                {
                    xi += "x_" + i + ",";
                    _alpha_ln_xi += _main.ConvertCommaToDot(_alpha[i - 1].ToString()) + "*\\ln(x_" + i + ") + ";

                }


                p_values += "p_" + i + " = " + _main.ConvertCommaToDot(_main.PValuesParams[i - 1]);
                _pi += "p_" + i;
                if (i < _main.CountParams)
                {
                    _pi += "," + _main.SetText(" ");
                    p_values += ",";
                }
            }

            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(result + xi + ")=" + _alpha_ln_xi), Align = HorizontalAlignment.Center });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(p_values), Align = HorizontalAlignment.Center });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решение:", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("1. Решим задачу оптимального поведения потребителя, если цены благ соответственно равны ", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(p_values + _main.SetText(" и доход равен ") + "M = " + _main.MParam + ".") });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Найдем функции спроса потребителя:", true)) });

            for (int i = 1; i <= _main.CountParams; i++)
            {
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula("x_" + i + " = f_" + i + "(" + _pi + ",M);"), Align = HorizontalAlignment.Center });
            }

            result = _main.SetText("где ");
            var blag = "";
            for (int i = 1; i <= _main.CountParams; i++)
            {
                _xi += "x_" + i;
                blag += i + "-го";
                if (i < _main.CountParams)
                {
                    _xi += ", ";

                }

                if (i < _main.CountParams - 1)
                {
                    blag += ", ";
                }
                else if (i == _main.CountParams - 1)
                {
                    blag += " и ";
                }
            }

            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(result + _xi + _main.SetText(" - количество приобретаемого блага " + blag + " вида.")) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Для этого решим следующую задачу оптимального поведения потребителя.", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Математическая модель задачи имеет вид:")) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(@"\alpha_j > 0, x_j > 0, j = \overline{1, " + _main.CountParams +"}" + _main.SetText("           (1)")), Align = HorizontalAlignment.Center });


            for (int i = 1; i <= _main.CountParams; i++)
            {
                _pi_xi += "x_" + i + "*p_" + i;
                _minus_pi_xi += "- x_" + i + "*p_" + i;

                if (i < _main.CountParams)
                {
                    _pi_xi += " + ";
                    _minus_pi_xi += " ";
                }

            }
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_pi_xi + " = M" + _main.SetText("            (2)")), Align = HorizontalAlignment.Center });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula("U = " + _alpha_ln_xi + " \\rightarrow max" + _main.SetText("            (3)")), Align = HorizontalAlignment.Center });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Левая часть условия (2) – стоимость приобретаемых благ, а условие (3) означает, что полезность этих", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("благ должна быть максимальной.")) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решим задачу методом множителей Лагранжа. Функция Лагранжа:", true)) });

            result = "L(" + _xi + ",\\lambda) = U(" + _xi + ") + \\lambda(M " + _minus_pi_xi + ").";


            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + result) });
            result = "L(" + _xi + ",\\lambda) = " + _alpha_ln_xi + " + \\lambda(M " + _minus_pi_xi + ").";
            _L = _alpha_ln_xi + "+" + _lambda + "*(" + _M + _minus_pi_xi + ")";
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + result) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Найдем частные производные функции Лагранжа и приравняем их к нулю:", true)) });

            for (int i = 0; i < _main.CountParams; i++)
            {
                _lst.Add(_main.Diff(_L.Replace("\\", ""), _variables[i]));
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\frac{\partial L}{\partial x_" + (i + 1) + "} = " + (_lst[i] as Expr).ToLaTeX().Replace(_lambda, @"\lambda") + " = 0") });
            }
            
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\frac{\partial L}{\partial \lambda } = " + _M + _minus_pi_xi + " = 0") });
            _main.ResultCollection.Add(_main.RedLine);
            for (int i = 0; i < _lst.Count; i++)
            {
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + (_lst[i] as Expr).Substitute(Expr.Parse("p_" + (i + 1)), Expr.Parse("0")).ToLaTeX() + " = " + @"\lambda*p_" + (i + 1)) });
            }
            _main.ResultCollection.Add(_main.RedLine);
            for (int i = 0; i < _lst.Count; i++)
            {

                var root = _main.FindRoot(ExprLast.Symbol("x_" + (i + 1)), Infix.ParseOrThrow((_lst[i] as Expr).ToString()));
                _lst.RemoveAt(i);
                _lst.Insert(i, root);

                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + "x_" + (i + 1) + " = " + (_lst[i] as Expr).ToLaTeX().Replace(_lambda, @"\" + _lambda)) });

            }
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + _pi_xi + " = " + _M + _main.SetText("          (4)")) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Подставим найденные значения ", true) + _xi + _main.SetText(" в (4) и выразим ") + @"\" + _lambda) });
            result = _pi_xi;
            for (int i = 0; i < _lst.Count; i++)
            {
                var expr = Expr.Parse(result).Substitute(Expr.Parse("x_" + (i + 1)), _lst[i] as Expr);
                result = _main.ConvertExprLastToExpr(Rational.Simplify(ExprLast.Symbol("x_" + (i + 1)), _main.ConvertExprToExprLast(expr))).ToString();
            }
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + Expr.Parse(result).ToLaTeX().Replace(_lambda, @"\" + _lambda) + " = " + _M) });

                
            result += "-" + _M;
            var lam_star = _main.FindRoot(ExprLast.Symbol(_lambda), Infix.ParseOrThrow(result));
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\lambda^* = " + lam_star.ToLaTeX() + " = " + lam_star.Substitute("M", _main.MParam).ToLaTeX()) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + _main.SetText(@"Найдем оптимальный набор благ потребителя.")) });
            result = @"X^* = (";

            for (int i = 0; i < _main.CountParams; i++)
            {
                result += "x_" + (i + 1) + "^*";
                if (i < _main.CountParams - 1)
                {
                    result += ",";
                }
            }
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + result + ")" + _main.SetText(@" при заданных ценах на блага и доходе:")) });
            _main.ResultCollection.Add(_main.RedLine);



            for (int i = 0; i < _main.CountParams; i++)
            {
                var res = (_lst[i] as Expr).Substitute(Expr.Parse(_lambda), lam_star);
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + "x_" + (i + 1) + "^* = " + res.ToLaTeX()) });
                _lst[i] = res;
            }
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + p_values + ", M = " + _main.ConvertCommaToDot(_main.MParam)) });
            _main.ResultCollection.Add(_main.RedLine);
            
            for (int i = 0; i < _main.CountParams; i++)
            {
                var res = (_lst[i] as Expr).Substitute(Expr.Parse(_M), Expr.Parse(_main.ConvertCommaToDot(_main.MParam))).Substitute(Expr.Parse("p_" + (i + 1)), Expr.Parse(_main.ConvertCommaToDot(_main.PValuesParams[i])));
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + "x_" + (i + 1) + "^* = " + res.ToLaTeX()) });
                _x_star[i] = double.Parse(_main.ConvertDotToComma(res.RealNumberValue.ToString()));
            }
            result = @"X^* = (";

            for (int i = 0; i < _main.CountParams; i++)
            {
                result += "x_" + (i + 1) + "^*";
                if (i < _main.CountParams - 1)
                {
                    result += ",";
                }
            }

            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Проверим, выполняется ли для найденного оптимального решения ", true) + result + _main.SetText(") бюджетное ограничение:")) });

            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_pi_xi + " = M"), Align = HorizontalAlignment.Center });

            result = "";

            for (int i = 0; i < _main.CountParams; i++)
            {
                result += _main.ConvertCommaToDot(_main.PValuesParams[i]) + "*" + _main.ConvertCommaToDot(_x_star[i]);
                if (i < _main.CountParams - 1)
                {
                    result += "+";
                }
            }
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(result + " = " + _main.ConvertCommaToDot(_main.MParam)), Align = HorizontalAlignment.Center });
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(Expr.Parse(result).ToLaTeX() + " = " + _main.ConvertCommaToDot(_main.MParam)), Align = HorizontalAlignment.Center });

            result = @"\overline{ X}^ * = (" + _x_star.Aggregate("", (b, n) => b + (!string.IsNullOrEmpty(b) ? ";" : "") + Math.Truncate(n).ToString()) + ")";
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Если речь идет о неделимых благах, то оптимальный выбор потребителя составит ", true) + result + ",") });

            result = _main.SetText(" т.е. ему необходимо приобрести ");
            for (int i = 0; i < _main.CountParams; i++)
            {
                result += (i + 1) + _main.SetText("-го блага - ") + _main.ConvertCommaToDot(Math.Truncate(_x_star[i]));

                if (i < _main.CountParams - 2)
                {
                    result += ", ";
                }
                if (i < _main.CountParams - 1)
                {
                    result += _main.SetText(" и ");
                }
            }

            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(result + ".") });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Но т.к. мы условились, что речь будет идти о делимых благах, то оптимальный выбор потребителя будет:", true)) });

            result = @"\overline{ X}^ * = (" + _x_star.Aggregate("", (b, n) => b + (!string.IsNullOrEmpty(b) ? ";" : "") + _main.ConvertCommaToDot(n.ToString())) + ")";
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + result + _main.SetText(", т.е. следует приобрести: ")) });


            for (int i = 0; i < _main.CountParams; i++)
            {
                result = _main.SetText("блага ", true) + (i + 1) + _main.SetText("-го вида - ") + _main.ConvertCommaToDot(_x_star[i]);

                if (i < _main.CountParams - 1)
                {
                    result += ", ";
                }
                if (i == _main.CountParams - 1)
                {
                    result += ".";
                }
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(result) });
            }
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решение 2:", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Функции спроса потребителя найдены в пункте 1.", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Вычислим реакции потребителя при изменении дохода М и цен ", true) + _pi + _main.SetText(" в точке оптимума ") + @"\overline{ X}^ *.") });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Реакции потребителя при изменении дохода М:", true)) });

            var minBlag = -1.0;
            var maxBlag = -1.0;
            var indMinBlag = -1;
            var indMaxBlag = -1;
            for (int i = 0; i < _main.CountParams; i++)
            {
                var res = _main.Diff((_lst[i] as Expr).ToString(), "M");
                var p = Expr.Parse(_main.ConvertCommaToDot(_main.PValuesParams[i].ToString()));
                var val = double.Parse(_main.ConvertDotToComma(res.Substitute(Expr.Parse("p_" + (i + 1)), p).RealNumberValue.ToString()));
                if (i == 0)
                {
                    minBlag = maxBlag = val;
                    indMinBlag = indMaxBlag = i;
                }
                if (val < minBlag)
                {
                    minBlag = val;
                    indMinBlag = i;
                }
                if (val > maxBlag)
                {
                    maxBlag = val;
                    indMaxBlag = i;
                }
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\frac{\partial x_" + (i + 1) + @"}{\partial M } = " + res.ToLaTeX() + @"\approx" + _main.ConvertCommaToDot(val.ToString())) });
                if (i == 0)
                {
                    _main.ResultCollection.Add(_main.RedLine);
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Поскольку при увеличении дохода спрос на 1-благо возрастает, то это благо ценное.", true)) });
                    _main.ResultCollection.Add(_main.RedLine);
                }
            }

            if (_main.CountParams == 2)
            {
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Оставшееся благо также является ценным для потребителя.  При этом наиболее ценным является " + (indMaxBlag + 1) + "-е благо, а наименее ценным – " + (indMinBlag + 1) + "-е.", true)) });
            }
            else
            {
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Остальные блага также являются ценными для потребителя.  При этом наиболее ценным является " + (indMaxBlag + 1) + "-е благо, а наименее ценным – " + (indMinBlag + 1) + "-е.", true)) });

            }


           
            for (int i = 0; i < _main.CountParams; i++)
            {
                _main.ResultCollection.Add(_main.RedLine);
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Определим реакции потребителя     при изменении цены на " + (i + 1) + "-е благо:", true)) });
                for (int j = 0; j < _main.CountParams; j++)
                {
                    
                    _main.ResultCollection.Add(_main.RedLine);
                    var res = _main.Diff((_lst[i] as Expr).ToString(), "p_" + (i + 1));
                    var m = Expr.Parse(_main.ConvertCommaToDot(_main.MParam.ToString()));
                    var p = Expr.Parse(_main.ConvertCommaToDot(_main.PValuesParams[j].ToString()));
                    var val = double.Parse(_main.ConvertDotToComma(res.Substitute(Expr.Parse("M"), m).Substitute(Expr.Parse("p_" + (i + 1)), p).RealNumberValue.ToString()));
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\frac{\partial x_" + (j + 1) + @"}{\partial p_" + (i + 1) + " } = " + res.ToLaTeX() + (val == 0 ? "=" : @"\approx") + _main.ConvertCommaToDot(val.ToString()) + (val != 0 ? " (" + (val >= 0 ? ">" : "<") + "0)" : "")) });
                    if (i == j && val < 0)
                    {
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("С увеличением цены на " + (i + 1) + "-е благо спрос на него уменьшается, значит, "+ (j+1)+"-е благо нормальное.", true)) });
                    }
                    else if (i == j && val > 0)
                    {
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("С увеличением цены на " + (i + 1) + "-е благо спрос на него уменьшается, значит, " + (j + 1) + "-е благо ненормальное.", true)) });
                    }
                    else if (val < 0)
                    {
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("С увеличением  цены на " + (i + 1) + "-е благо спрос на " + (j + 1) + "-е благо увеличивается, эти блага взаимодополняемые.", true)) });
                    }
                    else if (val > 0)
                    {
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("С увеличением  цены на " + (i + 1) + "-е благо спрос на " + (j + 1) + "-е благо увеличивается, эти блага взаимозаменяемые.", true)) });
                    }
                   
                }

            }

           
            result = @"\overline{ X}^ * = (";

            for (int i = 0; i < _main.CountParams; i++)
            {
                result += "x_" + (i + 1) + "^*";
                if (i < _main.CountParams - 1)
                {
                    result += ",";
                }
            }

            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решение3:", true)) });
            _main.ResultCollection.Add(new Result()
            {
                ItemResult = _main.RenderFormula(_main.SetText("Вычислим предельные полезности благ в точке экстремума ", true) + result + ")" +
                _main.SetText(". Это значения частных производных "))
            });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("функции полезности ") + "U = (" + _xi + ")" + _main.SetText(" по соответствующим аргументам в точке ") + @"\overline{ X}^*.") });

            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(@"\overline{ X}^ * = (" + _x_star.Aggregate("", (b, n) => b + (!string.IsNullOrEmpty(b) ? ";" : "") + _main.ConvertCommaToDot(n.ToString())) + ")") });

            var dU_x_star = new double[_main.CountParams];
            for (int i = 0; i < _main.CountParams; i++)
            {
                _main.ResultCollection.Add(_main.RedLine);
                var res = _main.Diff(_alpha_ln_xi.Replace("\\", ""), "x_" + (i + 1));
                var x = Expr.Parse(_main.ConvertCommaToDot(_x_star[i].ToString()));
                var val = double.Parse(_main.ConvertDotToComma(res.Substitute(Expr.Parse("x_" + (i + 1)), x).RealNumberValue.ToString()));
                dU_x_star[i] = val;
                _main.ResultCollection.Add(new Result()
                {
                    ItemResult = _main.RenderFormula(_main.SetText("", true) + @"\frac{\partial U}{\partial x_" + (i + 1) + " } = " + res.ToLaTeX() + _main.SetText(";    ") +
                    @"\frac{\partial U}{\partial x_" + (i + 1) + " }(\\overline{ X})^* = " + res.ToLaTeX() + _main.SetText(" = ") + _main.ConvertCommaToDot(val.ToString()))
                    
                });
            }


            _main.ResultCollection.Add(_main.RedLine);
            for (int i = 0; i < _main.CountParams; i++)
            {
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("На 1 дополнительную единицу " + (i + 1) + "-го блага приходится ", true) + dU_x_star[i] + _main.SetText(" единиц дополнительной полезности.")) });

            }

            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решение4:", true)) });

            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Вычислим нормы замещения благ в точке оптимума ", true) + "\\overline{X}^*.") });

            for (int i = 0; i < _main.CountParams; i++)
            {

                for (int j = 0; j < _main.CountParams; j++)
                {
                    if (i == j)
                        continue;

                    var dudx = dU_x_star[i] / dU_x_star[j];

                    _main.ResultCollection.Add(_main.RedLine);
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Норма замены " + (i + 1) + "-го блага " + (j + 1) + "-м:", true)) });
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"n_{" + (j + 1) + "," + (i + 1) + @"} = -\frac{\partial U}{\partial x_" + (i + 1) + @"} : \frac{\partial U}{\partial x_" + (j + 1) + "} = " + _main.ConvertCommaToDot((-dudx).ToString())) });
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Для замещения 1 единицы " + (i + 1) + "-го блага необходимо дополнительно приобрести ", true) + _main.ConvertCommaToDot((dudx).ToString())) });
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText(" единиц " + (j + 1) + "-го блага, чтобы удовлетворенность осталась на прежнем уровне.")) });
                }
            }

            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Решение5:", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Вычислим коэффициенты эластичности по доходу и ценам при заданных ценах и доходе: ", true)) });
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(p_values + ", M = " + _main.ConvertCommaToDot(_main.MParam.ToString()) + ".") });

            var empSum = 0.0;

            for (int i = 0; i < _main.CountParams; i++)
            {
                _main.ResultCollection.Add(_main.RedLine);
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Для блага " + (i + 1) + ":", true)) });
                var res = _main.Diff((_lst[i] as Expr).ToString(), "M").Divide("x_" + (i + 1) + "/M");
                var resReplace = res.Substitute("M", _main.ConvertCommaToDot(_main.MParam.ToString())).Substitute("x_" + (i + 1), _main.ConvertCommaToDot(_x_star[i].ToString())).Substitute("p_" + (i + 1), _main.ConvertCommaToDot(_main.PValuesParams[i].ToString())).ToString();
                empSum = double.Parse(_main.ConvertDotToComma(resReplace));
                var resRound = Math.Round(empSum);
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"E_" + (i + 1) + @"^M = \frac{\partial x_" + (i + 1) + @"}{\partial M } : " + @"\frac{ x_" + (i + 1) + "}{ M } = " + res.ToLaTeX() + " = " + resRound) });

                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("При увеличении дохода на 1 % спрос на " + (i + 1) + "-e благо возрастает на 1 %.", true)) });

                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Коэффициенты эластичности по ценам:", true)) });
                result = "E_" + (i + 1) + "^M + ";
                for (int j = 0; j < _main.CountParams; j++)
                {
                    result += "E_{ " + (i + 1) + "" + (j + 1) + "}^p";
                    if (j < _main.CountParams - 1)
                    {
                        result += " + ";
                    }
                    res = _main.Diff((_lst[i] as Expr).ToString(), "p_" + (j + 1)).Divide("x_" + (i + 1) + "/p_" + (j + 1));
                    resReplace = res.Substitute("M", _main.ConvertCommaToDot(_main.MParam.ToString())).Substitute("x_" + (i + 1), _main.ConvertCommaToDot(_x_star[i].ToString())).Substitute("p_" + (j + 1), _main.ConvertCommaToDot(_main.PValuesParams[i].ToString())).ToString();
                    var epi = double.Parse(_main.ConvertDotToComma(resReplace));
                    empSum += epi;
                    _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + @"E_{" + (i + 1) + "" + (j + 1) + @"}^p = \frac{\partial x_" + (i + 1) + @"}{\partial p_" + (j + 1) + " } : " + @"\frac{ x_" + (i + 1) + "}{ p_" + (j + 1) + " } = " + resReplace) });
                    
                    var output = "При росте цены на " + (j + 1) + "-е благо на 1 %";

                    if (epi != 0)
                    {
                        if (epi < 0)
                        {
                            output += " спрос на него уменьшается на ";
                        }
                        else
                        {
                            output += "спрос на него увеличивается на ";
                        }
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText(output, true) + _main.ConvertCommaToDot(Math.Abs(epi).ToString()) + _main.SetText("%.")) });

                    }
                    else
                    {
                        output += " оно является независимым.";
                        _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText(output, true)) });
                    }
                    _main.ResultCollection.Add(_main.RedLine);

                }
                
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Проверка:", true)) });
                _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("", true) + result + " = " + _main.ConvertCommaToDot(empSum.ToString())) });
            }
            _main.ResultCollection.Add(_main.RedLine);
            _main.ResultCollection.Add(new Result() { ItemResult = _main.RenderFormula(_main.SetText("Все расчеты произведены достаточно точно и правильно.", true)) });

        }
Пример #9
0
        public void Solve()
        {
            double max;

            //вектор, в который записывается текущее приближение
            _curr_vector = new double[X.Values.Count, 1];

            //вектор, в котором хранится предыдущее приближение
            _prev_vector = new double[X.Values.Count, 1];

            //Создание временного словаря и присвоение ему начальных значений
            var temp = X;

            do
            {
                //Увеличение счетчика итераций
                Counter++;

                //Составление численного Якобиана из обновленных значений перменных
                _numJac = new double[Jacobian.GetLength(0), Jacobian.GetLength(1)];
                for (int i = 0; i < Jacobian.GetLength(0); i++)
                {
                    for (int j = 0; j < Jacobian.GetLength(1); j++)
                    {
                        //Перевод из FloatingPoint в double
                        if (Jacobian[i, j] != null)
                        {
                            _numJac[i, j] = double.Parse(Jacobian[i, j].Evaluate(temp).RealValue.ToString().Replace(".", ","));
                        }
                    }
                }

                //Нахождение обратной матрицы Якобиана
                _revJacobian = Matrix.getInverse(_numJac);;

                //Обновление матрицы приближенных значений предыдущего шага
                for (int i = 0; i < temp.Count; i++)
                {
                    var elem = temp.ElementAt(i);
                    _prev_vector[i, 0] = double.Parse(elem.Value.RealValue.ToString().Replace(".", ","));
                }

                //Матрица числовых значений начальных функций
                _curr_func_value = new double[Equations.Functions.GetLength(1), 1];

                //Расчет значений для матрицы функций
                for (int i = 0; i < Equations.Functions.GetLength(0); i++)
                {
                    for (int j = 0; j < Equations.Functions.GetLength(1); j++)
                    {
                        _curr_func_value[i, 0] += double.Parse(Equations.Functions[i, j].Evaluate(temp).RealValue.ToString().Replace(".", ","));
                    }
                }

                //Расчет дельта X
                var delta_x = Matrix.Multiply(_revJacobian, _curr_func_value);

                //Получение нового приближения
                _curr_vector = Matrix.Subtract(_prev_vector, delta_x);

                max = Math.Abs(delta_x[0, 0]);

                temp = new Dictionary <string, FloatingPoint>();

                //Вычисление максимального значения в массиве delta_x и обновление словаря temp
                for (int i = 0; i < X.Count; i++)
                {
                    if (max < Math.Abs(delta_x[i, 0]))
                    {
                        max = Math.Abs(delta_x[i, 0]);
                    }

                    var elem = X.ElementAt(i);
                    temp.Add(elem.Key, Expr.Parse(_curr_vector[i, 0].ToString().Replace(",", ".")).RealNumberValue);
                }
            } while (max > Eps && Counter != _maxCounter);

            Console.WriteLine($"Итоговое количество итераций: {Counter}");

            Console.WriteLine("Ответ: ");

            Matrix.Print(_curr_vector);

            Console.WriteLine("\n");
        }
Пример #10
0
        public static Expr approximate(double d)
        {
            double denominator = pow(10, d.ToString().Length);

            return(Expr.Parse(d + "/" + denominator));
        }
Пример #11
0
        static void Main(string[] args)
        {
            //Используемые переменныые
            var x1  = Expr.Variable("x1");
            var x2  = Expr.Variable("x2");
            var x3  = Expr.Variable("x3");
            var x4  = Expr.Variable("x4");
            var x5  = Expr.Variable("x5");
            var x6  = Expr.Variable("x6");
            var x7  = Expr.Variable("x7");
            var x8  = Expr.Variable("x8");
            var x9  = Expr.Variable("x9");
            var x10 = Expr.Variable("x10");


            //Пример 1
            var values1 = new Dictionary <string, FloatingPoint>
            {
                { "x1", 0.9 },
                { "x2", 0.5 }
            };

            var f1 = (x1 * x1);
            var f2 = (x2 * x2 - 1);
            var f3 = (x1 * x1 * x1);
            var f4 = (-x2);

            Expr[,] functions1 = new Expr[, ] {
                { f1, f2 }, { f3, f4 }
            };

            var system1 = new EquationsSystem(functions1);

            system1.Print();

            var newton1 = new NewtonMethodSystem(system1, values1, 0.0001);

            newton1.Solve();

            //Пример 2
            var values2 = new Dictionary <string, FloatingPoint>
            {
                { "x1", 0.5 },
                { "x2", 0.5 },
                { "x3", 0.5 }
            };

            f1 = (x1 * x1);
            f2 = (x2 * x2);
            f3 = (x3 * x3 - 1);
            f4 = (2 * x1 * x1);
            var f5 = f2;
            var f6 = (-4 * x3);
            var f7 = (3 * x1 * x1);
            var f8 = (-4 * x2);
            var f9 = (x3 * x3);

            Expr[,] functions2 = new Expr[, ] {
                { f1, f2, f3 }, { f4, f5, f6 }, { f7, f8, f9 }
            };

            var system2 = new EquationsSystem(functions2);

            system2.Print();

            var newton2 = new NewtonMethodSystem(system2, values2, 0.0001);

            newton2.Solve();


            Console.WriteLine("Введите уравнения системы, =0 в конце вводить не нужно");
            Console.WriteLine("По окончанию ввода введите 0");
            List <string> equations = new List <string>();

            while (true)
            {
                string temp = Console.ReadLine();
                if (temp == "0")
                {
                    break;
                }
                equations.Add(temp);
            }
            Expr[,] functions3 = new Expr[equations.Count, equations.Count];
            int i = 0;

            foreach (string equation in equations)
            {
                Expr        temp       = Expr.Parse(equation);
                List <Expr> expression = new List <Expr>();
                for (int j = 0; j < temp.NumberOfOperands; j++)
                {
                    expression.Add(temp[j]);
                }
                if (temp.NumberOfOperands > equations.Count)
                {
                    expression[0] = temp[0] + temp[1];
                    expression.RemoveAt(1);
                }
                for (int j = 0; j < equations.Count; j++)
                {
                    functions3[i, j] = expression[j];
                }
                i++;
            }

            var system3 = new EquationsSystem(functions3);

            Console.WriteLine("Введите изначальное приближение");
            var values3 = new Dictionary <string, FloatingPoint>(equations.Count);

            for (int j = 0; j < equations.Count; j++)
            {
                Console.Write($"x{j+1}=");
                String[]      temp          = Console.ReadLine().Split('=');
                FloatingPoint floatingPoint = float.Parse(temp[0]);
                values3.Add($"x{j + 1}", floatingPoint);
            }

            var newton3 = new NewtonMethodSystem(system3, values3, 0.0001);

            newton3.Solve();

            Console.ReadLine();
        }
Пример #12
0
 public Expr Diff(string expr, string var)
 {
     return(Expr.Parse(expr).Differentiate(Expr.Parse(var)));
 }
        public void Solve()
        {
            PrintInfo();

            currValues = InitialСondition;

            k1      = new double[Equation.Functions.Count];
            k2      = new double[Equation.Functions.Count];
            k3      = new double[Equation.Functions.Count];
            k4      = new double[Equation.Functions.Count];
            new_val = new FloatingPoint[currValues.Count];


            Console.Write("i\t");
            foreach (var key in InitialСondition.Keys)
            {
                Console.Write($"{key}\t");
            }
            Console.WriteLine();

            for (int div = 0; div <= Divisions; div++)
            {
                Console.Write($"{div}\t");

                foreach (var val in currValues.Values)
                {
                    Console.Write($"{val.RealValue:0.0000}\t");
                }

                //Нахождение k1 для каждого уравнения
                for (int i = 0; i < Equation.Functions.Count; i++)
                {
                    k1[i] = Step * Equation.Functions[i].Evaluate(currValues).RealValue;
                }
                //Нахождение k2 для каждого уравнения
                for (int i = 0; i < Equation.Functions.Count; i++)
                {
                    int j = 0;
                    k2_var = new Dictionary <string, FloatingPoint>();
                    foreach (var val in currValues)
                    {
                        if (val.Key == "x")
                        {
                            k2_var.Add("x", Expr.Parse((val.Value.RealValue + Step / 2)
                                                       .ToString().Replace(",", ".")).RealNumberValue);
                        }
                        else
                        {
                            k2_var.Add(val.Key, Expr.Parse((val.Value.RealValue + k1[j] / 2)
                                                           .ToString().Replace(",", ".")).RealNumberValue);
                            j++;
                        }
                    }
                    k2[i] = Step * Equation.Functions[i].Evaluate(k2_var).RealValue;
                }
                //Нахождение k3 для каждого уравнения
                for (int i = 0; i < Equation.Functions.Count; i++)
                {
                    int j = 0;
                    k3_var = new Dictionary <string, FloatingPoint>();
                    foreach (var val in currValues)
                    {
                        if (val.Key == "x")
                        {
                            k3_var.Add("x", Expr.Parse((val.Value.RealValue + Step / 2)
                                                       .ToString().Replace(",", ".")).RealNumberValue);
                        }
                        else
                        {
                            k3_var.Add(val.Key, Expr.Parse((val.Value.RealValue + k2[j] / 2)
                                                           .ToString().Replace(",", ".")).RealNumberValue);
                            j++;
                        }
                    }
                    k3[i] = Step * Equation.Functions[i].Evaluate(k3_var).RealValue;
                }
                //Нахождение k4 для каждого уравнения
                for (int i = 0; i < Equation.Functions.Count; i++)
                {
                    int j = 0;
                    k4_var = new Dictionary <string, FloatingPoint>();
                    foreach (var val in currValues)
                    {
                        if (val.Key == "x")
                        {
                            k4_var.Add("x", Expr.Parse((val.Value.RealValue + Step)
                                                       .ToString().Replace(",", ".")).RealNumberValue);
                        }
                        else
                        {
                            k4_var.Add(val.Key, Expr.Parse((val.Value.RealValue + k3[j])
                                                           .ToString().Replace(",", ".")).RealNumberValue);
                            j++;
                        }
                    }
                    k4[i] = Step * Equation.Functions[i].Evaluate(k4_var).RealValue;
                }

                int k = 0;
                foreach (var val in currValues.Values)
                {
                    new_val[k] = val;
                    k++;
                }

                //Обновление значений x, y1, y2, ...
                k          = 0;
                currValues = new Dictionary <string, FloatingPoint>();
                foreach (var val in InitialСondition)
                {
                    if (val.Key == "x")
                    {
                        currValues.Add("x", Expr.Parse((new_val[k].RealValue + Step)
                                                       .ToString().Replace(",", ".")).RealNumberValue);
                    }
                    else
                    {
                        currValues.Add(val.Key, Expr.Parse((new_val[k].RealValue +
                                                            (k1[k - 1] + 2 * k2[k - 1] + 2 * k3[k - 1] + k4[k - 1]) / 6)
                                                           .ToString().Replace(",", ".")).RealNumberValue);
                    }
                    k++;
                }

                Console.WriteLine();
            }


            Console.WriteLine("");
        }
Пример #14
0
 //Конструктор по умолчаию
 public ODE(string diffEq)
 {
     differencialEquasion = diffEq;
     function             = Expr.Parse(differencialEquasion.Split('=')[1]);
 }
Пример #15
0
 public static Expr ParseExpression(string input)
 {
     return(Expr.Parse(input.TrimStart(EXPR_OPEN).TrimEnd(EXPR_CLOSE)));
 }
Пример #16
0
 public TrigPair(string real, string imag) :
     this(Expr.Parse(real), Expr.Parse(imag))
 {
 }