首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象有限元编程|自定义求解器之共轭梯度法

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

作者头像
fem178
发布2021-03-09 15:13:06
8520
发布2021-03-09 15:13:06
举报

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

  • 算法原理

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

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

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( [ [5, 7, 6, 5],
                [7, 10, 8, 7],
                [6, 8, 10, 9],
                [5, 7, 9, 10] ] )

b = np.array( [62, 87, 91, 90] )
cls =  Modsolver.solver(A, b, 1e-4, 500) #创建一个求解器的实例cls

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

以上是测试文件。

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数值分析与有限元编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档