Filter löschen
Filter löschen

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

49 Ansichten (letzte 30 Tage)
Keito Yaginuma
Keito Yaginuma am 27 Jun. 2018
Kommentiert: Keito Yaginuma am 28 Jun. 2018
下記がプログラムとなっております。 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 Kommentar
michio
michio am 27 Jun. 2018
コード部分の表示方法だけ変更いたしました。

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Ma
Ma am 28 Jun. 2018
以下のようにすれば大丈夫です。変更点は、(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 Kommentar
Keito Yaginuma
Keito Yaginuma am 28 Jun. 2018
ありがとうございます。 forループの回数が2回以上になっても、計算されていました。感謝します:)

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu ループと条件付きステートメント finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!