-1

我有几十个多项式方程,一些是二阶的,一些是三阶的,还有一些是四阶的。每个方程都有不同的系数和常数,但它们都不是过于复杂,因为它们都只包含一个输入变量。每个方程的输入变量 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。不幸的是,我还不足以实现这一点。

4

3 回答 3

2

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

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

使用正则表达式测试器查看它如何将其分组以获得每个项的有符号系数和指数。

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

然后像这样评估多项式:

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

Term.Evaluate 当然只是:

coefficient * Math.Power(x, exponent)
于 2018-01-29T14:15:26.047 回答
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);
}
于 2018-01-29T13:27:12.230 回答
0

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

我从

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

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

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

这是一种可由 MSF 解决的格式

SolverContext context = SolverContext.GetContext();
var model = context.CreateModel();
Decision y = new Decision(Domain.Real, "y");
model.AddDecisions(y);
int x = GetValueFromDatabase();
string formula = GetFormulaFromDatabase().Replace("x",x.ToString());
model.AddConstraint("myFormula", formula);
var solution = context.Solve();
var report = solution.GetReport();
Console.WriteLine("Load: {0}", y);

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

感谢大家的帮助。

于 2018-01-29T14:29:34.777 回答