【问题标题】:Equation Solving Algorithm方程求解算法
【发布时间】:2011-06-12 12:09:55
【问题描述】:

你好 我正在尝试开发一个物理问题解决器。该程序将专门为 android 编写,但这并不重要。我有这三个方程,任何了解物理学的人都会熟悉的。

vf = vi + a*t
y= vi*t + .5*t^2
vf^2=vi^2 + 2*a*y

我想开发一个应用程序,它使用这三个方程来求解用户想要的其他值,给定用户拥有的任何已知变量。这是我遇到问题的地方。如果我每次都知道用户会有什么变量,我会很好。但是因为我不这样做,所以我需要我的程序能够重新排列方程并在必要时替换单个变量来评估它们。

我知道答案可能是我需要为每个用户输入组合编写一组单独的代码,但如果有人知道另一种方式,我将不胜感激,这样我就不需要写出全部​​ 100 个代码左右变化。

感谢您的帮助。

【问题讨论】:

  • 如果你写下用例是什么,没有 100 个变体,但可能更像 3 个。你只有 vi、vf、y、a 和 t。在不同的情况下,您需要解决其中的一两个。
  • 问题在于,仅当方程太难自动求解(太多未知数 => 大的数学和数值问题)时,任何由此编写通用框架的尝试才有用。因此,我提倡手动编码排列。
  • @phkahler 我会说 10。有 5 个变量和 3 个方程,因此必须给出 2 个变量的值。 2C5 = 10.
  • 感谢您的帮助。我已经解决了这个问题。

标签: algorithm solver equations


【解决方案1】:
if(vfField.getText() != "") && (viField.getText() != "") && (aField.getText() != "") && (tField.getText() != "") {
printf("you've already solved it!!") 
}

if(vfField.getText() != "") && (viField.getText() != "") && (aField.getText() != "") && (tField.getText() == "") {
time = vf / (vi + a)
printf(time) 
}

等等.. :)

【讨论】:

    【解决方案2】:

    根据我的经验(数周的编码),编写可以重新排列方程式的自己的程序非常耗时。在这种情况下你应该避免它。

    不过,我也不建议手动编码排列,因为有很多代码需要检查错误。就像在问题的第二个等式中遗漏了 a 一样。此外,添加新方程也很困难。

    我认为您应该使用外部方程求解程序,如 maxima、matlab、mathematika 等。将所有可能的未知组合输入它们以使用 2 个现有方程求解。 (第三个等式取决于前两个,所以你可以离开它)

    最大值代码如下所示

    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vi,vf]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vi,y]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vi,t]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vi,a]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vf,y]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vf,t]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [vf,a]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [y,t]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [y,a]);
    solve([vf = vi + a*t, y= vi*t + .5*a*t^2], [t,a]);
    

    由于涉及二次方,您会得到很多 +- 答案,其中很多显然是不正确的(例如返回负时间)。您可以通过手动选择正确的 +- 解决方案,因为数量不多。

    或者,自动解决方案是从示例数字开始,求解原始方程,并丢弃任何不给出相同数字的解方程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 2013-10-09
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多