Решение системы линейных уравнений с помощью mathdotnet?

Я хочу решить уравнения типа,

(4-x)*2 = (y-1)*10 + 2
x = y*2 + 1

Уравнения доступны в строковой форме. Есть ли способ выразить уравнение в mathdotnet? Я могу только найти способы написать выражения.


person shyamupa    schedule 04.07.2015    source источник


Ответы (1)


Math.NET Numerics может решить любую линейную систему численно, но я полагаю, это не то, что вы ищете.

Math.NET Symbolics может работать с символическими выражениями, хотя этот проект находится на ранней стадии и еще не понимает понятие уравнений. Тем не менее, мы все еще можем использовать его для решения простых систем, подобных этим, с небольшими усилиями, делая то же самое, что и вручную.

Во-первых, давайте определим небольшую функцию для решения одного линейного уравнения порядка до 1:

using Expr = MathNet.Symbolics.Expression;

Expr SolveSimpleRoot(Expr variable, Expr expr)
{
    // try to bring expression into polynomial form
    Expr simple = Algebraic.Expand(Rational.Numerator(Rational.Simplify(variable,expr)));

    // extract coefficients, solve known forms of order up to 1
    Expr[] coeff = Polynomial.Coefficients(variable,simple);
    switch(coeff.Length)
    {
        case 1: return Expr.Zero.Equals(coeff[0]) ? variable : Expr.Undefined;
        case 2: return Rational.Simplify(variable,Algebraic.Expand(-coeff[0]/coeff[1]));
        default: return Expr.Undefined;
    }
}

Тогда мы можем использовать это, чтобы решить систему следующим образом:

// declare variables
var x = Expr.Symbol("x");
var y = Expr.Symbol("y");

// Parse left and right side of both equations
Expr aleft = Infix.ParseOrThrow("(4-x)*2");
Expr aright = Infix.ParseOrThrow("(y-1)*10+2");
Expr bleft = Infix.ParseOrThrow("x");
Expr bright = Infix.ParseOrThrow("y*2+1");

// Solve both equations to x
Expr ax = SolveSimpleRoot(x,aleft-aright); // "8 - 5*y"
Expr bx = SolveSimpleRoot(x,bleft-bright); // "1 + 2*y"

// Equate both terms of x, solve to y
Expr cy = SolveSimpleRoot(y,ax-bx); // "1"

// Substitute term of y into one of the terms of x
Expr cx = Algebraic.Expand(Structure.Substitute(y,cy,ax)); // "3"

// Print expression in Infix notation
Console.WriteLine(Infix.Print(cx)); // x=3
Console.WriteLine(Infix.Print(cy)); // y=1
person Christoph Rüegg    schedule 04.07.2015
comment
Эй, Кристоф! Symbolism может решить первый пример следующим образом: ((4 - x) * 2 == (y - 1) * 10 + 2).IsolateVariable(x).AlgebraicExpand(). IsolateVariable довольно специфичен, но может обрабатывать многие выражения, которые я бросил на это. С нетерпением жду чего-то подобного в Symbolics! :-) - person dharmatech; 26.10.2015