content(app-G): 明确位置速度混合协议与方向符号

区分候选角导数和位置轨迹的时间导数,给出频移近似误差。
明确保留混合协议及统一可微轨迹时各接口的修改条件。
补充独立差分、固定节点 OLS 与方向符号检查,全部通过。
XeLaTeX 多遍与引用检查通过;PDF 转换受外部进程文件占用阻塞。
This commit is contained in:
2026-10-05 22:03:36 +08:00
parent 7215f15f45
commit 175389b149
2 changed files with 139 additions and 2 deletions
+56
View File
@@ -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.")