CS205A HW6
距离上次更新已经 2133 天了,文章内容可能已经过时。
课程主页:https://graphics.stanford.edu/courses/cs205a-13-fall/schedule.html
这次回顾作业6。
Problem 1
(备注,这题没有讲明,但是从后面的讨论中可以推出这里为无向图)
假设
记
将其记为如下分块形式:
其中
记
那么记
(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)算法如下:
所以对应代码如下:
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)算法如下:
代码如下:
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)可得
因此
递推可得
假设
题目假设
因为
因此
(b)利用圆盘定理即可:
圆盘定理
假设
那么
证明:任取
写成方程形式为
设
那么
于是
即
但是显然
回到原题,我们有
而
因此收敛。
Problem 3
如果
左乘
由
所以(1)即为
如果
此时
如果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Doraemonzzz!
评论
ValineLivere