Numerical analysis 共轭梯度法 python 实现

//img-blog.csdnimg.cn/20200409113738372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM4NjYyOTMw,size_16,color_FFFFFF,t_70)

from numpy import *
import numpy
import numpy as np

def f(A,x,b):
    return 0.5*np.dot(np.dot(x,A),x)+np.dot(b,x)
def  g(A,x,b):
    return np.dot(A,x)+b
#
def minimize_cg(A,b, x0, jac=None,gtol=1e-5,maxiter=None,disp=False):
    """
    Minimization of scalar function of one or more variables using the
    conjugate gradient algorithm.

    Options
    -------
    disp : bool
        Set to True to print convergence messages.
    maxiter : int
        Maximum number of iterations to perform.
    gtol : float
        Gradient norm must be less than `gtol` before successful
        termination.
    norm : float
        Order of norm (Inf is max, -Inf is min).

    """
    if maxiter is None:
        maxiter = len(x0) * 200
    gfk = np.dot(A, x0) + b
    k = 0
    xk = x0
    warnflag = 0
    pk = -gfk

    gnorm = numpy.amax(numpy.abs(gfk))
    while (gnorm > gtol) and (k < maxiter):
        deltak = numpy.dot(gfk, gfk)
        alpha_k = -np.dot(gfk, pk) / (np.dot(np.dot(pk,A.T ),pk))
        xk = xk + alpha_k * pk
        gfkp1=np.dot(A, xk) + b
        beta_k = max(0, numpy.dot(gfkp1, gfkp1) / deltak)
        pk = -gfkp1 + beta_k * pk
        gfk = gfkp1
        gnorm=numpy.amax(numpy.abs(gfk))//最大值作为范数
        k += 1
    if warnflag == 0:
        # msg = _status_message['success']
        if disp:
            print('success')
            print("         Current function value: " , xk )
            print("         Iterations: %d" % k)
            print("         Function evaluations: " , f(A,xk,b))
            print("         actual value x*: ",-np.dot(np.linalg.inv(A),b))
            print("         actual function value f(x*): ",f(A,-np.dot(np.linalg.inv(A),b),b))

if __name__ == '__main__':
    x0 = [2, 1]
    A=np.array([[4,1],[1,3]])
    b=[-1,-2]
    g0=g(A,x0,b)
    minimize_cg(A,b,x0,g0,disp=True,maxiter=100)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值