gpt4 book ai didi

symbolic-math - 使用 Math.NET Symbolics 求解线性方程

转载 作者:行者123 更新时间:2023-12-01 14:20:06 24 4
gpt4 key购买 nike

我尝试修改给出的代码 here求解线性方程的 x 值。如

(3*x+7)/3+(2*x)/9=6/10

首先将其拆分为左右两个表达式,然后使用“SolveSimpleRoot”并给出 x 的值。但是如果线性方程写成

(3+2*x)/(5*x-2)=7, 你可以乘以 (5*x-2) 并且确实是一个线性然后代码失败

// extract coefficients, solve known forms of order up to 1
MathNet.Symbolics.Expression[] coeff = MathNet.Symbolics.Polynomial.Coefficients(variable, simple);

错误为:

The input sequence was empty.Parameter name: source



如果表达式像 (2x+7)/x=2 一样,它也无法求解,它仍然扩展为线性。

知道为什么吗?

代码基本上是:
    public void solveForX()
{
string eqn = "(3*x+7)/3+(2*x)/9=6/10"

string[] expString = eqn.Split('=');

var x = MathNet.Symbolics.Expression.Symbol("x");

MathNet.Symbolics.Expression aleft = MathNet.Symbolics.Infix.ParseOrThrow(expString[0]);
MathNet.Symbolics.Expression aright = MathNet.Symbolics.Infix.ParseOrThrow(expString[1]);


ans = SolveSimpleRoot(x, aleft - aright);
SelectionInsertText(MathNet.Symbolics.Infix.Print(cx));
}

private MathNet.Symbolics.Expression SolveSimpleRoot(MathNet.Symbolics.Expression variable, MathNet.Symbolics.Expression expr)
{
// try to bring expression into polynomial form
MathNet.Symbolics.Expression simple = MathNet.Symbolics.Algebraic.Expand(MathNet.Symbolics.Rational.Simplify(variable, expr));

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

最佳答案

您可以通过将两边与分母相乘来扩展它以支持这种有理情况(因此有效地仅取分子,使用 Rational.Numerator ):

private 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;
}
}

这样它也可以处理 (3+2*x)/(5*x-2)=7 .如果在这种情况下系数不等于零,我还修复了 case 1 返回 undefined,所以另一个例子的解决方案, (2*x+7)/x=2 , 将按预期未定义。

当然,这仍然是一个非常简单的例程,无法处理任何更高阶的问题。

关于symbolic-math - 使用 Math.NET Symbolics 求解线性方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33315942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com