use*_*865 2 math wolfram-mathematica ellipse
我将椭圆作为拟合数据集的水平曲线.选择一个特定的椭圆后,我想将其报告为中心点,半长轴和短轴长度以及旋转角度.换句话说,我想从形式转换(使用mathematica)我的椭圆方程:
Ax^2 + By^2 + Cx + Dy + Exy + F = 0
Run Code Online (Sandbox Code Playgroud)
更标准的形式:
((xCos[alpha] - ySin[alpha] - h)^2)/(r^2) + ((xSin[alpha] + yCos[alpha] - k)^2)/(s^2) = 1
Run Code Online (Sandbox Code Playgroud)
(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
Run Code Online (Sandbox Code Playgroud)
我知道中心点是拟合的最大值,即:
{0.0704526, 0.247775}
Run Code Online (Sandbox Code Playgroud)
我在Math SE上发布了这个答案的一个版本,因为它从正确的数学排版中获益良多.这个例子也比较简单,还有一些额外的细节.
以下描述遵循德语维基百科文章Hauptachsentransformation.根据维基链接,它的英文对应是主成分分析.我发现前一篇文章比后者更加几何.然而,后者非常关注统计数据,所以它可能对你有用.
你的椭圆被描述为
[A E/2] [x] [x]
[x y] * [E/2 B] * [y] + [C D] * [y] + F = 0
Run Code Online (Sandbox Code Playgroud)
首先确定旋转.你可以通过识别这个2×2矩阵的特征值和特征向量来做到这一点.这些特征向量将形成一个描述旋转的正交矩阵:它的条目是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]
Run Code Online (Sandbox Code Playgroud)
这三个因子中的第一个是由特征向量形成的矩阵,每个矩阵归一化为单位长度.中心矩阵在对角线上具有特征值,最后一个是第一个的转置.如果将向量(x,y)与最后一个矩阵相乘,则将以混合项消失的方式更改坐标系,即x和y轴平行于椭圆的主轴.这就是你想要的公式中发生的事情,所以现在你知道了
Cos[alpha] = -0.74248 (-0.742479398678 with more accuracy)
Sin[alpha] = 0.66987 ( 0.669868899516)
Run Code Online (Sandbox Code Playgroud)
如果将[C D]上面公式中的行向量与三个矩阵中的第一个相乘,则此效果将完全取消(x, y)第三个矩阵的乘法.因此,在该改变的坐标系中,您使用中心对角矩阵作为二次项,并将此乘积用于线性项.
[-0.74248 0.66987]
[1.68052, 4.89519] * [-0.66987 -0.74248] = [-4.5269 -2.5089]
Run Code Online (Sandbox Code Playgroud)
现在你必须独立完成方形x和y,并最终得到一个表格,你可以从中读取中心坐标.
-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)
Run Code Online (Sandbox Code Playgroud)
注意h并k描述已经旋转的坐标系中的中心; 要获得原始中心,您将再次使用第一个矩阵乘以:
[-0.74248 0.66987] [-0.21829] [0.07045]
[-0.66987 -0.74248] * [-0.13677] = [0.24778]
Run Code Online (Sandbox Code Playgroud)
适合您的描述.
上面完成的方块为常数因子提供了更多的术语F:
6.09234 + 0.49408 + 0.17157 = 6.7580
Run Code Online (Sandbox Code Playgroud)
现在将其移动到等式的右侧,然后将整个等式除以该数字,以便= 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)
Run Code Online (Sandbox Code Playgroud)
现在让我们检查一下我们没有犯任何错误.通过我们找到的参数,您可以将等式拼凑在一起
((-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
Run Code Online (Sandbox Code Playgroud)
移动1到左侧,然后乘以-6.7580,你应该得到原始的等式.扩展它(用括号中印刷的额外精度版本),你会得到
-9.8317300000 x^2
-1.1913300000 x y
+1.6805200000 x
-9.7089100000 y^2
+4.8951900000 y
+6.0923400000
Run Code Online (Sandbox Code Playgroud)
这是您输入的完美匹配.