一、背景
点位误差椭圆是一种描述待定点位置在各个方向上误差分布规律的椭圆。
暂无
二、代码
#!/usr/bin/python3
#-*- codng: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
def getErrorEllipsePara(listQxx,drawFigure = None,sigmaZero=None,angle=None):
Qxx = np.mat(listQxx)
if Qxx.shape[0] == Qxx.shape[1] and Qxx.shape[0] == 2:
tan_toubleFia = 2*Qxx[0,1]/(Qxx[0,0]-Qxx[1,1])
fia = np.arctan(tan_toubleFia)/2
#fias = np.rad2deg(np.arctan2(2*Qxx[0,1],Qxx[0,0]-Qxx[1,1]))
print("-fia:{} rad | -fia:{}° | -fiaaddninety:{}°".format(fia,np.rad2deg(fia),np.rad2deg(fia)+90))
fiaE,fiaF = filter_fiaEF(Qxx,fia)
if sigmaZero is not None:
fiaE = np.deg2rad(fiaE)
fiaF = np.deg2rad(fiaF)
Q_ff = lambda sitha:(Qxx[0,0]*np.cos(sitha)*np.cos(sitha)+Qxx[1,1]*np.sin(sitha)*np.sin(sitha)+Qxx[0,1]*np.sin(2*sitha))
sigmaE = np.sqrt(sigmaZero*sigmaZero*Q_ff(fiaE))
sigmaF = np.sqrt(sigmaZero*sigmaZero*Q_ff(fiaF))
print("-fiaE:{} 度,-E:{};\n -fiaF:{} 度,-F:{}".format(np.rad2deg(fiaE),sigmaE,np.rad2deg(fiaF),sigmaF))
# Draw
if drawFigure is not None:
drawEllipse(sigmaE,sigmaF,np.rad2deg(fiaE))
print("- 绘图完成")
# anlyse
if angle is not None:
fia_angle = np.deg2rad(angle)
newQff = Q_ff(fia_angle)
print("\n-angle Qff sigma:",np.rad2deg(fia_angle),newQff,sigmaZero*np.sqrt(newQff))
print("\n*: ",np.sqrt(sigmaE*np.cos(newQff)*np.cos(newQff)+sigmaF*np.sin(newQff)*np.sin(newQff)))
else:
print("Error para")
def filter_fiaEF(Qxx,fia):
fiaE = 0
fiaF = 0
if Qxx[0,1] == 0: # 在轴上
if Qxx[0,0] > Qxx[1,1]:
fiaE = 0
fiaF = 90
print("-fiaE:{} or {},最大位差在x轴上 | -fiaF:{} or {}".format(0,180,90,270))
else:
fiaE = 90
fiaF = 0
print("-fiaE:{} or {},最大位差在y轴".format(90,270))
elif Qxx[0,1] > 0:
# if Qxx[0,1]*np.tan(np.deg2rad(fia))>0:
print("极大值fiaE位于一、三象限")
if (fia > 0 and fia < 90) or (fia < 270 and fia > 180):
fiaE = fia
fiaF = fia + 90
# 存疑
else:
fiaE = fia + 90
fiaF = fia
# else:
# if (fia > 0 and fia < 90) or (fia < 270 and fia > 180):
# fiaE = fia + 90
# fiaF = fia
# else:
# fiaE = fia
# fiaF = fia + 90
# print("极大值位于二、四象限")
else:
# if Qxx[0,1]*np.tan(np.deg2rad(fia)) > 0:
if (fia > 0 and fia < 90) or (fia < 270 and fia > 180):
fiaE = fia + 90
fiaF = fia
else:
fiaE = fia
fiaF = fia + 90
print("fiaE极大值2、4象限")
# else:
# if (fia > 0 and fia < 90) or (fia < 270 and fia > 180):
# fiaE = fia + 90
# fiaF = fia
# else:
# fiaE = fia
# fiaF = fia + 90
# print("极大值二四象限")
return fiaE,fiaF
def drawEllipse(E,F,fiaE,x=None,y=None):
print("-"*20)
fig = plt.figure(0)
ax = fig.add_subplot(111, aspect='equal')
if x is None:
x = 0
if y is None:
y = 0
e = Ellipse(xy = (x,y), width = E, height = F, angle=fiaE,facecolor= 'green', alpha=0.3)
ax.add_patch(e)
ax.plot(x, y, 'ro')
plt.axis('scaled')
plt.axis('equal')
ax.grid(True)
strInfo = "E:"+str(E)[0:5]+" -F:"+str(F)[0:5]+" -fiaE:"+str(fiaE)[0:6]+"degree"
plt.title("ErrorEllipse"+strInfo)
plt.savefig("./ErrorEllipse.png")
plt.show()
if __name__=="__main__":
Q = [[5,-1.2],
[-1.2,4]]
sigma = 0.81
getErrorEllipsePara(Q,sigmaZero=sigma,angle=50,drawFigure=True)
# drawEllipse()
[3]
[4]amazing
Comments | NOTHING