通过代码解决弹道方程

时间:2013-07-16 14:57:06

标签: algorithm math equation

这似乎是一个非常简单的问题需要解决,但我发现的一切都太复杂了,我无法理解。

我有这个基本的弹道方程式:

ballistic trajectory

鉴于我知道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 )

5 个答案:

答案 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);
    }
  }