├── .gitignore ├── bucklingStrength.m ├── solveTruss.m ├── computeTrussCost.m ├── printHeader.m ├── weakestMember.m ├── maxLoad.m ├── memberDistances.m ├── printForce.m ├── truss_data_1.m ├── warren.m ├── franken.m ├── franken.out ├── sample.out ├── warren.out ├── computeA.m ├── pratt.out ├── pratt2.out ├── pratt.m ├── pratt2.m └── truss_solver.m /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | *.*~ 3 | -------------------------------------------------------------------------------- /bucklingStrength.m: -------------------------------------------------------------------------------- 1 | function [ s ] = bucklingStrength( l ) 2 | s = 369.9./(abs(l).^1.465); 3 | end -------------------------------------------------------------------------------- /solveTruss.m: -------------------------------------------------------------------------------- 1 | function [ T ] = solveTruss( C, Sx, Sy, X, Y, L ) 2 | A = computeA(C, X, Y, Sx, Sy); 3 | T = A\(-L); 4 | end -------------------------------------------------------------------------------- /computeTrussCost.m: -------------------------------------------------------------------------------- 1 | function [ cost ] = computeTrussCost( C, D ) 2 | cost = 0; 3 | [ j, ~ ] = size(C); 4 | cost = cost + 10*j + sum(D); 5 | end 6 | -------------------------------------------------------------------------------- /printHeader.m: -------------------------------------------------------------------------------- 1 | function [] = printHeader() 2 | fprintf('%% EK301, Section A1, Group 7, Team GNU, 4/09/12\n'); 3 | fprintf('%% Michael Abed, ID U55178419\n'); 4 | fprintf('%% Joseph Stone, ID U44434740\n'); 5 | fprintf('%% Ben Havey, ID U46525972 \n'); 6 | 7 | end 8 | -------------------------------------------------------------------------------- /weakestMember.m: -------------------------------------------------------------------------------- 1 | function [ idx ] = weakestMember(D, T) 2 | unit = T(1:length(T)-3)/norm(T(1:length(T)-3)); 3 | resist = breaking(D); 4 | p = unit ./ resist; 5 | p(p > 0) = 0; 6 | 7 | a = 1:length(D); 8 | [~,i ] = max(abs(p)); 9 | idx = a(i); 10 | end 11 | 12 | function [ F ] = breaking(L) 13 | F = 369.9 ./ (abs(L) .^ 1.465); 14 | end -------------------------------------------------------------------------------- /maxLoad.m: -------------------------------------------------------------------------------- 1 | function [ m ] = maxLoad(T, L, D, idx, weak) 2 | D = D;% - 0.6; 3 | L1 = abs(L(L ~= 0)); 4 | T1 = abs(T(idx)); 5 | ml = D(idx); 6 | B = breaking(ml); 7 | if weak 8 | B = B - 1.0837; 9 | end 10 | ratio = T1/B; 11 | m = L1 / ratio; 12 | end 13 | 14 | function [ F ] = breaking(L) 15 | F = 369.9./(abs(L).^1.465); 16 | end -------------------------------------------------------------------------------- /memberDistances.m: -------------------------------------------------------------------------------- 1 | function [ D ] = memberDistances(C, X, Y) 2 | [ ~, m] = size(C); 3 | D = zeros(m,1); 4 | for i = 1:m 5 | memb = C(:,i); 6 | points = [X(memb == 1); Y(memb == 1)]; 7 | D(i) = dist(points(:,1), points(:,2)); 8 | end 9 | %D = D - 0.6; 10 | 11 | end 12 | 13 | 14 | function [ d ] = dist(p1, p2) 15 | d = sqrt((p1(1)-p2(1))^2+(p1(2)-p2(2))^2); 16 | end -------------------------------------------------------------------------------- /printForce.m: -------------------------------------------------------------------------------- 1 | function [ ] = printForce( forces, idx ) 2 | %UNTITLED Summary of this function goes here 3 | % Detailed explanation goes here 4 | 5 | 6 | f = abs(forces(idx)); 7 | s = sign(forces(idx)); 8 | fprintf('m%d: %.3f ', idx, f); 9 | if s < 0 10 | fprintf('(C)\n'); 11 | elseif s > 0 12 | fprintf('(T)\n'); 13 | else 14 | fprintf('\n'); 15 | end 16 | 17 | end 18 | 19 | -------------------------------------------------------------------------------- /truss_data_1.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | 6 | % sample problem truss 7 | 8 | C = [ 9 | 1 1 0 0 0 0 0 0 0 0 0 0 0 10 | 1 0 1 1 0 0 0 0 0 0 0 0 0 11 | 0 0 0 1 1 1 0 0 0 0 0 0 0 12 | 0 1 1 0 1 0 1 1 0 0 0 0 0 13 | 0 0 0 0 0 1 1 0 1 1 0 0 0 14 | 0 0 0 0 0 0 0 1 1 0 1 1 0 15 | 0 0 0 0 0 0 0 0 0 1 1 0 1 16 | 0 0 0 0 0 0 0 0 0 0 0 1 1 17 | ]; 18 | 19 | Sy = zeros(8,3); Sy(1,2)=1; Sy(8,3)=1; 20 | Sx = zeros(8,3); Sx(1,1)=1; 21 | 22 | X = [0 0 4 4 8 8 12 12]; 23 | Y = [0 4 8 4 8 4 4 0]; 24 | 25 | L = zeros(16,1); L(8+4)=-25; 26 | 27 | -------------------------------------------------------------------------------- /warren.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | 6 | % warren truss 7 | 8 | C = [ 9 | 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 10 | 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 11 | 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 12 | 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 13 | 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 14 | 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 15 | 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 16 | 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 17 | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 18 | ]; 19 | 20 | Sx = zeros(9,3); Sx(1,1)=1; 21 | Sy = zeros(9,3); Sy(1,2)=1; Sy(9,3)=1; 22 | 23 | X = [0 6 12 18 24 30 36 42 48]; 24 | Y = [0 10.4 0 10.4 0 10.4 0 10.4 0]; 25 | 26 | L = zeros(18,1); L(9+5) = -3.92; -------------------------------------------------------------------------------- /franken.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | 6 | % franken truss 7 | 8 | C = [ 9 | 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 10 | 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 11 | 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 12 | 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 13 | 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 14 | 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 15 | 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 16 | 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 17 | 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 18 | ]; 19 | 20 | Sx = zeros(9,3); Sx(1,1)=1; 21 | Sy = zeros(9,3); Sy(1,2)=1; Sy(9,3)=1; 22 | 23 | X = [0 9 14.5 19.5 24 28.5 35 40 49 ]; 24 | Y = [0 8.66 0 8.66 0 8.66 0 8.66 0]; 25 | 26 | L = zeros(18,1); L(9+5) = -3.92; -------------------------------------------------------------------------------- /franken.out: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, Team GNU, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | Load: 3.920 N 6 | Member forces in Newtons: 7 | m1: 2.884 (C) 8 | m2: 2.079 (T) 9 | m3: 2.369 (T) 10 | m4: 3.349 (C) 11 | m5: 2.309 (C) 12 | m6: 4.503 (T) 13 | m7: 2.254 (T) 14 | m8: 5.543 (C) 15 | m9: 2.164 (T) 16 | m10: 4.545 (T) 17 | m11: 2.401 (C) 18 | m12: 3.104 (C) 19 | m13: 2.217 (T) 20 | m14: 1.995 (T) 21 | m15: 2.769 (C) 22 | Reaction forces in Newtons 23 | r1: 0.000 24 | r2: 2.000 25 | r3: 1.920 26 | Cost of truss: $256 27 | Theoretical max load is 11.5765 28 | Theoretical max load/cost ratio in N/$: 0.0453 29 | First member to break is member 8 30 | The buclking force is 14.795 N 31 | Worst possible buckling strength is 10.810 N 32 | Theoretical worst load/cost ratio: 0.0423 -------------------------------------------------------------------------------- /sample.out: -------------------------------------------------------------------------------- 1 | Input truss data-file name: truss_data_1 2 | % EK301, Section A1, Group 7, Team GNU, 4/09/12 3 | % Michael Abed, ID U55178419 4 | % Joseph Stone, ID U44434740 5 | % Ben Havey, ID 6 | Load: 25.000 N 7 | Member forces in Newtons: 8 | m1: 16.667 (C) 9 | m2: 0.000 10 | m3: 16.667 (T) 11 | m4: 23.570 (C) 12 | m5: 16.667 (T) 13 | m6: 16.667 (C) 14 | m7: 11.785 (T) 15 | m8: 8.333 (T) 16 | m9: 0.000 17 | m10: 11.785 (C) 18 | m11: 8.333 (T) 19 | m12: 0.000 20 | m13: 8.333 (C) 21 | Reaction forces in Newtons 22 | r1: 0.000 23 | r2: 16.667 24 | r3: 8.333 25 | Cost of truss: $140 26 | Theoretical max load is 36.5154 27 | Theoretical max load/cost ratio in N/$: 0.2603 28 | First member to break is member 4 29 | The buclking force is 29.212 N 30 | Worst possible buckling strength is 35.366 N 31 | Theoretical worst load/cost ratio: 0.2521 -------------------------------------------------------------------------------- /warren.out: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, Team GNU, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | Load: 3.920 N 6 | Member forces in Newtons: 7 | m1: 2.263 (C) 8 | m2: 1.131 (T) 9 | m3: 2.263 (T) 10 | m4: 2.262 (C) 11 | m5: 2.263 (C) 12 | m6: 3.392 (T) 13 | m7: 2.263 (T) 14 | m8: 4.523 (C) 15 | m9: 2.263 (T) 16 | m10: 3.392 (T) 17 | m11: 2.263 (C) 18 | m12: 2.262 (C) 19 | m13: 2.263 (T) 20 | m14: 1.131 (T) 21 | m15: 2.263 (C) 22 | Reaction forces in Newtons 23 | r1: 0.000 24 | r2: 1.960 25 | r3: 1.960 26 | Cost of truss: $270 27 | Theoretical max load is 9.0692 28 | Theoretical max load/cost ratio in N/$: 0.0336 29 | First member to break is member 8 30 | The buclking force is 9.707 N 31 | Worst possible buckling strength is 8.130 N 32 | Theoretical worst load/cost ratio: 0.0301 33 | -------------------------------------------------------------------------------- /computeA.m: -------------------------------------------------------------------------------- 1 | function [ A ] = computeA( C, X, Y, Sx, Sy ) 2 | % computes the A matrix for solving a truss 3 | 4 | [j, m] = size(C); 5 | A = zeros(2*j, m+3); 6 | for row = 1:j 7 | for col = 1:m 8 | if C(row,col) 9 | p = findother(C(:,col), row); 10 | p1 = [X(row), Y(row)]; 11 | p2 = [X(p), Y(p)]; 12 | d = distance(p1, p2); 13 | A(row,col) = (X(p) - X(row))/d; 14 | A(row+j,col) = (Y(p) - Y(row))/d; 15 | end 16 | end 17 | end 18 | A(1:j,m+1:m+3)=Sx; 19 | A(j+1:2*j,m+1:m+3)=Sy; 20 | end 21 | 22 | function [ p ] = findother(col, row) 23 | p = 0; 24 | for i = 1:length(col) 25 | if col(i) && i ~= row 26 | p = i; 27 | end 28 | end 29 | end 30 | 31 | function [ d ] = distance( p1, p2 ) 32 | d = sqrt((p1(1)-p2(1))^2 + (p1(2)-p2(2))^2); 33 | end -------------------------------------------------------------------------------- /pratt.out: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, Team GNU, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | Load: 3.920 N 6 | Member forces in Newtons: 7 | m1: 2.772 (C) 8 | m2: 1.960 (T) 9 | m3: 0.000 10 | m4: 1.960 (T) 11 | m5: 2.772 (T) 12 | m6: 3.920 (C) 13 | m7: 1.960 (C) 14 | m8: 3.920 (T) 15 | m9: 2.772 (T) 16 | m10: 5.880 (C) 17 | m11: 0.000 18 | m12: 3.920 (T) 19 | m13: 2.772 (T) 20 | m14: 5.880 (C) 21 | m15: 1.960 (C) 22 | m16: 1.960 (T) 23 | m17: 2.772 (T) 24 | m18: 3.920 (C) 25 | m19: 0.000 26 | m20: 1.960 (T) 27 | m21: 2.772 (C) 28 | Reaction forces in Newtons 29 | r1: 0.000 30 | r2: 1.960 31 | r3: 1.960 32 | Cost of truss: $308 33 | Theoretical max load is 13.1392 34 | Theoretical max load/cost ratio in N/$: 0.0427 35 | First member to break is member 10 36 | The buclking force is 17.582 N 37 | Worst possible buckling strength is 12.417 N 38 | Theoretical worst load/cost ratio: 0.0403 -------------------------------------------------------------------------------- /pratt2.out: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, Team GNU, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | Load: 3.920 N 6 | Member forces in Newtons: 7 | m1: 2.828 (C) 8 | m2: 2.000 (T) 9 | m3: 0.000 10 | m4: 2.000 (T) 11 | m5: 2.828 (T) 12 | m6: 4.000 (C) 13 | m7: 0.000 14 | m8: 6.000 (T) 15 | m9: 2.828 (C) 16 | m10: 4.000 (C) 17 | m11: 3.920 (T) 18 | m12: 6.000 (T) 19 | m13: 2.772 (C) 20 | m14: 4.001 (C) 21 | m15: 0.000 22 | m16: 2.002 (T) 23 | m17: 2.772 (T) 24 | m18: 4.001 (C) 25 | m19: 0.000 26 | m20: 2.002 (T) 27 | m21: 2.774 (C) 28 | Reaction forces in Newtons 29 | r1: 0.000 30 | r2: 2.000 31 | r3: 1.920 32 | Cost of truss: $310 33 | Theoretical max load is 15.6748 34 | Theoretical max load/cost ratio in N/$: 0.0505 35 | First member to break is member 21 36 | The buclking force is 10.257 N 37 | Worst possible buckling strength is 14.143 N 38 | Theoretical worst load/cost ratio: 0.0456 -------------------------------------------------------------------------------- /pratt.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | 6 | % pratt truss 7 | 8 | C = [ 9 | 1 1 0 0 0 0 0 0 0 0 0 0 10 | 1 0 1 0 0 0 0 0 0 0 0 0 11 | 0 1 1 0 0 0 0 0 0 0 0 0 12 | 0 0 1 1 0 0 0 0 0 0 0 0 13 | 0 1 0 1 0 0 0 0 0 0 0 0 14 | 0 1 0 0 1 0 0 0 0 0 0 0 15 | 0 0 0 1 1 0 0 0 0 0 0 0 16 | 0 0 0 1 0 0 1 0 0 0 0 0 17 | 0 0 0 0 1 0 1 0 0 0 0 0 18 | 0 0 0 0 1 1 0 0 0 0 0 0 19 | 0 0 0 0 0 1 1 0 0 0 0 0 20 | 0 0 0 0 0 0 1 1 0 0 0 0 21 | 0 0 0 0 0 0 1 0 1 0 0 0 22 | 0 0 0 0 0 1 0 0 1 0 0 0 23 | 0 0 0 0 0 0 0 1 1 0 0 0 24 | 0 0 0 0 0 0 0 1 0 0 1 0 25 | 0 0 0 0 0 0 0 1 0 1 0 0 26 | 0 0 0 0 0 0 0 0 1 1 0 0 27 | 0 0 0 0 0 0 0 0 0 1 1 0 28 | 0 0 0 0 0 0 0 0 0 0 1 1 29 | 0 0 0 0 0 0 0 0 0 1 0 1 30 | ]'; 31 | 32 | Sy = zeros(12,3); Sy(1,2) = 1; Sy(12,3)=1; 33 | Sx = zeros(12,3); Sx(1,1) = 1; 34 | 35 | X = [0 8 8 16 16 24 24 32 32 40 40 48]; 36 | Y = [0 8 0 0 8 8 0 0 8 8 0 0]; 37 | 38 | L = zeros(24,1); L(12+7) = -3.92; 39 | -------------------------------------------------------------------------------- /pratt2.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, 4/09/12 2 | % Michael Abed, ID U55178419 3 | % Joseph Stone, ID U44434740 4 | % Ben Havey, ID U46525972 5 | 6 | % modified pratt truss 7 | 8 | C = [ 9 | 1 1 0 0 0 0 0 0 0 0 0 0 10 | 1 0 1 0 0 0 0 0 0 0 0 0 11 | 0 1 1 0 0 0 0 0 0 0 0 0 12 | 0 0 1 1 0 0 0 0 0 0 0 0 13 | 0 1 0 1 0 0 0 0 0 0 0 0 14 | 0 1 0 0 1 0 0 0 0 0 0 0 15 | 0 0 0 1 1 0 0 0 0 0 0 0 16 | 0 0 0 1 0 0 1 0 0 0 0 0 17 | 0 0 0 1 0 1 0 0 0 0 0 0 18 | 0 0 0 0 1 1 0 0 0 0 0 0 19 | 0 0 0 0 0 1 1 0 0 0 0 0 20 | 0 0 0 0 0 0 1 1 0 0 0 0 21 | 0 0 0 0 0 1 0 1 0 0 0 0 22 | 0 0 0 0 0 1 0 0 1 0 0 0 23 | 0 0 0 0 0 0 0 1 1 0 0 0 24 | 0 0 0 0 0 0 0 1 0 0 1 0 25 | 0 0 0 0 0 0 0 1 0 1 0 0 26 | 0 0 0 0 0 0 0 0 1 1 0 0 27 | 0 0 0 0 0 0 0 0 0 1 1 0 28 | 0 0 0 0 0 0 0 0 0 0 1 1 29 | 0 0 0 0 0 0 0 0 0 1 0 1 30 | ]'; 31 | 32 | Sy = zeros(12,3); Sy(1,2) = 1; Sy(12,3)=1; 33 | Sx = zeros(12,3); Sx(1,1) = 1; 34 | 35 | X = [0 8 8 16 16 24 24 32 32 40 40 48]; 36 | Y = [0 8 0 0 8 8 0 0 8 8 0 0]; 37 | 38 | L = zeros(24,1); L(12+7) = -14.9647; 39 | -------------------------------------------------------------------------------- /truss_solver.m: -------------------------------------------------------------------------------- 1 | % EK301, Section A1, Group 7, The GNUs 2 | % Michael Abed ID U55178419 3 | % Joseph Stone ID U44434740 4 | % Ben Havey ID U46525972 5 | 6 | % main truss solver program 7 | 8 | filename = input('Input truss data-file name: ', 's'); 9 | 10 | run(filename); 11 | 12 | forces = solveTruss(C, Sx, Sy, X, Y, L); 13 | forces(abs(forces) < 0.00001) = 0; 14 | [j, m] = size(C); 15 | 16 | Ln = L(L~=0); 17 | 18 | D = memberDistances(C, X, Y); 19 | 20 | cost = computeTrussCost(C,D); 21 | weakest = weakestMember(D,forces); 22 | ml = maxLoad(forces,L,D,weakest,false); 23 | 24 | printHeader(); 25 | for i = 1:length(Ln) 26 | 27 | fprintf('Load: %.3f N\n', abs(Ln(i))); 28 | end 29 | fprintf('Member forces in Newtons:\n'); 30 | for i = 1:m 31 | printForce(forces, i); 32 | end 33 | fprintf('Reaction forces in Newtons\n'); 34 | for i = 1:length(forces)-m 35 | fprintf('r%d: %.3f\n', i, forces(m+i)); 36 | end 37 | 38 | fprintf('Cost of truss: $%d\n', round(cost)); 39 | fprintf('Theoretical max load is %.4f\n', ml); 40 | fprintf('Theoretical max load/cost ratio in N/$: %.4f\n', ml/cost); 41 | fprintf('First member to break is member %d\n', weakest); 42 | fprintf('The buclking force is %.3f N\n' , bucklingStrength(D(weakest))); 43 | 44 | weak = maxLoad(forces,L,D,weakest,true); 45 | 46 | fprintf('Worst possible buckling strength is %.3f N\n', weak); 47 | fprintf('Theoretical worst load/cost ratio: %.4f\n', weak/cost); --------------------------------------------------------------------------------