僞代碼流程:
知道此時的殘差r,前面k次的搜索方向P,現在需要求的是第k次的搜索方向Pk;
有了,搜索方向Pk,下一步就改確定搜索步長了,求它的思想是使取得極值,即導數爲0。一旦求出了,則下一個迭代點也就求出了。表達式對求導爲0後可求得。
“””
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);
參考資料:
- https://en.wikipedia.org/wiki/Biconjugate_gradient_method
- https://www.cnblogs.com/tornadomeet/p/3265225.html