2次元弾性問題を有限要素法で解く

うまくいってないっぽい

function simple_elastic
clear all; close all;
format compact;
global np, global ne; global nf; global nb;
global nodes; global elems; global loads; global bounds;
global material;

params_simple;
load simpledata;

np = size(nodes,1);
ne = size(elems,1);
nb = size(bounds,1);
nf = size(loads,1);

hold on;
drawPlane();
global Tk; Tk = zeros(np*2,np*2);
makeTk();
loadBoundaryCondition();
global f; f = zeros(np*2,1);
loadForce();
Tk
f
u=Tk\f;
u
drawDisplacedPlane();
% computeStress();

    function drawPlane()
        for idx=1:ne
            start = elems(idx,1);
            middle = elems(idx,2);
            stop = elems(idx,3);
            startX=nodes(start,1);
            startY=nodes(start,2);
            middleX=nodes(middle,1);
            middleY=nodes(middle,2);
            stopX=nodes(stop,1);
            stopY=nodes(stop,2);
            plot([startX middleX],[startY middleY],'b-');
            plot([middleX stopX],[middleY stopY],'b-');
            plot([stopX startX],[stopY startY],'b-');
        end
    end

    function A=makeA(start,middle,stop)
        startX=nodes(start,1);
        startY=nodes(start,2);
        middleX=nodes(middle,1);
        middleY=nodes(middle,2);
        stopX=nodes(stop,1);
        stopY=nodes(stop,2);
        A = 1/2*det([
            1 startX  startY
            1 middleX middleY
            1 stopX   stopY
            ]);
    end

    function K=computeStiffness(start,middle,stop,material_idx)
        t = material(material_idx,3);
        A = makeA(start,middle,stop);        
        E = material(material_idx,1);
        v = material(material_idx,2);
        startX=nodes(start,1);
        startY=nodes(start,2);
        middleX=nodes(middle,1);
        middleY=nodes(middle,2);
        stopX=nodes(stop,1);
        stopY=nodes(stop,2);        
        D = E/(1-v^2)*[
                1 v 0
                v 1 0
                0 0 (1-v)/2
        ];
        B = 1/(2*A) * [
            middleY-stopY       0       stopY-startY       0      startY-middleY      0    
                  0       stopX-middleX       0      startX-stopX        0       middleX-startX
            stopX-middleX middleY-stopY startX-stopX stopY-startY middleX-startX startY-middleY
        ];
        K = A*t*B'*D*B;
    end


    function makeTk()
        for idx=1:ne
            start  = elems(idx,1);
            middle = elems(idx,2);
            stop   = elems(idx,3);
            material_idx = elems(idx,4);
            K=computeStiffness(start,middle,stop,material_idx);            
            ll=[2*start-1 2*start 2*middle-1 2*middle 2*stop-1 2*stop];
            for ie=1:6
                for je=1:6
                    Tk(ll(ie),ll(je)) = Tk(ll(ie),ll(je)) + K(ie,je);
                end
            end
        end
    end

    function loadBoundaryCondition()
        for idx=1:nb
            node_idx = bounds(idx,1);
            xFix = bounds(idx,2);
            xFixIdx = 2*node_idx - 1;
            yFix = bounds(idx,4);
            yFixIdx = 2*node_idx;
            if(xFix==1)
                Tk(xFixIdx,:) = 0;
                Tk(:,xFixIdx) = 0;
                Tk(xFixIdx,xFixIdx) = 1;
            end
            if(yFix==1)
                Tk(yFixIdx,:) = 0;
                Tk(:,yFixIdx) = 0;
                Tk(yFixIdx,yFixIdx) = 1;
            end
        end
    end

    function loadForce()
          for idx=1:nf
             node_idx = loads(idx,1);
             xIdx = 2*node_idx;
             xForce = loads(idx,2);
             yIdx = 2*node_idx-1;
             yForce = loads(idx,3);
             f(xIdx) = xForce;
             f(yIdx) = yForce;
          end
    end


    function drawDisplacedPlane()
        nodes_dash = nodes;
        for idx=1:np            
            xidx = 2*idx-1;
            yidx = 2*idx;
            xmove = u(xidx);
            ymove = u(yidx);
            nodes_dash(idx,1) = nodes_dash(idx,1) + xmove;
            nodes_dash(idx,2) = nodes_dash(idx,2) + ymove;
        end        
        
        for idx=1:ne
            start = elems(idx,1);
            middle = elems(idx,2);
            stop = elems(idx,3);
            startX=nodes_dash(start,1);
            startY=nodes_dash(start,2);
            middleX=nodes_dash(middle,1);
            middleY=nodes_dash(middle,2);
            stopX=nodes_dash(stop,1);
            stopY=nodes_dash(stop,2);                                    
            plot([startX middleX],[startY middleY],'r--');
            plot([middleX stopX],[middleY stopY],'r--');
            plot([stopX startX],[stopY startY],'r--');
        end                   
    end

end
function params_simple

nodes = [
    0.0,0.0
    100.0,0.0
    0.0,100.0
    100.0,100.0
    ];

material =[
    206.0e3, 0.3, 2.0
    ];

elems = [
   1,2,3,1
   2,4,3,1
];

bounds = [
    1,1,0.0,1,0.0
    3,1,0.0,0,0.0
];

loads = [
    2,196000.0,0.0
    4,196000.0,0.0
];

save simpledata;

end
Tk =
  Columns 1 through 6
            1            0            0            0            0            0
            0            1            0            0            0            0
            0            0    3.056e+05            0            0   1.4714e+05
            0            0            0    3.056e+05            0            0
            0            0            0            0            1            0
            0            0   1.4714e+05            0            0    3.056e+05
            0            0       -79231       -67912            0       -79231
            0            0       -79231  -2.2637e+05            0       -79231
  Columns 7 through 8
            0            0
            0            0
       -79231       -79231
       -67912  -2.2637e+05
            0            0
       -79231       -79231
    3.056e+05   1.4714e+05
   1.4714e+05    3.056e+05
f =
           0
           0
           0
      196000
           0
           0
           0
      196000
u =
            0
            0
      0.49119
       3.1232
            0
      0.49119
     -0.77663
       3.5834
>>