解决三次方程以找到曲线上距离某点最近的点

3

好的,

我有一个抛射物,其位置定义如下:

a.x = initialX + initialDX * time;

a.y = initialY + initialDY * time + 0.5 * gravtiy * time^2;

我希望能够预测这个抛射物会与环境中哪些障碍物发生碰撞。我计划检查距离A曲线上最近点到点P的距离。
我认为在点A处,曲线的切线将垂直于向量AP,而在A处的曲线的切线将简单地是该点的抛射物速度VAP点乘V=0。
ap.x = initialX + initialDX * time - p.x;

ap.y = initialY + initialDY * time + gravity * time^2 - p.y;

v.x = initialDX;

v.y = initialDY + gravity * time;

=>

APV =

( 0.5 * gravity^2 ) * t^3 +

( 1.5 * gravity * initialDY  ) * t^2 +

( initialDX^2 + initialDY^2 + gravity * ( initialY - p.y ) ) * t +

( initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y ) )

从这里我可以看出这是一个三次函数。我已经在网上花了一些时间研究,发现有一个通用方程似乎适用于某些数值来寻找根。

这是我尝试实现的过程。 http://www.sosmath.com/algebra/factor/fac11/fac11.html

a = 0.5 * gravity^2;

b = 1.5 * gravity * initialDY;

c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );

d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );

A = ( c - ( b * b ) / ( 3 * a ) ) / a;

B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;

workingC = -Math.pow( A, 3 ) / 27;

u = ( -B + Math.sqrt( B * B - 4 * workingC ) ) / 2; // Quadratic formula

s = Math.pow( u + B, 1 / 3 );

t = Math.pow( u, 1 / 3 );

y = s - t;

x = y - b / ( 3 * a );

当我将x插入到曲线的原始方程作为时间时,这应该给我A。对于某些值来说,这似乎很有效,但是当p.y超过一定值时,我没有正数可以在二次方程中进行平方根运算。
我对这种情况缺乏足够全面的数学理解,不知道为什么会出现这种情况,也不知道如何解决这个问题。
如果有任何帮助,将不胜感激。
更新:
我已经调整了我的算法以处理复杂根,但我仍然遇到麻烦。 如果判别式为负,我现在做的是:
a = 0.5 * gravity^2;

b = 1.5 * gravity * initialDY;

c = initialDX^2 + initialDY^2 + gravity * ( initialY - p.y );

d = initialDX * ( initialX - p.x ) + initialDY * ( initialY - p.y );

A = ( c - ( b * b ) / ( 3 * a ) ) / a;

B = -( d + ( 2 * b * b * b ) / ( 27 * a * a ) - ( b * c ) / ( 3 * a ) ) / a;

workingC = -Math.pow( A, 3 ) / 27;

discriminant = B * B - 4 * workingC;

then if discriminant < 0;

uc = new ComplexNumber( -B / 2, Math.sqrt( -discriminant ) / 2 ); 

tc = uc.cubeRoot( ); 

uc.a += B;

sc = uc.cubeRoot( ); 

yc = sc - tc; 

yc.a -= b / ( 3 * a ); 

x = -d / ( yc.a * yc.a + yc.b * yc.b ); 

由于某些原因,这仍然没有给我期望的结果。是否有任何明显的错误?

1个回答

4

实数多项式可以有复数根,如果根不是实数,则成对出现。

这意味着三次方程式总是至少有一个实根。

如果您使用您的方法得到一个复数根,可以尝试获取共轭根,将立方常数乘以除以立方常数,取倒数以获得实根。

因此,如果您将您的根表示为(m,n),表示复数m + in。则另一个根是m-in =(m,-n),其中m和n是实数。

然后可以将立方体写为P(x) = (x^2-2m +(m^2 + n^2))(x-r)。

因此,如果 P(x) = x^3 - a_1 *x^2 + a_2*x - a_3,则我们有 r = a_3 / (m^2 + n^2)(a_3是根的积,即r(m^2+n^2))

获取r的更简单的方法是使用公式r = a_1 - 2m(a_1是根的和,即r + 2m)。

请参阅:http://en.wikipedia.org/wiki/Complex_number


请修正/澄清:您的公式中有“a”和“b”,但没有“t”。 - Jason S
只是为了澄清:这意味着我应该检查判别式,如果它是负数,我就从我的二次方程中取复根。然后我需要执行相同的计算来计算我已命名为s、t、y、x的变量,但使用复数。从那里开始,如果x仍然是复数,我使用您提供的公式之一来找到实根? - Tech-no
@Tech:是的,当你解出二次方程并看到一个复数根时,请继续进行并找到复数根。然后使用我给出的公式找到实数根。这样,您就可以找到三个立方体的根。 - Aryabhatta
@Tech-no:您能否编辑问题并添加该信息?也许您可以添加一个名为“更新”的部分... - Aryabhatta
@Tech-no:我发现了一个错误。难道你不需要执行tc.a += B,然后再将其立方根赋值给sc吗?你在那里使用了uc。此外,请注意,复数的立方根可能有三个不同的值(这可能无关紧要,但也可能是下一个障碍)。 - Aryabhatta
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接