【问题标题】:How to convert an equation into formulas for individual variables?如何将方程转换为单个变量的公式?
【发布时间】:2010-10-20 02:58:08
【问题描述】:

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

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)
{
   ...
}

谢谢。

【问题讨论】:

    标签: c# .net math logic expression-trees


    【解决方案1】:

    符号方程求解是一个复杂的问题,许多方程没有封闭解。编写自己的Computer Algebra System 并非易事,但您也许可以编写一个简单方程的程序。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 另外,请注意,简单地重新排列给定的任意方程比实际求解它要容易很多(尽管它可能相当棘手)。如果你想解决复杂的方程,你通常需要像 Mathematica 包这样的东西。
        • 如果您熟悉 F# 并且打算自己编写重要代码(而不是使用库),我最终可能会建议您使用像 F# 这样的语言。函数式语言被广泛认为特别适合数学和科学应用。
        • 哦,对,很公平。在这种情况下,您可能需要在问题中指定法律/许可要求...
        【解决方案4】:

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

        一旦你弄清楚如何将文本解析为符号,就可以很容易地创建一个可以确定这一点的应用

        c^2 = a^2 + b^2
        

        可以替换为

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

        但是,怎么样

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

        更糟糕的是,你有无法解决的集成和抽象代数......你必须在某个地方画出复杂性的界限,否则你最终只会构建另一个 Maple

        【讨论】:

        • 我同意。我将使用的大多数方程都是基本代数和基本几何。一些 Trig,但很少。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

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

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-05-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多