编程有限元方法

时间:2016-01-05 23:23:18

标签: matlab linear-algebra finite-element-analysis

我正在努力教自己如何使用有限元方法。

我的所有代码都改编自以下链接页面16-20 http://homepages.cae.wisc.edu/~suresh/ME964Website/M964Notes/Notes/introfem.pdf

我在Matlab中编程以对单个8节点立方体元素执行有限元分析。我已经定义了xi,eta,zeta局部轴(我们现在可以将其视为x,y,z),因此我得到以下形状函数:

%%shape functions

zeta = 0:.01:1;
eta = 0:.01:1;
xi = 0:.01:1;

N1 = 1/8*(1-xi).*(1-eta).*(1-zeta);
N2 = 1/8*(1+xi).*(1-eta).*(1-zeta);
N3 = 1/8*(1+xi).*(1+eta).*(1-zeta);
N4 = 1/8*(1-xi).*(1+eta).*(1-zeta);
N5 = 1/8*(1-xi).*(1-eta).*(1+zeta);
N6 = 1/8*(1+xi).*(1-eta).*(1+zeta);
N7 = 1/8*(1+xi).*(1+eta).*(1+zeta);
N8 = 1/8*(1-xi).*(1+eta).*(1+zeta);

根据我正在阅读的文字,[N]矩阵将按照这样安排:

%N Matrix
N= [N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8 0 0;
    0 N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8 0;
    0 0 N1 0 0 N2 0 0 N3 0 0 N4 0 0 N5 0 0 N6 0 0 N7 0 0 N8];

要查找[B]矩阵,我必须使用以下[D]矩阵:

%%Del Matrix for node i
%[  d/dx   0     0
%    0    d/dy   0
%    0     0    d/dz        . . .
%   d/dy  d/dx   0
%    0    d/dz  d/dy
%   d/dz   0    d/dx   ]

这是一个继续[N]的运营商。 (B=DN

稍后,如文字所示,我将进行涉及此[B]矩阵积分的计算。

所以,我的问题是,如何将这些多项式形状函数存储在矩阵中,对它们进行微分操作,然后用数字积分它们。我现在可以告诉我这个设置的方式,它不会工作,因为我已经将函数定义为区间[0,1]上的向量,然后将这些向量存储在[N]矩阵中。然后使用diff()函数进行适当区分以找到[B]矩阵。 但由于[B]的矩阵元素现在是区间[0,1]的向量,我认为这会导致问题。你们将如何进行我在上面发布的教科书中描述的这些计算?

4 个答案:

答案 0 :(得分:2)

使用匿名函数解决了我的问题并将多项式存储在符号矩阵中。例如:

syms xi eta zeta
N1= ... %type out in terms of xi eta and zeta
.
.
.
dN1dXi = diff(N1,xi) %symbolic differentiation with respect to xi

还可以在需要时执行符号集成:

intN1 = int(N1,xi,lowerLimit,upperLimit) %symbolic integration with respect to xi

当准备用实际值替换以评估符号函数时:

subs(N1,{xi,eta,zeta},{value1,value2,value3})

答案 1 :(得分:2)

您应该检查第24页有关如何从参数域([0,1] ^)映射到物理域的信息。

答案 2 :(得分:1)

虽然我认为你可以像你说的那样,使用象征性的。我认为Matlab中的符号计算非常耗时。

我会手动获取衍生N并存储为dN,并在需要时使用它。

此致

德国

答案 3 :(得分:0)

获得形状函数后,您需要将其替换到刚度矩阵中,刚度矩阵应为 24x24,因为您有 24 个自由度。要解决您需要构建一个线性系统 (Ax=b),右侧基于您正在解决的 PDE,您必须在右侧包含纽曼边界条件以及源项。在 python 中,二维元素(4 DOF)将类似于:

    def shapefxncoef (Valxy):
    #creating a temporary metrix to store zeros and get the size of the shape
    #function matrix.
    n_temp = np.zeros((4,4))
    #filling the values of the matrix with a loop.
    for i in range(4):
        #the values used in the matrix are from the Valxy x and y components.
        xi = Valxy [0, i];
        yi = Valxy [1, i];
        n_temp[i, 0] = 1;
        n_temp[i, 1] = xi;
        n_temp[i, 2] = yi;
        n_temp[i, 3] = xi*yi;
        #this gives an identity matrix and the stiffness matric can be derived 
        #if we take the inverse.
    n = np.linalg.inv(n_temp);
    return n;

def N (Valxy, x, y):
    n = shapefxncoef (Valxy);
    res = n[0, :] + n[1, :]*x + n[2, :]*y + n[3, :]*x*y;
    return res;

def Be (Valxy, x, y):
    res = np.zeros ((2,4));
    res_temp = shapefxncoef (Valxy);
    for i in range (4):
        res_tempi = res_temp[:, i];
        dNix = res_tempi[1] + res_tempi[3]*y;
        dNiy = res_tempi[2] + res_tempi[3]*x;
        res[0, i] = dNix;
        res[1, i] = dNiy;
    return res;

def Ke (Valxy, conduct):
    a = lambda x, y: conduct * np.dot ((Be(Valxy, x, y)).T, Be(Valxy, x, y));
    k = intr.integrateOnQuadrangle (Valxy.T, a, np.zeros((4,4)));
    return k;