题 3.1
-
Jacobi 迭代法
10000100005x(k+1)=021202110x(k)+31510
也即有迭代公式:
⎩⎨⎧x1(k+1)=102x2(k)+x3(k)+3x2(k+1)=102x1(k)+x3(k)+15x3(k+1)=5x1(k)+2x2(k)+10
代入 x(0)=[0,0,0]⊤ 得 x(1)=[3/10, 3/2, 2]⊤
⎩⎨⎧x1(2)=102(3/2)+2+3=103+2+3=54x2(2)=102(3/10)+2+15=103/5+2+15=2544x3(2)=53/10+2(3/2)+10=53/10+3+10=50133
也即 x(2)=[0.8, 1.76, 2.66]⊤
-
Gauss-Seidel 迭代法
10−2−1010−2005x(k+1)=000200110x(k)+31510
也即有迭代公式:
⎩⎨⎧x1(k+1)=102x2(k)+x3(k)+3x2(k+1)=102x1(k+1)+x3(k)+15x3(k+1)=5x1(k+1)+2x2(k+1)+10
代入 x(0)=[0,0,0]⊤ 得:
⎩⎨⎧x1(1)=103x2(1)=102(3/10)+15=103/5+15=2539x3(1)=53/10+2(39/25)+10=53/10+78/25+10=250671
⎩⎨⎧x1(2)=102(39/25)+671/250+3=25002201x2(2)=102(2201/2500)+671/250+15=625012153x3(2)=52201/2500+2(12153/6250)+10=62500184617
也即 x(2)=[0.8804, 1.94448, 2.953872]⊤
题 3.2
迭代格式为:
[a1100a22]x(k+1)=[0−a21−a120]x(k)+[b1b2]
从而迭代矩阵:
M=[0−a21/a22−a12/a110]
特征根为 λ=±a11a22a12a21(注意可能为纯虚数),从而谱半径:
ρ(M)=a11a22a12a21
迭代收敛的充要条件为 ∣a11a22a12a21∣<1,也即迭代收敛的充要条件为:
a11a22a12a21<1
题 3.3
-
最速下降法
编写 python 代码如下:
import numpy as np
x = np.array([0, 0, 0], dtype=float)
A = np.array([[4, 3, 0], [3, 4, -1], [0, -1, 4]], dtype=float)
b = np.array([24, 30, -24], dtype=float)
r = b - A @ x
print(f"x^(0) = {x}")
print(f"r^(0) = {r}")
for k in range(3):
t = A @ r
alpha = np.dot(r, r) / np.dot(r, t) # 步长
x += alpha * r # 更新解
r -= alpha * t # 更新残差
print(f"alpha^({k}) = {alpha:.5f}")
print(f"x^({k+1}) = {x}")
print(f"r^({k+1}) = {r}")
运行结果:
x^(0) = [0. 0. 0.]
r^(0) = [ 24. 30. -24.]
alpha^(0) = 0.14691
x^(1) = [ 3.5257732 4.40721649 -3.5257732 ]
r^(1) = [-3.32474227 -1.73195876 -5.48969072]
alpha^(1) = 0.22980
x^(2) = [ 2.76173276 4.00920473 -4.78732834]
r^(2) = [ 0.92545478 0.89065447 -0.84148191]
alpha^(2) = 0.14852
x^(3) = [ 2.89917841 4.14148195 -4.9123026 ]
r^(3) = [-0.02115948 -0.17576563 -0.20930764]
从而得到
x(3)≈[2.8992, 4.1415, −4.9123]⊤
绝对误差约为
e(3)≈[−0.1008, 0.1415, 0.0877]⊤
-
共轭梯度法
编写 python 代码如下:
import numpy as np
x = np.array([0, 0, 0], dtype=float)
A = np.array([[4, 3, 0], [3, 4, -1], [0, -1, 4]], dtype=float)
b = np.array([24, 30, -24], dtype=float)
r = b - A @ x
d = r.copy()
r_norm = np.dot(r, r) # 存储 ||r||^2
print(f"x^(0) = {x}")
print(f"r^(0) = {r}")
print(f"d^(0) = {d}")
for k in range(3):
t = A @ d
s = np.dot(d, t)
alpha = np.dot(r, d) / s # 步长
x += alpha * d # 更新解
r -= alpha * t # 更新残差
r_norm_new = np.dot(r, r)
beta = r_norm_new / r_norm
r_norm = r_norm_new
d = r + beta * d # 更新搜索方向
print(f"alpha^({k}) = {alpha:.5f}")
print(f"beta^({k}) = {beta:.5f}")
print(f"x^({k+1}) = {x}")
print(f"r^({k+1}) = {r}")
print(f"d^({k+1}) = {d}")
运行结果:
x^(0) = [0. 0. 0.]
r^(0) = [ 24. 30. -24.]
d^(0) = [ 24. 30. -24.]
alpha^(0) = 0.14691
beta^(0) = 0.02154
x^(1) = [ 3.5257732 4.40721649 -3.5257732 ]
r^(1) = [-3.32474227 -1.73195876 -5.48969072]
d^(1) = [-2.80789669 -1.0859018 -6.0065363 ]
alpha^(1) = 0.23782
beta^(1) = 0.00071
x^(2) = [ 2.85801112 4.14897194 -4.95422216]
r^(2) = [ 0.1210397 -0.12414328 -0.0341394 ]
d^(2) = [ 0.11905546 -0.12491065 -0.038384 ]
alpha^(2) = 1.19263
beta^(2) = 0.00000
x^(3) = [ 3. 4. -5.]
r^(3) = [-1.80411242e-15 -1.44328993e-15 -1.03389519e-15]
d^(3) = [-1.80411242e-15 -1.44328993e-15 -1.03389519e-15]
从而得到
x(2)≈[2.8580, 4.1490, −4.9542]⊤
绝对误差约为
e(2)≈[−0.1420, 0.1490, 0.0458]⊤
题 3.4
证明:
因为 A=D−L−U,所以:
B=I−D−1(D−L−U)=D−1L+D−1U
其中 D−1L 为严格下三角矩阵,D−1U 为严格上三角矩阵。
于是式 P3.4-1 可化为:
x~(k)=D−1Ux(k)+D−1Lx~(k)+g
也即:
x~(k)=(I−D−1L)−1(D−1Ux(k)+g)=(D−L)−1(Ux(k)+Dg)
式 P3.4-2 可化为:
x(k+1)=D−1Ux(k+1)+D−1Lx~(k)+g
也即:
x(k+1)=(I−D−1U)−1(D−1Lx~(k)+g)=(D−U)−1(Lx~(k)+Dg)=(D−U)−1[L(D−L)−1(Ux(k)+Dg)+Dg]=(D−U)−1L(D−L)−1Ux(k)+(D−U)−1[L(D−L)−1+I]Dg=(D−U)−1L(D−L)−1Ux(k)+(D−U)−1D(D−L)−1Dg
从而
Mf=(D−U)−1L(D−L)−1U=(D−U)−1D(D−L)−1D
证毕。
题 3.5
我们假设己方和己方机器人的任一视线中不存在两个及以上的猎人,否则参考下图可举反例证明无法精确定位。
图 1:反例
若某区域恰被 k 个机器人监测,则称其为 k 覆盖的。
我们先证明,在已知猎人数量上界 n 时,我们可以通过 (2n+1) 覆盖唯一确定所有猎人的位置。
然后再利用这一性质设计确定所有猎人位置的算法,我们首先探测猎人数量的上界,然后再进行精确计算。
引理
已知猎人数量上界为 n 时,我们可以通过 (2n+1) 覆盖的机器人布置唯一确定所有猎人的位置。
这里要求每个 (2n+1) 覆盖区域的监测机器人不存在三点共线。
证明:
只需证明对每个 (2n+1) 覆盖区域中的猎人都可以唯一确定位置,
也即证明 (2n+1) 覆盖区域中不存在两个不完全相同的猎人集合,使得 (2n+1) 个监测机器人对他们的视角集合完全相同。
反证法。反设机器人为 R={R1,R2,⋯,Rm},
两个不同的猎人集合 P={Pi,P2,⋯,Pn} 和 Q={Qi,Q2,⋯,Qn},
其中 m=2n+1。
对每个机器人 Rk,存在 n 排列 πk 使得从 Rk 看 Pi 与 Qπk(i) 视角相同,也即 RkPiQπk(i) 三点共线。
定义 Sij={k∈{1,⋯,m}:πk(i)=j},即与 PiQj 共线的机器人集合。
若 Pi=Qj,则所有 Sij 中的机器人都在直线 PiQj 上。由机器人中无三点共线得 ∣Sij∣≤2。
因点集 P 与点集 Q 不完全相同,不妨 P1∈/Q。
则集合族 {S11,S12,⋯,S1n} 构成了对下标集 {1,⋯,m} 的划分。
也即每个下标 k∈{1,⋯,m} 都恰好属于且仅属于一个集合 S1πk(1)。
故有:
m=j=1∑n∣S1j∣≤2n
矛盾!
整体算法
- 分块:
将整个森林区域分块,划分为若干直径小于 2d 的连通子区域 D1,D2,⋯,Ds。
- 探测猎人上界:
在每个子区域的中心处部署一名机器人并暴露,共计消耗 s 个机器人。区域 Di 机器人观测到不同方向的数量 ni 即为该区域猎人数上界。
从而整体上界为 n=∑i=1sni。
- 精确定位:
对每个子区域周围部署 mi≥2ni+1 名机器人,然后再在每个子区域的中心处部署一名机器人并暴露,共计消耗 s 个机器人。由引理知,每个区域可以完成精确定位,从而完成了所有猎人定位。
精确定位算法
对每个非空子区域 Di,已知其猎人数上界 ni≤n,且周围已部署 mi≥2ni+1 台无三点共线的观测机器人 R1,…,Rmi。
记第 k 台机器人观测到的无序方向集合为 Θk={θk,1,…,θk,tk}。
-
候选点生成:
对每对 (α,β)∈Θ1×Θ2,求解:
R1+t(cosαsinα)=R2+s(cosβsinβ),t,s>0
这是关于 (t,s) 的 2 阶线性系统:
(cosαsinα−cosβ−sinβ)(ts)=R2−R1
- 若 det=sin(β−α)=0 或 t≤0 或 s≤0,舍弃该对。
- 否则解出 (t,s),计算交点:
Xα,β=R1+t(cosαsinα)
对有效交点 Xα,β,验证是否位于所有机器人观测范围内:
∥Xα,β−Rk∥≤d,k=1,2,⋯,mi
剔除不满足距离约束的点。
进一步验证交点是否位于目标子区域 Di 内:
Xα,β∈Di
最终得到候选点集合:
C={Xα,β:(α,β)∈Θ1×Θ2,t,s>0,∥Xα,β−Rk∥≤d,Xα,β∈Di}
-
一致性筛选:
引入第三台机器人 R3。对每个 X∈C,计算其相对于 R3 的方位角:
ϕ3(X)=atan2(X−R3)
仅保留满足 ϕ3(X)∈Θ3 的点,记筛选后集合为 C′⊆C。
对 C′ 同上利用其余机器人 R4,…,Rmi 进行筛选,最终得到通过筛选的候选点集合 Pi∗。
-
唯一性输出:
由引理知,Pi∗ 恰好唯一地对应真实猎人集合。因此直接输出:
Pi=Pi∗
区域划分
不妨假设森林边界为矩形 [0,L]×[0,W],采用正方形网格,边长为 2d,则子区域数量为:
s=⌈2dL⌉×⌈2dW⌉=O(d2LW)
更一般地,最优划分方式为正六边形划分(
参见 Kershner, 1939
),此处为便于计算简化考虑。
复杂度
- 分块:O(s)
- 探测上界:O(s⋅nmax)
- 精确定位:O(i=1∑smini2)
由引理,精确定位阶段对每个子区域 Di 部署的观测机器人数量为:
mi=2ni+1
其中 ni 为该区域猎人数上界。因此:
i=1∑smini2=i=1∑s(2ni+1)ni2=O(i=1∑sni3)
设森林中猎人总数为 N。由 Hölder 不等式:
i=1∑sni3≤(imaxni)2⋅i=1∑sni=nmax2N
故整体时间复杂度为:
O(d2LW⋅nmax+nmax2N)
总消耗为:
2s=O(d2LW)
参考文献
Kershner, R. (1939). The Number of Circles Covering a Set. American Journal of Mathematics, 61(3), 665–671.