如何遍历多个LU分解,用不同的b向量求解Ax = b?

时间:2019-01-23 20:40:07

标签: matlab

我目前正在练习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。我期望它在循环实际中断之前会迭代一段时间,但最终却没有这样做。谁能帮我解决这个问题?

1 个答案:

答案 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