//Методы для вычисления значений функций начальных условии и граничных условий private double sigma1Fun(double x) { Dictionary <string, FloatingPoint> xPackage = new Dictionary <string, FloatingPoint>(); xPackage.Add("x", x); return(Exp.Parse(sigma1).Evaluate(xPackage).RealValue); }
private double phi2Fun(double t) { Dictionary <string, FloatingPoint> tPackage = new Dictionary <string, FloatingPoint>(); tPackage.Add("t", t); return(Exp.Parse(phi2).Evaluate(tPackage).RealValue); }
//Инициализация СНАУ с клавиатуры 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); }
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()); }
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); } }
//Получение точек приближенного решения системы ОДУ методом Рунге-Кутты 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); }
//Получение точек функций-приближений на заданном пользователем отрезке 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); }
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)) }); }
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"); }
public static Expr approximate(double d) { double denominator = pow(10, d.ToString().Length); return(Expr.Parse(d + "/" + denominator)); }
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(); }
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(""); }
//Конструктор по умолчаию public ODE(string diffEq) { differencialEquasion = diffEq; function = Expr.Parse(differencialEquasion.Split('=')[1]); }
public static Expr ParseExpression(string input) { return(Expr.Parse(input.TrimStart(EXPR_OPEN).TrimEnd(EXPR_CLOSE))); }
public TrigPair(string real, string imag) : this(Expr.Parse(real), Expr.Parse(imag)) { }