我目前正在练习MatLab问题,并且一直困扰于涉及桁架桥的问题。要求我以9的重量w9 = 13000开始增加到停在节点9处的卡车的重量,并增加到某个较大的重量,直到桥倒塌为止。每个光束可以承受20000牛顿的力(正或负)。因此,当任何一个力的大小大于20000时,桥梁将倒塌,或者当 所有力的绝对值的最大值都大于或等于20000。
我正在使用for循环遍历权重W9 = 13000.0、13000.1、13000.2,...。 。 。等等解决 对于桥内的力,系统Ax = b反复进行,直到至少一个梁上的力超过断裂点为止。我正在使用LU分解来有效地解决系统问题。
A = [-0.5 1 0 0 0 0 0 0 0 0.5 0 0 0 0 0;
-sqrt(3)/2 0 0 0 0 0 0 0 0 -sqrt(3)/2 0 0 0 0 0;
0 -1 1 0 0 0 0 0 0 0 -0.5 0.5 0 0 0;
0 0 0 0 0 0 0 0 0 0 -sqrt(3)/2 -sqrt(3)/2 0 0 0;
0 0 -1 1 0 0 0 0 0 0 0 0 -0.5 0.5 0;
0 0 0 0 0 0 0 0 0 0 0 0 -sqrt(3)/2 -sqrt(3)/2 0;
0 0 0 -1 0.5 0 0 0 0 0 0 0 0 0 -0.5;
0 0 0 0 -sqrt(3)/2 0 0 0 0 0 0 0 0 0 -sqrt(3)/2;
0 0 0 0 -0.5 -1 0 0 0 0 0 0 0 0 -0.5;
0 0 0 0 0 1 -1 0 0 0 0 0 0 -0.5 0.5;
0 0 0 0 0 0 0 0 0 0 0 0 0 sqrt(3)/2 sqrt(3)/2;
0 0 0 0 0 0 1 -1 0 0 0 -0.5 0.5 0 0;
0 0 0 0 0 0 0 0 0 0 0 sqrt(3)/2 sqrt(3)/2 0 0;
0 0 0 0 0 0 0 1 -1 -0.5 0.5 0 0 0 0;
0 0 0 0 0 0 0 0 0 sqrt(3)/2 sqrt(3)/2 0 0 0 0];
w7 = 800;
w8 = 900;
w9 = 13000;
W = [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; w7; 0; w8; 0; w9];
for kk = w9:0.1:20000
for jj = 1:15
[L,U,P] = lu(A);
Y = L\(P*W);
X = U\Y;
if abs(X(jj,1)) > 20000
break
end
end
end
save('A.dat','w9','-ascii')
save('B.dat','X','-ascii')
当我运行它时,w9完全没有变化,我得到了相同的向量X。我期望它在循环实际中断之前会迭代一段时间,但最终却没有这样做。谁能帮我解决这个问题?
答案 0 :(得分:0)
您需要在w9
或其他相关位置添加额外的“权重”,然后重新定义W
。否则循环中没有任何变化...
由于您不需要内部循环,因此我对代码进行了一些优化。
最后,您需要运行到更高的w9
。您的条件要到w9 = 22228
才能满足。
w7 = 800;
w8 = 900;
w9_initial = 13000;
for w9 = w9_initial:0.1:25000
% Define W with the increased w9
W = [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; w7; 0; w8; 0; w9];
% Calculate. These calculations aren't dependent on jj, so no point having a loop
[L,U,P] = lu(A);
Y = L\(P*W);
X = U\Y;
if any( abs( X ) > 20000 )
break
end
end