C# 如何计算作为字符串给定的多项式?

C# 如何计算作为字符串给定的多项式?,c#,ms-solver-foundation,C#,Ms Solver Foundation,我有几十个多项式方程,一些是二阶的,一些是三阶的,还有一些是四阶的。每个方程都有不同的系数和常数,但没有一个过于复杂,因为它们都只包含一个输入变量。每个方程的输入变量x都不同 e.g. x = 11 y = -0.00006x^4 + 0.0272x^3 - 1.4546x^2 - 17.743x + 8137.3 y = 7801.44514 我把这些存储在数据库里。我想把它们作为字符串类型提取出来,并对它们进行评估。我总是会有X的问题。处理这个问题的好方法是什么?我尝试使用微软基金会求解

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

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

我把这些存储在数据库里。我想把它们作为字符串类型提取出来,并对它们进行评估。我总是会有X的问题。处理这个问题的好方法是什么?我尝试使用微软基金会求解器,因为我认为我能够将我的字符串方程转换成求解器所理解的格式,提供我的X,并为Y求解。不幸的是,我还不能很好地实现这一点。

作为一个起点,以下代码计算由其系数给出的多项式:

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);
}
公共静态双重评估(双x,IEnumerable系数)
=>系数。选择((a,i)=>a*Math.Pow(x,i)).Sum();
公共静态void Main(字符串[]args)
{
var coeff=新列表{8137.3,-17.743,-1.4546,0.0272,-0.00006,};
var值=评估值(11,系数);
}

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

[-+](\s*\d+\.\d+)(x(\^\d+)?)?
用于查看如何将其分组以获得每个项的有符号系数和指数

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

然后像这样计算多项式:

terms.Sum((Term term) => term.Evaluate(x));
术语。评估当然只是:

coefficient * Math.Power(x, exponent)

得益于@ MichaWiedenmann、@ JeroenMostert和@ WYCK,我能够使用微软Sover基金会(MSF)提出解决方案。

我从

y = 0.0002x^4 + 0.0031x^3 - 0.3972x^2 - 27.394x + 6879.2
在做了一些regex按摩后,我想到了

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值,并计算方程

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

谢谢大家的帮助。

不幸的是,我没有足够好的能力来实现这一点。
如果有人为你这么做,你永远不会成功。从你的例子来看,你不想找到多项式的解,你只想对它求值。这不需要任何类型的解算器,只需要一个解析器。如果你将多项式存储为常数,你甚至不需要它。@Jeroemostert我感谢你的回答,以及对我使用的术语的更正。“将多项式存储为常数”是什么意思?你是在为每个系数加上一个常数描述一个不同的数据库列,然后只取这些列中的值,并根据所讨论的X进行计算吗?@ManfredRadlwimmer显然对你没有讽刺意味。@TychoBrahe:是的,正是这样。另见米查的回答。在标准形式中,多项式只是一个数字列表(对于任何缺失的系数,
0
)。如果您需要解析字符串表示以获得该列表,那么这与实际计算它是不同的问题。如果您实际上不需要字符串,因为您是提供输入的人,那么您可以使用更为计算机友好的表单。