我正在将椭圆作为拟合数据集的水平曲线。选择特定的椭圆后,我想将其报告为中心点,半长轴和短轴长度以及旋转角度。换句话说,我想用以下形式转换(使用mathematica)我的椭圆方程:
Ax^2 + By^2 + Cx + Dy + Exy + F = 0
转换为更标准的形式:
((xCos[alpha] - ySin[alpha] - h)^2)/(r^2) + ((xSin[alpha] + yCos[alpha] - k)^2)/(s^2) = 1
其中
(h,k)
是中心,alpha
是旋转角度,r
和s
是半轴我尝试转换的实际方程是
1.68052 x - 9.83173 x^2 + 4.89519 y - 1.19133 x y - 9.70891 y^2 + 6.09234 = 0
我知道中心点是拟合的最大值,即:
{0.0704526, 0.247775}
最佳答案
我发布了a version of this answer on Math SE,因为它可以从正确的数学排版中受益匪浅。该示例也更简单,并且有一些额外的细节。
以下描述遵循German Wikipedia article Hauptachsentransformation。根据维基百科之间的链接,英语对应的语言是principal component analysis。我发现前一篇文章比后一篇文章更具几何意义。但是,后者非常重视统计数据,因此它可能对您还是有用的。
回转
您的椭圆形为
[A E/2] [x] [x]
[x y] * [E/2 B] * [y] + [C D] * [y] + F = 0
首先,您确定旋转。通过标识此2×2矩阵的特征值和特征 vector 来执行此操作。这些特征 vector 将形成一个正交矩阵来描述您的旋转:其条目是公式中的
Sin[alpha]
和Cos[alpha]
。用你的数字,你得到
[A E/2] [-0.74248 0.66987] [-10.369 0 ] [-0.74248 -0.66987]
[E/2 B] = [-0.66987 -0.74248] * [ 0 -9.1715] * [ 0.66987 -0.74248]
这三个因子中的第一个是由特征 vector 形成的矩阵,每个特征 vector 都归一化为单位长度。中心矩阵在对角线上具有特征值,最后一个是第一个的转置。如果将 vector
(x,y)
与最后一个矩阵相乘,则将更改坐标系,以使混合项消失,即x和y轴与椭圆的主轴平行。这就是您想要的公式中发生的事情,所以现在您知道Cos[alpha] = -0.74248 (-0.742479398678 with more accuracy)
Sin[alpha] = 0.66987 ( 0.669868899516)
翻译
如果将上述公式中的行 vector
[C D]
与三个矩阵中的第一个相乘,则此效果将完全消除(x, y)
与第三个矩阵的相乘。因此,在更改后的坐标系中,将中心对角矩阵用于二次项,并将此乘积用于线性项。 [-0.74248 0.66987]
[1.68052, 4.89519] * [-0.66987 -0.74248] = [-4.5269 -2.5089]
现在,您必须分别为
x
和y
设置complete the square,最后得到一个可以读取中心坐标的表格。-10.369x² -4.5269x = -10.369(x + 0.21829)² + 0.49408
-9.1715y² -2.5089y = -9.1715(y + 0.13677)² + 0.17157
h = -0.21829 (-0.218286476695)
k = -0.13677 (-0.136774259156)
注意
h
和k
描述了已经旋转的坐标系中的中心。要获得原始中心,您需要再次将其与第一个矩阵相乘:[-0.74248 0.66987] [-0.21829] [0.07045]
[-0.66987 -0.74248] * [-0.13677] = [0.24778]
符合您的描述。
缩放比例
上面完成的正方形为常数因子
F
贡献了更多的项:6.09234 + 0.49408 + 0.17157 = 6.7580
现在,将其移至方程式的右侧,然后将整个方程式除以该数字,以便从所需的形式获得
= 1
。然后,您可以推导半径。1 -10.369
-- = ------- = 1.5344
r² -6.7580
1 -9.1715
-- = ------- = 1.3571
s² -6.7580
r = 0.80730 (0.807304599162099)
s = 0.85840 (0.858398019487315)
验证结果
现在,让我们检查一下是否未犯任何错误。使用我们找到的参数,您可以将方程式拼凑起来
((-0.74248*x - 0.66987*y + 0.21829)^2)/(0.80730^2)
+ (( 0.66987*x - 0.74248*y + 0.13677)^2)/(0.85840^2) = 1
将
1
移到左侧,然后乘以-6.7580
,您应该得到原始方程式。 Expanding that(括号中印有超高精度版本),您将获得-9.8317300000 x^2
-1.1913300000 x y
+1.6805200000 x
-9.7089100000 y^2
+4.8951900000 y
+6.0923400000
这是您输入内容的完美匹配。
关于math - 椭圆的标准形式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18023043/