2

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

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

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

我知道答案可能是我需要为每种用户输入组合编写一组单独的代码,但如果有人知道另一种方式,我将不胜感激,因此我不需要编写所有 100 种左右的变体代码.

谢谢你的帮助。

4

2 回答 2

0
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) 
}

ETC.. :)

于 2011-01-20T14:51:15.607 回答
0

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

但是,我也不建议手动编码排列,因为有很多代码可以检查错误。就像在问题的第二个等式中遗漏了 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]);

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

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

于 2019-11-27T12:35:44.643 回答