如何评估作为字符串给出的多项式?

时间:2018-01-29 13:17:42

标签: c# ms-solver-foundation

我有几十个多项式方程,有些是2阶,有些是3,有些是4。每个方程都有不同的系数和常数,但它们都不是过于复杂,因为它们都只包含一个输入变量。输入变量x对于每个等式都是不同的。

e.g. 
x = 11
y = -0.00006x^4 + 0.0272x^3 - 1.4546x^2 - 17.743x + 8137.3
y = 7801.44514

我将这些存储在数据库中。我想把它们作为字符串类型拉出来,然后评估它们。我将永远有问题的X.处理这个问题的好方法是什么?我正在尝试使用Microsoft Foundation Solver,因为我认为我能够将我的字符串方程式转换为求解器理解的格式,提供我的x,并求解y。不幸的是,我做得不够好。

3 个答案:

答案 0 :(得分:1)

作为起点,以下代码评估由其系数给出的多项式:

public static double Evaluate(double x, IEnumerable<double> coefficients)
    => coefficients.Select((a, i) => a * Math.Pow(x, i)).Sum();

public static void Main(string[] args)
{
    var coeff = new List<double> { 8137.3, -17.743, -1.4546, 0.0272, -0.00006, };

    var value = Evaluate(11, coeff);
}

答案 1 :(得分:1)

假设它是可预测的格式,那么这个正则表达式应该找到条件,前提是没有科学符号或负指数或其他更复杂的东西,如括号或多变量等。

[-+](\s*\d+\.\d+)(x(\^\d+)?)?

使用regex tester查看如何将其分组以获得每个字词的已签名系数和指数。

然后你需要一个术语数组,每个术语都有一个系数和幂。回想一下,约定说缺少的系数是1,缺失的指数是1,而常数项(完全缺失x)是指数为0的术语。

然后像这样评估多项式:

terms.Sum((Term term) => term.Evaluate(x));

Term.Evaluate当然只是:

coefficient * Math.Power(x, exponent)

答案 2 :(得分:0)

感谢@MichaWiedenmann,@ JeroenMostert和@wyck,我能够使用Microsoft Solver Foundation(MSF)提出解决方案。

我从

开始
$c = new \Slim\Container();
$c['errorHandler'] = function ($c) {
    return function ($request, $response, $exception) use ($c) {
        return $c['response']->withStatus(500)
    ->withHeader('Access-Control-Allow-Origin', 'http://localhost:3000')
    ->withHeader('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, X-Auth-Token')
    ->withHeader('Access-Control-Allow-Credentials', 'true')
    ->withHeader('Access-Control-Request-Headers', 'Origin, X-Custom-Header, X-Requested-With, Authorization, Content-Type, Accept')
    ->withHeader('Access-Control-Expose-Headers', 'Content-Length, X-Kuma-Revision')
    ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS')
    ->write(exception->getMessage());

    };
};

经过一些正则表达式按摩后,我想出了

y = 0.0002x^4 + 0.0031x^3 - 0.3972x^2 - 27.394x + 6879.2

这是MSF可以解决的格式

y == 0.0002 * Power[x,4] + 0.0031 * Power[x,3] - 0.3972 * Power[x,2] - 27.394 * x + 6879.2

使用此代码,我能够以MSF格式从数据库中提取我的字符串方程式,加载我的x值,并评估方程式。

感谢大家的帮助。