这似乎是一个非常简单的问题需要解决,但我发现的一切都太复杂了,我无法理解。
我有这个基本的弹道方程式:
鉴于我知道v,g,x和y,我将如何找到theta?它很容易在纸上阅读,但我不知道如何在代码中完成。
[编辑#3:]我的尝试(来自以下答案的输入)是:
gx = g*x
brackets = gx^2 + 2*y*v^2
sqrroot = sqrt( v^4 - g*brackets )
top1 = v^2 + sqrroot
theta1 = atan( top1 / gx )
top2 = v^2 - sqrroot
theta2 = atan( top2 / gx )
答案 0 :(得分:1)
你忽略了一个解决方案 - 你有
top = v^2 + sqrroot
但您还需要使用
重新计算top = v^2 - sqrroot
计算等式中的±
。
所以:
top1 = v^2 + sqrroot
top2 = v^2 - sqrroot
theta1 = atan(top1 / gx)
theta2 = atan(top2 / gx)
(我不知道您的代码中有equation
,但我认为您的意思是top
)
答案 1 :(得分:1)
更像是这样。
gx = g*x
brackets = g*x^2 + 2*y*v^2
sqrroot = sqrt( v^4 - g*brackets )
top1 = v^2 + sqrroot
theta1 = atan( top1 / gx )
top2 = v^2 - sqrroot
theta2 = atan( top2 / gx )
您必须考虑公式中的加号和减号。
计算乘法前的平方。在某些语言中,您可以通过计算g * x * x来计算g * x ^ 2。
答案 2 :(得分:0)
如果您无法访问arctan方法,则可以使用准牛顿算法。
答案 3 :(得分:0)
在你的最后一行,
theta = atan( equation / gx )
equation
未设置。您可能希望将top
替换为equation
。
输出每个中间结果(gx,括号,sqrroot和top)也可能有所帮助。看看是否有任何意外的中间结果。
答案 4 :(得分:0)
一个解决方案
#include<math.h>
void MattW_f(double *theta_p, double *theta_n, double g, double v, double x, double y) {
double v2 = v*v;
double gx = g*x;
// No check against sqrt(negative number)
double discriminant = sqrt(v2*v2 - g*(gx*x + 2*y*v2));
if (theta_p) {
// atan2() returns -pi to +pi, it is a 4 quadrant arctan.
*theta_p = atan2(v2 + discriminant, gx);
}
if (theta_n) {
*theta_n = atan2(v2 - discriminant, gx);
}
}