<p>实际上,我在python中实现了完全相同的东西。我也熟悉尤里卡和你提到的其他项目。您可以在xyzsolve.appspot.com网站(为无耻的插头感到抱歉)。实现是用所有python实现的。我将列出代码所经历的迭代:</p>
<p>迭代0:对等式中的每个变量进行简单的搜索和替换,并用变量的值替换变量。例如,如果x和y的值为1.1和2.2,x*y将变成1.1*2.2。在得到转换后的字符串之后,可以使用eval并将其值放入残差(或者在您的例子中是f向量)。Scipy的fsolve/fmin函数允许您向残差函数传递额外的参数,因此请充分利用它。一、 传递包含每个命名变量的索引的字典。你的dict应该包含类似{'x':0,'y':1}的内容,然后你可以对每个等式进行搜索和替换。这是可行的,但是非常慢,因为每次调用剩余函数时都要进行搜索替换。在</p>
<p>迭代1:与迭代0相同,只是直接用x数组元素替换变量,所以“y”将变成“x[1]”。实际上,您可以通过这些来生成一个函数字符串;类似于“def f(x):return x[0]+x[1],x[0]-x[1]”。然后可以使用python中的exec函数创建要传递给fsolve/fmin的函数。如果您的方程是有效的python语法形式,那么您可以在这一点上停止。如果您想支持更广泛的表达式输入格式,那么这种方法做不了太多。在</p>
<p>迭代2:实现一个定制的lexer和解析器。这并不像听起来那么难。我用<a href="http://www.evanfosmark.com/2009/02/sexy-lexing-with-python/" rel="nofollow noreferrer">http://www.evanfosmark.com/2009/02/sexy-lexing-with-python/</a>表示lexer。我创建了一个递归下降解析器(这一点也不难,大约100行代码)来解析每个等式。这为您提供了方程格式的完全灵活性。我只需要在不同的列表中记录变量,等式两边的常量。当解析器解析等式时,它构建一个类似于“var_000+var_001*var_002”的表达式字符串,依此类推。最后,我只需用x向量的适当索引替换“var_000”。所以“var_000”变成“x[0]”,依此类推。如果你想的话,你可以构建一个AST并做很多更复杂的转换,但是我在这里停了下来。在</p>
<p>最后,您可能还需要考虑输入方程的类型。有很多无害的非线性方程不能用fsolve来求解(它使用MINPACK hybrdj)。您可能还需要一种输入初始猜测的方法。在</p>
<p>我很想知道有没有其他的替代方法。在</p>