我仍然不完全确定您要做什么。如果您想在编写代码时求解代数方程,Wolfram Alpha 非常有用,例如http://www.wolframalpha.com/input/?i=Solve%5Bq0+%2B+v0+t+%2B+a0% 2F2+t%5E2+%3D%3D+q1+%2B+v1+t+%2B+a1%2F2+t%5E2%2C%7Ba1%2Ct%7D%5D。
如果您想在运行时求解代数方程,这通常是一个非常困难的问题。如果你给我更多关于你想要做什么的细节,我可能会推荐一些好的免费包。
编辑:您可能试图解决的示例问题:
问:给定一个初始位置为 q0、初始速度为 v0、恒定加速度为 a0 的飞船,以及一个初始位置为 q1 的导弹,我想找到大小为 M 的导弹速度 v1,它会导致导弹最终与飞船相撞。
A:你正在尝试求解方程组
q0 + v0 t + 1/2 a0 t^2 = q1 + v1 t
v1 . v1 = M^2
对于向量 v1,影响时间 t 也是未知的。据我所知,这个系统很难以封闭形式解决:Wolfram Alpha 窒息它,甚至 Mathematica 也很难。然而,用数值方法来攻击它是相对简单的。为此,我们首先通过将第一个方程代入第二个方程来求解 t:
(q0 - q1 + v0 t + 1/2 a0 t^2) . (q0 - q1 + v0 t + 1/2 a0 t^2) == M^2 t^2
这是 t 中具有已知系数的四次多项式:
[(q0 - q1).(q0-q1)] + [2 (q0 - q1).v0] t + [v0.v0 + (q0-q1).a0 - M^2] t^2 + [v0.a0] t^3 + [1/4 a0.a0] t^4 = 0
括号中的所有内容都是一个标量,您可以根据已知量计算。要找到这个四次方的根,请使用黑盒根求解器(我强烈推荐 Jenkins-Traub:C++ 代码可在 www.crbond.com/download/misc/rpoly.cpp 获得,Java 和 Fortran 版本也随处可见'网)。
一旦你有了根,选择最小的正数(这个将对应于使导弹尽可能早地击中飞船的方向)并将其代入第一个方程,并简单地求解 v1。
编辑2:
问:给定一个初始位置为 q0、初始速度为 v0、恒定加速度为 a0 的宇宙飞船,以及一个初始位置为 q1 和初始速度为 v1 的导弹,我想找到大小为 M 的导弹加速度 a1,它会导致导弹最终发生碰撞与宇宙飞船。
A:这个问题和第一个很相似;你现在的方程式是
q0 + v0 t + 1/2 a0 t^2 = q1 + v1 t + 1/2 a1 t^2
a1 . a1 = M^2
其中 a1 和 t 未知。同样,这些方程可以组合起来得到一个具有已知系数的 t 的四次方:
[(q0 - q1).(q0-q1)] + [2 (q0 - q1).(v0-v1)] t + [(v0-v1).(v0-v1) + (q0-q1).a0] t^2 + [(v0-v1).a0] t^3 + [1/4 a0.a0 - 1/4 M^2] t^4 = 0
同样,使用 Jenkins-Traub 求根,然后将最小的正根代入第一个方程,求解 a1。