2015-07-04 15 views

risposta

6

Math.NET Numerics can solve any linear system numerically, ma suppongo che non è quello che stai cercando.

Math.NET Symbolics può trattare con espressioni simboliche, sebbene questo progetto sia in una fase iniziale e non comprenda ancora il concetto di equazioni. Tuttavia, possiamo ancora usarlo per risolvere sistemi semplici come questi, con un po 'di lavoro - facendo ciò che faremmo anche a mano.

Innanzitutto, definiamo una piccola funzione per risolvere una singola equazione lineare dell'ordine fino a 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; 
    } 
} 

Quindi possiamo usare questo per risolvere il sistema come segue:

// 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 
+0

Hey Christoph ! [Symbolism] (https://github.com/dharmatech/Symbolism) è in grado di risolvere il primo esempio come segue: '((4 - x) * 2 == (y - 1) * 10 + 2) .IsolateVariable (x) .AlgebraicExpand() '. [IsolateVariable] (https://github.com/dharmatech/Symbolism/blob/master/Symbolism/IsolateVariable.cs) è piuttosto ad-hoc, ma può gestire molte espressioni che ho gettato su di esso. In attesa di qualcosa di simile in Symbolics! :-) – dharmatech

Problemi correlati