我想知道是否有人有关于如何做一些听起来很简单但在尝试编程时看起来并不像的事情的信息或经验。这个想法是:给出一个包含方程的字符串,例如:例如“2*x = 10”(这很简单,但也可能变得非常复杂,例如 sqrt(54)*35=x^2;等等......),程序将返回 x = 5,并可能给出他如何到达那里的日志。

这可行吗?如果是这样,有人有线索吗?有关信息,请访问此网站(http://www.numberempire.com/equationsolver.php)它在 PHP 中做同样的事情,但不是开源的。

谢谢你的帮助 !

有帮助吗?

解决方案

这就是所谓的“解析”,虽然计算机科学已经解决了这个问题,直到你彻底了解它,它一点也不简单。有介绍如何解决这个问题的一个完整的计算机科学学科。在C语言中,你必须定义输入的语法(可能与它的优先级规则),然后执行的词法分析您的输入,然后的解析的结果,最后评估您解析树。

在语言,如红宝石,但是,因为你有这样全面的支持,字符串处理,并因为你有如此巨大的运行时的功耗可以用代码像这样一行解决您的问题:

puts(eval($_)) while gets

是的,这将覆盖超过你所求的。

其他提示

首先,你必须正确地定义哪些类型的方程可以具有作为输入。那么你应该创造一个良好的抽象代表公式,例如多项式类。当你想使用更复杂的表达,去为数字表达式树。解析可以很容易的,如果你有良好的规则表达式转换为前缀的符号,然后评价容易使用堆栈。一旦有了artithmetic树木或多项式,可以实现转换来计算变量(多个)。

如果等式不变得复杂,这不会是肯定的C / C ++代码几行。

有关线性方程组,你将不得不模拟的线性代数书籍中描述的方法之一。的,该代码是足够小的。

您可以尝试连接在SymPy到C(或C ++)码并用它来帮助解决方程。

IIRC,SymPy具有种功能。另外,它应该更容易输入字符串操纵到Python的可用方程式内,然后将其传递给SymPy为解决。

您的问题将分为两个部分:解析方程,并用符号求解它们。关于第一个我不会说太多,因为其他答案已经很好地涵盖了这个主题;我个人的建议是为前缀表示法的表达式编写一个简单的递归下降解析器。

第二部分,解析解方程,将会很棘手。一般来说,存在一些特殊类型的方程,可以使用标准方法来找到解析解:

  • 线性方程组:任何直接线性求解器。如果您想明确地显示步骤并且方程/未知数的数量很少,我会推荐一些简单的方法,例如无枢轴高斯消元法或克莱默规则。
  • 多项式方程组:变量代入后,相当于求单个多项式的根。如果它们的次数 <= 4,则有精确解的公式。注意:对于 3 级和 4 级,这些公式并不令人愉快。
  • 具有有理系数的多项式方程组的有理解:如上所述进行变量替换。然后使用理性零测试进行暴力破解。
  • 其他类型的方程:祝你好运。对于更复杂的非线性方程组,如果您可以满足数值(非解析)解决方案,请研究牛顿法。

一个校正:这不是线性代数,这通常意味着多个方程和未知的matricies

您示例肯定是不复杂的。

您需要的是一个简单的表达式语法和解析器。解析方程转换成抽象语法树和遍历树来评估它。

如果你正在编写Java它看起来像的这个。另一个例子是 symja 。或许,这将是足够的灵感为你拿出你自己的C ++。

您可能还需要寻找到的Mathematica和Wolfram的阿尔法。斯蒂芬·沃尔弗拉姆是世界上最好的数学家和计算机科学家之一。他得到了很多的东西,你可以重复使用,以良好的优势,而不是自己写的。

您必须定义您通过“解决”,你期待已返回什么意思。

有符号解和数值解。你说的是哪一个?两者都同样有效,但它们是不同的。您可以根据您的答案应用不同的技术。

还有一点:对于“问题”的方程依赖于方程式类型着大量的技术。如果你给我像f(x) = 0我想的求根算法,如牛顿法。如果你给我一个普通的微分方程我可能会尝试使用龙格 - 库塔替代方法或数值积分。如果你给我一个偏微分方程我可以申请有限差分,有限元或边界元技术。 (不要让我开始于椭圆,抛物线,双曲线和偏微分方程。)

的一点是,你的问题是非常通用,答案取决于你想做什么很大。更多详细信息可能有帮助。

在一般情况下,你将不得不表达解析成一些内部表示。许多线性代数书建议使用矩阵(或std::vector)来表示的系数。的项的指数是通过其在载体中的位置来定义。

因此,例如,表达式:

 2 + 3x + 5x^2

可以被表示为阵列或std::vector

std::vector<int> expression;
expression[0] = 2; // 2 * x ^ 0
expression[1] = 3;
expression[2] = 5;

编写的评价函数变得微不足道,并留下作为练习读者。

求解多个方程变得更加复杂。这有现有的库和算法。谷歌搜索应该拿出好东西。 : - )

我建议开始接触简单的术语和建立应该是一个分析器。一旦作品,你可以改变解析器接受函数名以及。

如果您正试图简化对=两侧方面的表示,只是写下来手工求解时,你通常会采取的步骤。尝试一些不同的方程得到一些规则了。现在执行用C这些规则++

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top