Anas Yousef
Anas Yousef

Reputation: 93

Loop through data set until specific point - Matlab

I've run an experiment where a machine exerts a force on a bridge until it breaks. I need to cycle through my entire data set and calculate the toughness until I've hit the breaking point (fdValue1). The toughness is calculated by summing up all the rectangles under my load vs. distance curve. (Basically the integral) However, I have not been able to find a reasonable way of doing so and my current loop is an infinite loop and I'm not sure why.

  %Initializing variables
  bridge1Data = xlsread('Bridge1Data.xlsx', 'A2:C2971');
  bridge2Data = xlsread('Bridge2Data.xlsx', 'A2:C1440');

  bridge1Load = bridge1Data(:, 2);
  bridge2Load = bridge2Data(:, 2);

  bridge1Dist = bridge1Data(:, 3);
  bridge2Dist = bridge2Data(:, 3);

  [row1, col1] = size(bridge1Dist);
  [row2, col2] = size(bridge2Dist);

  bridge1Disp = zeros(row1, col1);
  bridge2Disp = zeros(row2, col2);

  fdValue1 = 0.000407350000000029;

  &Main code
  %Displacement
  for k = 2:length(bridge1Dist)
      bridge1Disp(k-1, 1) = bridge1Dist(k, 1) - bridge1Dist(k-1, 1);
  end

  %Max Load Bridge 1
  maxLoad1 = 0;
  for n = 1:length(bridge1Load)
      for k = 1
          if bridge1Load(n, k) > maxLoad1
              maxLoad1 = bridge1Load(n, k);
          end
      end
  end

  %Cycle through data till failure, change proj data
  totalRect1 = 0;
  for j = 2:length(bridge1Disp) 
      while bridge1Disp(j, 1) ~= fdValue1
          rectangle = (bridge1Disp(j, 1) - bridge1Disp(j-1, 1))*...
                      ((bridge1Load(j, 1) + bridge1Load(j-1, 1))/2);
          totalRect1 = totalRect1 + rectangle;
      end
  end

Basically, I make an array for the load and distance the machine pushes down on the bridge, assign a 'Failure Distance' value (fdValue) which should be used to determine when we stop calculating toughness. I then calculate displacement, calculate the maximum load. Then through the variable 'rectangle', calculate each rectangle and sum them all up in 'totalRect1', and use that to calculate the toughness by finding the area under the curve. Is anyone able to see why the loop is an infinite loop? Thanks

Upvotes: 0

Views: 120

Answers (2)

Dev-iL
Dev-iL

Reputation: 24179

The problem with the condition while bridge1Disp(j, 1) ~= fdValue1 is that you need to check for <= and not for (in)equality, since double numbers will almost never evaluate to be equal even if they seem so. To read more about this you can look here and also google for matlab double comparison. Generally it has something to do with precision issues.

Usually when checking for double equality you should use something like if abs(val-TARGET)<1E-4, and specify some tolerance which you are willing to permit.


Regardless,

You don't need to use loops for what you're trying to do. I'm guessing this comes from some C-programming habits, which are not required in MATLAB.

The 1st loop (Displacement), which computes the difference between every two adjacent elements can be replaced by the function diff like so:

bridge1Disp = diff(bridge1Dist);

The 2nd loop construct (Max Load Bridge 1), which retrieves the maximum element of bridge1Load can be replaced by the command max as follows:

maxLoad1 = max(bridge1Load);

For the last loop construct (Cycle ...) consider the functions I've mentioned above, and also find.

Upvotes: 1

il_raffa
il_raffa

Reputation: 5190

In the code section

%Cycle through data till failure, change proj data
totalRect1 = 0;
for j = 2:length(bridge1Disp)
   while bridge1Disp(j, 1) ~= fdValue1
      rectangle = (bridge1Disp(j, 1) - bridge1Disp(j-1, 1))*...
         ((bridge1Load(j, 1) + bridge1Load(j-1, 1))/2);
      totalRect1 = totalRect1 + rectangle;
   end
end

the test condition of the while loop is

bridge1Disp(j, 1) ~= fdValue1

nevertheless, in the while loop the value of bridge1Disp(j, 1) does not change so if at the first iteratiion of the while loop bridge1Disp(j, 1) is ~= fdValue1 the loop will never end.

Hope this helps.

Upvotes: 0

Related Questions