Matlab - 刚度法的子矩阵

时间:2014-11-28 02:22:12

标签: matlab matrix

为了使用桁架的刚度方法,我需要从一个大的全局刚度矩阵中提取某些元素。

假设我有一个9 x 9矩阵K代表一个三人桁架。这意味着前3行和列对应于第一节点,第二组三行和列对应第二节点,第三组对应第三节点。在代码中是向量zDisp,它对应于零位移的每个节点。在纸面上,节点的零位移意味着您将跨越与该位移对应的行和列,从而使您更小,更容易使用K矩阵。因此,如果第一个和第三个节点具有零位移,则将留下对应于中间三行和中间三列的交集的3 x 3矩阵。

我以为我可以用这样的函数一次完成这个节点:

function [ B ] = deleteNode( B, node )
%deleteNode removes the corresponding rows and vectors to a node that has
% zero deflection from the global stiffness matrix

% --- Problem line - this gets the first location in the matrix corresponding to the node
start = 3*node- 2;

  for i = 0 : 2
    B(start+i,:) = [];
    B(:,start+i) = [];
  end
end

所以我的主要项目会像

% Zero displacement nodes
zDisp  = [1;
          3;
         ];

% --- Create 9 x 9 global matrix Kg ---

% Make a copy of the global matrix
S = Kg;

for(i = 1 : length(zDisp))
   S = deleteNode(S, zDisp(i));
end

这不起作用,因为一旦循环对节点1执行并删除前3行和列,函数中的问题行不再能够在较小的矩阵中找到正确的位置来查找节点。

所以我认为这一步需要一次性执行。我想我可能需要输入哪些节点不是零位移,并创建一个基于此的子矩阵。关于这个的任何提示?一直想着它。谢谢大家。

1 个答案:

答案 0 :(得分:-1)

在您的示例中,您要删除行/列1,2,3,7,8和9,因此如果zDisp=[1;3]

remCols=bsxfun(@plus,1:3,3*(zDisp-1))

如果我理解正确,您应该首先删除zDisp给出的列:

S(remCols(:),:)=[]

然后删除行:

S(:,remCols(:))=[]