BICG算法

僞代碼流程:
在這裏插入圖片描述
知道此時的殘差r,前面k次的搜索方向P,現在需要求的是第k次的搜索方向Pk;
有了 Xk\ X_k,搜索方向Pk,下一步就改確定搜索步長了,求它的思想是使取得極值,即導數爲0。一旦求出了,則下一個迭代點也就求出了。表達式對求導爲0後可求得αk\alpha_k

   “””
    bicg算法求解
    Input variables:
    b -- the problem to be solved is A * x = b.

    Keyword variables:
    x -- initial guess of x, default value is 0.
    r -- 殘差矢量
    p -- 搜索方向序列
    alpha -- 步長
    conj(r) -- 複數的共軛
    dot -- 點積
    
    rho_step  --rho_step(alpha, p, r, v, x) updates r and x, and returns 
    	rho and the error.  Specifically, rho_step performs:
            x = x + alpha * p
            r = r - alpha * v
            rho_(k+1) = (r dot r)
            err = (conj(r) dot r)
    alpha_step -- alpha_step(rho_k, rho_(k-1), p, r, v) updates p and v, and 
        returns alpha. Specifically, alpha_step performs:
            p = r + (rho_k / rho_(k-1)) * p
            v = A * p
            alpha = rho_k / (p dot v)
            
    zeros -- zeros() creates a zero-initialized vector. 
    err_thresh -- the relative error threshold, default 1e-6.
    max_iters -- maximum number of iterations allowed, default 1000.
    reporter -- function to report progress.

    Output variables:
    x -- the approximate answer of A * x = b.
    err -- a numpy array with the error value at every iteration.
    success -- True if convergence was successful, False otherwise.
  “”“

示意圖
optimal step size (in green) and conjugate vector (in red),
在這裏插入圖片描述

C++ 模板引擎:
ctemplate大體上分爲兩個部分,一部分是模板,另一部分是數據字典。模板定義了界面展現的形式(V),數據字典就是填充模板的數據(M),你自己寫業務邏輯去控制界面展現(C),典型的MVC模型。

  • 變量,{{變量名}},用兩個大括號包含的就是變量名,在c++代碼中,可以對變量賦值,任何類型的值都可以(如字符,整數,日期等)。
    Ctemplate 的介紹
    源代碼

C調用Python的類及方法

->第一步是導入.py文件:

使用PyObject* pModule來存儲導入的.py文件模塊, 調用的方法是PyImport_ImportModule(path):  PyObject* pModule = PyImport_ImportModule("testpy"); 
使用PyObject* pDict來存儲導入模塊中的方法字典, 調用的方法是PyModule_GetDict(module):  PyObject* pDict = PyModule_GetDict(pModule); 
這樣就完成了.py文件的導入.

->第二步是導入已導入模塊中的方法或類:

獲取方法, 調用的方法是PyDict_GetItemString(dict, methodName): PyObject* pFunHi = PyDict_GetItemString(pDict, "sayhi"); 
獲取類, 調用的方法同上, 注意紅體部分的字符串對應於.py文件中的類/方法名:  PyObject* pClassSecond = PyDict_GetItemString(pDict,"Second"); 

->第三步是使用導入的方法或類:

使用方法, 調用PyObject_CallFunction(pFunc, "s", args)即可:  PyObject_CallFunction(pFunHi, "s", "lhb"); 
使用類構造對象, 調用PyInstance_New(pClass, NULL, NULL)即可:  PyObject* pInstanceSecond = PyInstance_New(pClassSecond, NULL, NULL); , 注意其中的pClassSecond爲第二步.2中獲取的類指針
使用類對象的方法, 調用PyObject_CallMethod(pInstance, methodname, "O", args)即可:  PyObject_CallMethod(pInstanceSecond,"invoke", "O", pInstancePerson); 

步驟
代碼demo


參考資料:

  1. https://en.wikipedia.org/wiki/Biconjugate_gradient_method
  2. https://www.cnblogs.com/tornadomeet/p/3265225.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章