面向?qū)ο笥邢拊幊蘾自定義求解器之共軛梯度法

共軛梯度法是方程組求解的一種迭代方法。這種方法特別適合有限元求解,因?yàn)樵摲椒ㄒ笙禂?shù)矩陣為對(duì)稱正定矩陣,而有限元平衡方程的系數(shù)矩陣正好是對(duì)稱正定矩陣(考慮邊界條件)。同時(shí),共軛梯度法也適合并行計(jì)算。

  • 算法原理

對(duì)于方程組 ,假定 是對(duì)稱正定矩陣,采用共軛梯度法算法步驟如下:取初始值

面向?qū)ο笥邢拊幊蘾自定義求解器之共軛梯度法的圖1

這里 迭代持續(xù)進(jìn)行,直到向量 的模達(dá)到一個(gè)較小的值,也就是誤差允許范圍之內(nèi)。

python代碼如下:

import math
import numpy as np

class solver:
    def __init__(self, A, b, eps, max_iter):
        self.A = A
        self.b = b
        self.eps = eps
        self.max_iter = max_iter

    def CGsolver (self):
        iter = 0

        x0 = 0.
        g0 = -self.b
        r0 = self.b
        err  = 1e6

        while ( err > self.eps and iter < self.max_iter ):
            tmp1 = self.vec_dot(g0, g0)
            err = math.fabs(tmp1)
            tmp_row = np.dot(self.A, r0)
            tmp2 = self.vec_dot(tmp_row, r0)
            alpha = tmp1 / tmp2
            x1 = x0 + alpha * r0
            g1 = g0 + alpha * tmp_row
            tmp3 = self.vec_dot(g1, g1)
            beta = tmp3 / tmp1
            r1 = -g1 + beta * r0

            x0 = x1
            r0 = r1
            g0 = g1

            iter += 1

        return x1



    #向量點(diǎn)乘
    @staticmethod
    def vec_dot(v1, v2):
        assert len(v1) == len(v2), 'Length of vectors must be same'
        return sum( a * b for a, b in zip(v1, v2) )


以上是求解器類(lèi),保存在Modsolver.py文件中。


import numpy as np
import Modsolver


A = np.array( [ [5765],
                [71087],
                [68109],
                [57910] ] )

b = np.array( [62879190] )
cls =  Modsolver.solver(A, b, 1e-4500#創(chuàng)建一個(gè)求解器的實(shí)例cls

x = cls.CGsolver() #調(diào)用共軛梯度法求解
print(x) 


以上是測(cè)試文件。

實(shí)際在有限元分析使用時(shí),A就是剛度矩陣,b就是整體節(jié)點(diǎn)力向量。

登錄后免費(fèi)查看全文
立即登錄
App下載
技術(shù)鄰APP
工程師必備
  • 項(xiàng)目客服
  • 培訓(xùn)客服
  • 平臺(tái)客服

TOP

2
1