【问题标题】:Problem with solving an equation in a logical way以逻辑方式求解方程的问题
【发布时间】:2011-05-13 16:15:57
【问题描述】:

我正在考虑一种方法来解决具有简单面向对象的简单方程。我发现了一种似乎在变量单独存在的所有情况下都有效的方法。见:

对于示例,此等式:(4 / x + 3) / 2 = 2 首先,我将减号运算符 ((4 / x + 3) / 2 - 2 = 0) 中的等号转换为将所有内容都归零。 然后我以正常的优先顺序应用所有操作,就像x 变成一个数字一样。第一个是4 / x,我将操作:4/ 放入堆栈并返回x。接下来是x + 3(请记住4 / x 导致x)。操作进入堆栈(现在是4/ +3)并返回x。重温这个最终堆栈将是4/ +3 /2 -2。然后我按此顺序还原所有操作:

+n   -->  -n
-n   -->  +n
*n   -->  /n
/n   -->  *n
n/   -->  n/
**n  -->  **(1/n)
     (where the missing value of these binary operations is the variable)

现在堆栈是4/ -3 *2 +2。现在我颠倒顺序并将所有操作应用为零:

堆栈:+2 *2 -3 4/ 操作:4 / ((0 + 2) * 2 - 3)

结果是四,x的值。

这是非常令人困惑和复杂的,但合乎逻辑并且很容易用 ruby​​ 编写代码来执行任何方程式:

class Variable
  # define all numeric operators to use the stack and return self
end
def solve
  x = Variable.new
  yield(x)
  return x.value
end

x = solve do |x|
  (4 / x + 3) / 2 == 2
end

这个最终的界面很酷。

但我的问题是:如何解决x + x == 4这种方式?也就是说,如何添加两个变量栈?

【问题讨论】:

  • 您不需要两个变量堆栈。您需要一个简化阶段,将其更改为2x = 4,然后求解x
  • “我正在考虑一种方法来解决具有简单面向对象的简单方程。” - 这里有一些固有的错误。您可以通过算法解决这个问题(并在程序上扩展)。与其关注 OO(无论多么简单),不如关注这里所需的算法步骤。我的意思是,你如何解出这样一个方程?您通常使用哪些步骤?把它们写下来,然后分析它们以找到一种写成算法的方法。
  • 正如迈克尔所说,您的堆栈方法缺乏简化方程的能力。您需要一种简化算法,它采用原始方程并创建一个标准化,您可以将其输入到基于堆栈的过程中。但是,由于您的原始算法只能处理自变量仅出现一次的方程,因此存在限制。它无法处理变量出现多次的方程(如 x^2+x)。
  • @Michael 你应该这样回答。

标签: ruby math equation


【解决方案1】:

根据要求,我将我之前的评论作为答案:

您不需要两个变量堆栈。您需要一个简化阶段,将其更改为2x = 4,然后求解x

为了对此进行扩展,第一步是进行一些符号计算,例如术语重写和简化。一旦你有了它,就使用你当前的求解器(不过请记住 Luis 在他的 cmets 中所说的话)。

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多