我有几十个多项式方程,有些是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。不幸的是,我做得不够好。
答案 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值,并评估方程式。
感谢大家的帮助。