6

如何将方程转换为单个变量的公式?我正在考虑一个数学方程式,例如:

c^2 = a^2 + b^2

我想要一个可以处理任何公式的函数,并给我单独的变量公式。上述等式将产生以下结果:

a = (c^2 - b^2)^0.5
b = (c^2 - a^2)^0.5
c = (a^2 + b^2)^0.5

我也想从以下开始:

a = (c^2 - b^2)^0.5

和输出:

b = (c^2 - a^2)^0.5
c = (a^2 + b^2)^0.5

我看过表达式树,但我无法想象它是如何工作的。我想要一个 .NET(C#、VB.NET 或 F#)解决方案。有任何想法吗?

就像是:

public string[] GetFormulas(string equation)
{
   ...
}

谢谢。

4

8 回答 8

7

符号方程求解是一个复杂的问题,许多方程没有封闭解。编写自己的计算机代数系统并非易事,但您也许可以编写简单方程的程序。

您必须构建输入字符串的表达式树并定义用于操作表达式树的转换规则。为了求解一个变量,您可以在表达式树的空间上执行搜索(由良好的启发式方法引导以保持运行时可接受),表达式树可以通过转换规则的多种应用从原始树派生。

于 2009-04-17T14:27:14.323 回答
4

这是您要解决的一个不平凡的问题……我认为您自己尝试解决它不会有太大的运气。最好找到某种第三方应用程序或库来做到这一点。有许多程序可以完成您所说的操作,例如 Matlab 和 Maple。此外,TI-89 图形计算器可以做到这一点。您也许可以从Octave获得所需的算法,它本质上是 Matlab 的开源实现。

于 2009-04-17T14:26:42.513 回答
2

这是您可能希望使用数学库查看的内容。对于 .NET,Math.NET似乎是最完整的选择(不确定它有多稳定,但它肯定非常完整)。进行符号操作的库应该能够处理您在此处提出的特定问题。

老实说,从头开始写这个应该不会太难,但如果你对表达式树不是很熟悉并且不知道如何处理这个任务,我仍然建议使用现有的数学库,无论是 Math. NET 或任何其他体面的符号代数。

于 2009-04-17T14:26:35.993 回答
2

您唯一的选择是通过应用所有已知技术来暴力破解它。在像上面这样的简单代数方程中,这可能就足够了,但更复杂的问题将需要越来越复杂的解决方案。简而言之,这并不容易。

一旦你弄清楚如何将文本解析为符号,创建一个可以确定

c^2 = a^2 + b^2

可以替换为

c = (a^2 + b^2)^.5

但是关于

cos(c) = sin(a^2/b) - b^(a/sin(b))

更糟糕的是,您有无法解决的集成和抽象代数……您必须在某处绘制复杂性线,否则您最终将构建另一个Maple

于 2009-04-17T14:28:01.530 回答
1

以符号和非数字的方式处理方程绝对不是一件容易的事。我认为对你来说最简单的方法是在幕后简单地使用 Mathematica、Maple 或类似的工具,让他们为你做艰苦的工作。

于 2009-04-17T14:27:01.703 回答
0

由于 c^2 = a^2 + b^2 不是 C# 中的表达式,因此您走错了路。

忘记 .NET 表达式树并创建自己的。您需要描述进行这些转换所需的算法,以及描述方程所需的数据。您会发现最终得到的结果与 .NET 表达式树完全不同。

于 2009-04-17T14:23:04.207 回答
0

除了已经说过的任何内容之外,您还可以查看数值方法。

有一些算法可以对方程的解进行近似。因为它们中的大多数都不会那么容易(甚至不可能)准确地解决。

于 2009-04-17T14:32:34.217 回答
0

总体来说是个讨厌的问题。对于低阶多项式表达式,这并不太难。对于线性问题,您只需要一个解析器和一点点后处理。但即使是一个简单的表达式也可能不是微不足道的。例如,您将如何处理

x^5 + y^5 - xy + 1 = 0

用其他方式求解 x 或 y 中的任何一个,您必须求解 5 阶非常数系数多项式的根。这通常是不可能做到的。

更糟糕的是,在混合中引入三角函数或任何特殊函数,它会迫使你在完成之前重新编写 Mathematica。

于 2009-04-17T15:05:31.547 回答