共轭梯度下降法主要用于解线性方程组和二次优化问题
A-共轭的定义及其性质
第一条性质利用线性无关的定义很容易得到,第二条性质也就是如下的定理
ppt中的
α
k
\alpha_k
αk可以由表达式
α
k
=
arg
min
α
k
ϕ
(
x
k
+
α
k
p
k
)
\alpha_k = \arg\min\limits_{\alpha_k} \phi(x_k+\alpha_kp_k)
αk=argαkminϕ(xk+αkpk)计算得到,定理的证明如下:
n个基的确定方法,由这种方法得到的各个基两两共轭
CG算法描述1:
一些性质
利用这些性质可以推出CG算法一个等价描述:
迭代次数最大不超过A的无重复特征值个数
利用这个定理可以改进CG算法得到PCG算法
PCG算法描述
Homework
PCG算法实战(homework)
import numpy as np
MAX = 1000
PRECISION = 1e-6
class Function:
def __init__(self,mat,vec):
self.mat = mat
self.vec = vec
self.dim = len(mat)
def grid(self,x):
return np.dot(self.mat,x) - self.vec
def __call__(self, x):
return (1/2)*x.T.dot(self.mat).dot(x) - self.vec.T.dot(x)
def min(f):
x = np.zeros((f.dim,1))
r = f.grid(x)
y = (1/10)*r
p = -y
number = 0
while number<MAX:
a = (r.T.dot(y))/(p.T.dot(f.mat).dot(p))
x1 = x + a*p
r1 = f.grid(x1)
y1 = (1/10)*r1
b = (r1.T.dot(y1))/(r.T.dot(y))
p = -y1 + b*p
if abs(f(x1) - f(x)) < PRECISION:
break
else:
x, y, r =x1, y1, r1
number += 1
return number,f(x)
def create_coefficient(dim):
b = np.ones((dim,1))
A = np.array([[1/(i+j+1) for j in range(dim)] for i in range(dim)])
return A,b
if __name__ =='__main__':
A, b = create_coefficient(5)
print(min(Function(A, b)))
A, b = create_coefficient(8)
print(min(Function(A, b)))
A, b = create_coefficient(12)
print(min(Function(A, b)))
A, b = create_coefficient(20)
print(min(Function(A, b)))
计算结果
(5, array([[-12.49999988]]))
(19, array([[-31.99999995]]))
(20, array([[-48.44638437]]))
(11, array([[-59.08143301]]))