首页/文章/ 详情

面向对象有限元编程|自定义求解器之共轭梯度法

8月前浏览5701

共轭梯度法是方程组求解的一种迭代方法。这种方法特别适合有限元求解,因为该方法要求系数矩阵为对称正定矩阵,而有限元平衡方程的系数矩阵正好是对称正定矩阵(考虑边界条件)。同时,共轭梯度法也适合并行计算。

  • 算法原理

对于方程组    ,假定    是对称正定矩阵,采用共轭梯度法算法步骤如下:取初始值    

这里    迭代持续进行,直到向量    的模达到一个较小的值,也就是误差允许范围之内。

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



    #向量点乘
    @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) )


以上是求解器类,保存在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#创建一个求解器的实例cls

x = cls.CGsolver() #调用共轭梯度法求解
print(x) 


以上是测试文件。

实际在有限元分析使用时,A就是刚度矩阵,b就是整体节点力向量。


来源:数值分析与有限元编程
pythonUM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:8月前
太白金星
本科 慢慢来
获赞 6粉丝 17文章 327课程 0
点赞
收藏
作者推荐

非线性 | 弧长法(Arc-Length Methods)

图1所示为弧长法求解过程,若以下标 表示第 个荷载步,上标 表示第 个荷载步下的第 次迭代,显然,当荷载增量 ,则迭代路径为一条水平直线,即为著名的牛顿-拉夫逊方法。对于图2所示的求解问题,牛顿-拉夫逊方法不能跨过极值点得到完整的荷载-位移曲线。因此,弧长法最重要的就是求荷载增量。而弧长法的荷载增量 是变化的,可自动控制荷载,这样在原方程组的基础之上又增加了一个未知数,因此需要额外补充一个方程。如图3所示,某一荷载步迭代至收敛时总有 考虑系统方程组 在迭代过程中, 逐渐趋于0,如果这两个值都为0,则说明该荷载步的迭代已收敛。在上一个迭代收敛点(如图1中的 )将 作一阶泰勒展开 即 令 , 则 弧长法通过自动建立适当的荷载增量进一步优化了牛顿-拉夫逊方法,使用弧长法,可以跟踪复杂的荷载-变形路径。来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈