我想解决方程式,
(4-x)*2 = (y-1)*10 + 2
x = y*2 + 1
方程式以字符串形式提供。 有没有办法在mathdotnet中表达方程?我只能找到写表达式的方法。
答案 0 :(得分:8)
Math.NET Numerics可以solve any linear system numerically,但我想这不是你想要的。
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