content(app-G): 明确位置速度混合协议与方向符号
区分候选角导数和位置轨迹的时间导数,给出频移近似误差。 明确保留混合协议及统一可微轨迹时各接口的修改条件。 补充独立差分、固定节点 OLS 与方向符号检查,全部通过。 XeLaTeX 多遍与引用检查通过;PDF 转换受外部进程文件占用阻塞。
This commit is contained in:
@@ -74,6 +74,35 @@ def geometry(x, t, ell):
|
||||
return w, W, wd, WD, b, bx, bd, bdx
|
||||
|
||||
|
||||
def mixed_motion(x, t, ell):
|
||||
"""Synthetic non-spin rotation: deliberately not an astronomical model."""
|
||||
p0, P0 = intersection(x)
|
||||
a, k = 7.292115e-5*t, 3e-5
|
||||
z = np.array([[np.cos(a), -np.sin(a), 0.],
|
||||
[np.sin(a), np.cos(a), 0.], [0., 0., 1.]])
|
||||
a = k*t
|
||||
q = np.array([[1., 0., 0.], [0., np.cos(a), -np.sin(a)],
|
||||
[0., np.sin(a), np.cos(a)]])
|
||||
generator = np.array([[0., 0., 0.], [0., 0., -k], [0., k, 0.]])
|
||||
B = z@q
|
||||
Bd = SPIN@B + B@generator
|
||||
C, Cd = SPIN@B, SPIN@Bd
|
||||
p, pd, vu = B@p0, Bd@p0, C@p0
|
||||
s = SATELLITES[ell] + t*VELOCITIES[ell] + .5*t*t*ACCELERATIONS[ell]
|
||||
vs = VELOCITIES[ell] + t*ACCELERATIONS[ell]
|
||||
r = np.linalg.norm(s-p)
|
||||
w = (s-p)/r
|
||||
S = np.eye(3)-np.outer(w, w)
|
||||
wd = S@(vs-pd)/r
|
||||
proxy = S@(vs-vu)/r
|
||||
W = -S@B@P0/r
|
||||
b = -(vs-vu)@w/WAVELENGTH
|
||||
bg = -(vs-pd)@w/WAVELENGTH
|
||||
bd = -((ACCELERATIONS[ell]-Cd@p0)@w + (vs-vu)@wd)/WAVELENGTH
|
||||
bx = -(-w@C@P0+(vs-vu)@W)/WAVELENGTH
|
||||
return p, pd, vu, w, wd, proxy, b, bg, bd, bx
|
||||
|
||||
|
||||
def coefficients(x, ell):
|
||||
data = [geometry(x, t, ell) for t in TIMES]
|
||||
ref = [geometry(x, t, 0) for t in TIMES]
|
||||
@@ -168,6 +197,33 @@ def main():
|
||||
Tref[:2, :2] = finite_difference(lambda x: bearing(intersection(x)[0], SATELLITES[1]), x)
|
||||
Tref[2:, :2] = Cx
|
||||
check("reference-change full Jacobian", Tref, finite_difference(switch, z), 2e-6)
|
||||
for ell in range(2):
|
||||
p, pd, vu, w, wd, proxy, b, bg, bd, bx = mixed_motion(x, .41, ell)
|
||||
step = 1e-3
|
||||
check("mixed position velocity", pd,
|
||||
(mixed_motion(x, .41+step, ell)[0]-mixed_motion(x, .41-step, ell)[0])/(2*step),
|
||||
2e-6)
|
||||
check("mixed true LOS time derivative", wd,
|
||||
(mixed_motion(x, .41+step, ell)[3]-mixed_motion(x, .41-step, ell)[3])/(2*step))
|
||||
check("mixed node Doppler Jacobian", bx,
|
||||
finite_difference(lambda x: mixed_motion(x, .41, ell)[6], x))
|
||||
check("mixed Doppler time derivative", bd,
|
||||
(mixed_motion(x, .41+step, ell)[6]-mixed_motion(x, .41-step, ell)[6])/(2*step))
|
||||
check("mixed Doppler discrepancy", b-bg, (vu-pd)@w/WAVELENGTH)
|
||||
check("mixed proxy LOS discrepancy", proxy-wd,
|
||||
-(np.eye(3)-np.outer(w, w))@(vu-pd)/np.linalg.norm(
|
||||
SATELLITES[ell]+.41*VELOCITIES[ell]+.5*.41**2*ACCELERATIONS[ell]-p))
|
||||
assert np.linalg.norm(vu-pd) > 1, "Fixture must expose the mixed protocol"
|
||||
e = -w
|
||||
check("orientation steering identity",
|
||||
np.exp(-2j*np.pi*ARRAY@w/WAVELENGTH),
|
||||
np.exp(2j*np.pi*ARRAY@e/WAVELENGTH))
|
||||
check("orientation Doppler identity", b, (VELOCITIES[ell]+.41*ACCELERATIONS[ell]-vu)@e/WAVELENGTH)
|
||||
mixed_coeff = lambda x: np.linalg.lstsq(DESIGN, [
|
||||
mixed_motion(x, t, 1)[6]-mixed_motion(x, t, 0)[6] for t in TIMES], rcond=None)[0]
|
||||
mixed_jac = np.linalg.lstsq(DESIGN, [
|
||||
mixed_motion(x, t, 1)[9]-mixed_motion(x, t, 0)[9] for t in TIMES], rcond=None)[0]
|
||||
check("mixed fixed-design OLS Jacobian", mixed_jac, finite_difference(mixed_coeff, x))
|
||||
print("PASS: synthetic local formula checks; code-side geometry and CP/IP acceptance still required.")
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user