for文でループさせ​て得た結果を足し合わ​せた結果を得たい

44 次查看(过去 30 天)
Keito Yaginuma
Keito Yaginuma 2018-6-27
下記がプログラムとなっております。 for文でループさせて「gk」と呼ばれるものに値をいれています。
function GK_20180627()
t = 0.08;
E = 21.8;
v = 0.87;
X = [0,0,2,2];
Y = [0,2,2,0];
node = [1,2,3;4,3,2];
d = zeros(3,3);
d(1,1) = 1-v;
d(1,2) = v;
d(2,1) = v;
d(2,2) = 1-v;
d(3,3) = (1-2*v)/2;
d = d*E/((1-2*v)*(1+v));
for ne = 1:2
i = node(ne,1);
j = node(ne,2);
k = node(ne,3);
Delta = X(j) * Y(k) + X(k) * Y(i)...
+ X(i) * Y(j) - X(j) * Y(i)...
- X(i) * Y(k) - X(k) * Y(j);
area = 0.5*Delta;
bm = [Y(j)-Y(k), 0,Y(k)-Y(i), 0,Y(i)-Y(j), 0;...
0,X(k)-X(j), 0,X(i)-X(k), 0,X(j)-X(i);...
X(k)-X(j),Y(j)-Y(k),X(i)-X(k),Y(k)-Y(i),X(j)-X(i),Y(i)-Y(j)]/Delta;
sm = bm'*d*bm*t*area;
gk = zeros(8,8);
ir = zeros(1,6);
ir(6) = 2*k;
ir(5) = ir(6)-1;
ir(4) = 2*j;
ir(3) = ir(4)-1;
ir(2) = 2*i;
ir(1) = ir(2)-1;
for i = 1:6
it = ir(i);
for j = 1:6
jt = ir(j);
gk(it,jt) = gk(it,jt) + sm(i,j);
end
end
disp(gk)
end
end
gkの結果↓
-0.2332 0 0.2332 -0.2332 0 0.2332 0 0
0 0.0819 0.5482 -0.0819 -0.5482 0 0 0
0.2332 0.5482 -0.1512 -0.3151 -0.0819 -0.2332 0 0
-0.2332 -0.0819 -0.3151 -0.1512 0.5482 0.2332 0 0
0 -0.5482 -0.0819 0.5482 0.0819 0 0 0
0.2332 0 -0.2332 0.2332 0 -0.2332 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 -0.0819 0 0.0819 0.5482 0 -0.5482
0 0 0 0.2332 -0.2332 -0.2332 0.2332 0
0 0 0.0819 -0.2332 0.1512 -0.3151 -0.2332 0.5482
0 0 0.5482 -0.2332 -0.3151 0.1512 -0.2332 0.0819
0 0 0 0.2332 -0.2332 -0.2332 0.2332 0
0 0 -0.5482 0 0.5482 0.0819 0 -0.0819
この二つの行列を足し合わせて以下のような値を出力したいと考えています。
-0.2332 0 0.2332 -0.2332 0 0.2332 0 0
0 0.0819 0.5482 -0.0819 -0.5482 0 0 0
0.2332 0.5482 -0.2331 -0.3151 0 0.3150 0 -0.5482
-0.2332 -0.0819 -0.3151 0.0820 0.3150 0 0.2332 0
0 -0.5482 0 0.3150 0.2331 -0.3151 -0.2332 0.5482
0.2332 0 0.3150 0 -0.3151 -0.0820 -0.2332 0.0819
0 0 0 0.2332 -0.2332 -0.2332 0.2332 0
0 0 -0.5482 0 0.5482 0.0819 0 -0.0819
宜しくお願いします。
  1 个评论
michio
michio 2018-6-27
コード部分の表示方法だけ変更いたしました。

请先登录,再进行评论。

采纳的回答

Ma
Ma 2018-6-28
以下のようにすれば大丈夫です。変更点は、(1)gk1という行列をneに関するループの前で定義し、(2)ループ内で計算したgkをgk1に足していっているだけです。この結果、gk1に御望みの結果が保存されています。
function GK_20180627()
t = 0.08;
E = 21.8;
v = 0.87;
X = [0,0,2,2];
Y = [0,2,2,0];
node = [1,2,3;4,3,2];
d = zeros(3,3);
d(1,1) = 1-v;
d(1,2) = v;
d(2,1) = v;
d(2,2) = 1-v;
d(3,3) = (1-2*v)/2;
d = d*E/((1-2*v)*(1+v));
gk1=zeros(8,8);
for ne = 1:2
i = node(ne,1);
j = node(ne,2);
k = node(ne,3);
Delta = X(j) * Y(k) + X(k) * Y(i)...
+ X(i) * Y(j) - X(j) * Y(i)...
- X(i) * Y(k) - X(k) * Y(j);
area = 0.5*Delta;
bm = [Y(j)-Y(k), 0,Y(k)-Y(i), 0,Y(i)-Y(j), 0;...
0,X(k)-X(j), 0,X(i)-X(k), 0,X(j)-X(i);...
X(k)-X(j),Y(j)-Y(k),X(i)-X(k),Y(k)-Y(i),X(j)-X(i),Y(i)-Y(j)]/Delta;
sm = bm'*d*bm*t*area;
gk = zeros(8,8);
ir = zeros(1,6);
ir(6) = 2*k;
ir(5) = ir(6)-1;
ir(4) = 2*j;
ir(3) = ir(4)-1;
ir(2) = 2*i;
ir(1) = ir(2)-1;
for i = 1:6
it = ir(i);
for j = 1:6
jt = ir(j);
gk(it,jt) = gk(it,jt) + sm(i,j);
end
end
disp(gk)
gk1=gk+gk1;
end
end
  1 个评论
Keito Yaginuma
Keito Yaginuma 2018-6-28
ありがとうございます。 forループの回数が2回以上になっても、計算されていました。感謝します:)

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 ループと条件付きステートメント 的更多信息

产品

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!