首页 > 解决方案 > 如何使用 Eigen 求解具有 Neumann 型边界条件的方程组?

问题描述

我正在尝试为结构问题编写一个小型 FEM 求解器。我正在用 C++ 编写它并使用Eigen进行矩阵运算。我正在尝试解决问题 Ka=f,其中 K 是稀疏的 n×n 矩阵,f 是稀疏的 1×n 向量。我想在解决方案 a 上应用 Neumann 型边界条件。

如何使用 Eigen 实现这一目标?还是我对这个问题的看法完全错误?

我无法产生我想要实现的 MWE,但这里有一个骨架 MWE:

#include <iostream>
#include <Eigen/Sparse>
int main(int argc, char const *argv[])
{
    // K is supposed to be positive definite
    Eigen::SparseMatrix<float> K;
    Eigen::SparseMatrix<float> f;
    Eigen::SparseMatrix<float> a;
    K.resize(6,6);
    f.resize(6,1);
    // fill them with some arbitrary numbers...
    K.coeffRef(0,0)=127700;K.coeffRef(0,1)=127700;K.coeffRef(0,2)=127700;K.coeffRef(0,3)=127700;K.coeffRef(0,4)=127700;K.coeffRef(0,5)=127700;
    K.coeffRef(1,0)=127700;K.coeffRef(1,1)=39179.1;K.coeffRef(1,2)=-107963;K.coeffRef(1,3)=-294.578;K.coeffRef(1,4)=-19736.8;K.coeffRef(1,5)=-38884.5;
    K.coeffRef(2,0)=127700;K.coeffRef(2,1)=-107963;K.coeffRef(2,2)=-19736.8;K.coeffRef(2,3)=39179.1;K.coeffRef(2,4)=294.578;K.coeffRef(2,5)=-39473.7;
    K.coeffRef(3,0)=127700;K.coeffRef(3,1)=-294.578;K.coeffRef(3,2)=39179.1;K.coeffRef(3,3)=-10015.7;K.coeffRef(3,4)=-107963;K.coeffRef(3,5)=-39179.1;
    K.coeffRef(4,0)=127700;K.coeffRef(4,1)=-19736.8;K.coeffRef(4,2)=294.578;K.coeffRef(4,3)=-107963;K.coeffRef(4,4)=-19736.8;K.coeffRef(4,5)=-39179.1;
    K.coeffRef(5,0)=127700;K.coeffRef(5,1)=-38884.5;K.coeffRef(5,2)=-39473.7;K.coeffRef(5,3)=-39179.1;K.coeffRef(5,4)=-39179.1;K.coeffRef(5,5)=-39473.7;
    f.coeffRef(5,0)=1.0f;
    Eigen::SimplicialLDLT<Eigen::SparseMatrix<float>> solver;
    solver.compute(K);
    // How to apply boundary conditions on specific values on a?
    a = solver.solve(f);
    return 0;
}

标签: c++linear-algebraeigen

解决方案


推荐阅读