距离上次更新已经 2133 天了,文章内容可能已经过时。

课程主页:https://graphics.stanford.edu/courses/cs205a-13-fall/schedule.html

这次回顾作业6。

Problem 1

(备注,这题没有讲明,但是从后面的讨论中可以推出这里为无向图)

假设|V0|=m,并且

vi=vi0,i=nm+1,,n

B为邻接矩阵,即

Bij={1(i,j)E0

将其记为如下分块形式:

B=[B1B2B3B4]Rn×n

其中

B1R(nm)×(nm),B2R(nm)×m,B3Rm×(nm),B4Rm×m

1kRk表示全1k维列向量,假设

vi=[xi,yi]T

那么记

x=[x1xnm],y=[y1ynm]x=[xnm+1xn],y=[ynm+1yn]V1=[xy],V2=[xy]

(a)对能量式进行化简

E(v1,,vn)=(i,j)Evivj22=(i,j)E(viTvi2viTvj+vjTvj)

1knm,我们有

vkΛ=(k,j)E(2vk2vj)+(i,k)E(2vi+2vk)=2((k,j)Evk+(i,k)Evk(k,j)E1jnmvj(k,j)Enm+1jnvj(i,k)E1inmvi(i,k)Enm+1invi)

令上式为0得到

(k,j)Evk+(i,k)Evk(k,j)E1jnmvj(i,k)E1inmvi(k,j)Enm+1jnvj(i,k)Enm+1invi=0

写成矩阵形式为

([B1B2]+[B1B3]T)1nV1(B1+B1T)V1=(B2+B3T)V2(diag(([B1B2]+[B1B3]T)1n)(B1+B1T))V1=(B2+B3T)V2

A=diag(([B1B2]+[B1B3]T)1n)(B1+B1T)bx=(B2+B3T)xby=(B2+B3T)y

那么将上式写为分量形式得到

Ax=bxAy=by

最后验证A为对称正定矩阵,对称性显然,下证正定性,首先记

C1=[B1B2],C2=[B1B3]

y=(y1,,ynm)T,计算yTAy

yTAy=yT(diag((C1+C2T)1n)(B1+B1T))y=yT(C1+C2T)1nyyT(B1+B1T)y=i=1nmj=1n(Bij+Bji)yi2i=1nmj=1nm(Bij+Bji)yiyj

因为Bij{0,1},所以

i=1nmj=1nm(Bij+Bji)yiyj12i=1nmj=1nm(Bij+Bji)(yi2+yj2)=i=1nmj=1nm(Bij+Bji)yi2

因此

yTAy=i=1nmj=1n(Bij+Bji)yi2i=1nmj=1nm(Bij+Bji)yiyji=1nmj=1n(Bij+Bji)yi2i=1nmj=1nm(Bij+Bji)yi2=i=1nmj=nm+1n(Bij+Bji)yi20

当且仅当yi=0时等号成立,所以A对称正定。

(b)(i)将之前讨论的部分实现即可,代码如下

matlab
B = zeros(totalVertices);
[m, n] = size(edges);
for i = 1:m
    x = edges(i, 1);
    y = edges(i, 2);
    B(x, y) = 1;
    B(y, x) = 1;
end

B1 = B(unconstrainedVertices, unconstrainedVertices);
B2 = B(unconstrainedVertices, constrainedVertices);
B3 = B2';
B4 = B(constrainedVertices, constrainedVertices);

A = sparse(diag(([B1, B2] + [B1; B3]') * ones(totalVertices, 1)) - B1 - B1');
rhs = (B2 + B3') * constraints;

(ii)算法如下:

dk=bAxk1αk=dkTdkdkTAdkxk=xk1+αkdk

所以对应代码如下:

matlab
for i=1:maxIters
    % TODO:  Update curX
    d = rhs - A * curX;
    a1 = sum(d .* d, 1);
    a2 = diag(d' * A * d)';
    
    alpha = a1 / a2;
    curX = curX + alpha * d;
    
    
    % Display the current iterate
    curResult(unconstrainedVertices,:) = curX;
    plotGraph(curResult, edges, f);
    title(sprintf('Gradient descent iteration %d',i));
    drawnow;
    pause(.1);
end

(iii)算法如下:

Update search direction: vk=rk1rk1,vk1Avk1,vk1Avk1Line search: αk=vkrk1vkAvkUpdate estimate: xk=xk1+αkvkUpdate residual: rk=rk1αkAvk

代码如下:

matlab
%初始化
r = rhs - A * curX;
v = zeros(size(r)) + 1e-3;

for i=1:maxIters
    % TODO:  Update curX
    r1 = diag(r' * A * v)';
    v1 = diag(v' * A * v)';
    v = r - r1 ./ v1 .* v;
    alpha = diag(v' * r) ./ diag(v' * A * v);
    curX = curX + alpha' .* v;
    r = r - alpha' .* (A * v);

    % Display the current iterate
    curResult(unconstrainedVertices,:) = curX;
    plotGraph(curResult, edges, f);
    title(sprintf('Conjugate gradients iteration %d',i));
    drawnow;
    pause(.1);
end

(iv)共轭梯度法很快就收敛了。

Problem 2

(a)定义

(1)x=A1b(2)xk=M1(Nxk1+b)(3)ek=xkx

下面考虑ekek1的递推关系:

ek=xkx=M1(Nxk1+b)x=M1N(xk1+N1(bMx))

注意

A=MN

所以由(1)可得

Ax=(MN)x=bbMx=NxN1(bMx)=x

因此

ek=M1N(xk1+N1(bMx))=G(xk1x)=Gek1

递推可得

ek=Gke0

假设G的特征值为λ1,,λn,对应的特征向量为v1,,vn,记

V=(v1,,vn),Λ=diag{λ1,,λn}

题目假设v1,,vn张成Rn,那么

G=VΛV1Gk=VΛkV1

因为λi<1,所以

Λk0Gk=VΛkV10ek0

因此

xkx

(b)利用圆盘定理即可:

圆盘定理

假设ARn×nn阶矩阵,令

Ri=jin|aij|=|ai1|++|ai,i1|+|ai,i+1|++|ain|

那么A的特征值z在如下圆盘中

|zaii|Ri,i=1,2,,n

证明:任取A的特征值λ0,对应的特征向量为x,那么

Ax=λ0x

写成方程形式为

{a11x1+a12x2++a1nxn=λ0x1a21x1+a2zx2++a2nxn=λ0x2an1x1+an2x2++annxn=λ0xn

|xr|=max{|x1|,|x2|,,|xn|}

那么

(λ0arr)xr=ar1x1++ar,r1xr1+ar,r+1xr+1++arnxn

于是

|λ0arr||xr||ar1||xl|++|ar,r1||xr1|+|ar,r1||xr+1|++|arn||xn|=(|ar1|++|ar,r1|+|ar,r1|++|arn|)|xr|

|λ0arr||xr|Rr|xr|

但是显然|xr|>0,所以

|λ0arr|Rr

回到原题,我们有

Ri=j1n|gij|=|gi1|++|gi,i1|+|gi,i+1|++|gin|=1|aii|(|ai1|++|ai,i1|+|ai,i+1|++|ain|)<1

gii=0,所以G的特征值满足

|λ|<Ri<1

因此收敛。

Problem 3

如果

i=1naixi=0

左乘xkTA,k=1,,n可得

(1)i=1naixkTAxi=akxkTAxk+ikaixkTAxi=0

A正交的定义可得

xiTAxj=0,ij

所以(1)即为

ak(xkTAxk)=0

如果A正定,xk非零,那么

ak=0,k=1,,n

此时xi线性无关。

如果A半正定,那么因为xkTAxk可能为0,所以无法判断ak,即此时无法推出xi线性无关。