Error in for loop (issue with variable calling)
Show older comments
I am trying to find natural frquency for two sets of data. For that we have to follow this method

I am facing issue with calculation of Wd and Wn where i have to call values of Time from specific range.
for i = 1:1
z1 = importdata("XXsv0000"+i+".txt");
Time{i} = z1.data(:,1); % select the first column of data from rows defined in ind as time data
Veloc{i} = z1.data(:,2); % select the second column of data from rows defined in ind as velocity data
ind = 1:550; % redefine the range of indices to select data from Veloc
% find local maxima in Veloc data within the range of indices defined in ind
% returns peak amplitude (Ypk), peak index (Xpk), peak width (Wpk), and peak prominence (Ppk)
[Ypk,Xpk,Wpk1,Ppk] = findpeaks(Veloc{i}(ind));
Ypk_plot{i} = Ypk(11:35);
Xpk_plot{i} = Xpk(11:35);
Y{i} = Ypk; X{i} = Xpk; W{i} = Wpk1; P{i} = Ppk;
figure(i)
plot(Time{i},Veloc{i},Time{i}(Xpk_plot{i}),Ypk_plot{i},'dr'); % plot data against time data and mark the locations of the peaks found
grid on
legend(["data","Pick points"])
sgtitle("File " + string(i))
n_peaks = numel(X{i});
Log_Dec = zeros(1, n_peaks-1);
t_new = Time{i}; % contains 1024 values (which is wrong) it shoud be 81x1
y_new = Y{i};
for nn = 1:n_peaks-1 %
Log_Dec(nn) = log(y_new(nn)/y_new(nn+1)); % computed with n = 1 periods apart
end
%Calculate Average Logarithmic Decrement
Mean_dec = mean(Log_Dec);
%Assesses Damping Constant
damp_ratio(1,i) = 1/sqrt(1+((2*pi/(Mean_dec))^2));
end
Accepted Answer
More Answers (1)
for i = 1:1
z1 = importdata("Xxsv0000"+num2str(i)+".txt");
Time{i} = z1.data(:,1); % select the first column of data from rows defined in ind as time data
Veloc{i} = z1.data(:,2); % select the second column of data from rows defined in ind as velocity data
ind = 1:550; % redefine the range of indices to select data from Veloc
% find local maxima in Veloc data within the range of indices defined in ind
% returns peak amplitude (Ypk), peak index (Xpk), peak width (Wpk), and peak prominence (Ppk)
[Ypk,Xpk,Wpk1,Ppk] = findpeaks(Veloc{i}(ind));
Ypk_plot{i} = Ypk(11:35);
Xpk_plot{i} = Xpk(11:35);
Y{i} = Ypk; X{i} = Xpk; W{i} = Wpk1; P{i} = Ppk;
figure(i)
plot(Time{i},Veloc{i},Time{i}(Xpk_plot{i}),Ypk_plot{i},'dr'); % plot data against time data and mark the locations of the peaks found
grid on
legend(["data","Pick points"])
sgtitle("File " + string(i))
n_peaks = numel(X{i});
Log_Dec = zeros(1, n_peaks-1);
t_new = Time{i}; % contains 1024 values (which is wrong) it shoud be 81x1
y_new = Y{i};
for nn = 1:n_peaks-1 %
Log_Dec(nn) = log(y_new(nn)/y_new(nn+1)); % computed with n = 1 periods apart
end
%Calculate Average Logarithmic Decrement
Mean_dec = mean(Log_Dec);
%Assesses Damping Constant
damp_ratio(1,i) = 1/sqrt(1+((2*pi/(Mean_dec))^2));
end
7 Comments
AL
on 15 Mar 2023
David Hill
on 15 Mar 2023
This line:
z1 = importdata("Xxsv0000"+num2str(i)+".txt");
AL
on 15 Mar 2023
David Hill
on 15 Mar 2023
Edited: David Hill
on 15 Mar 2023
Your text file has 1024 rows of data. The above code is working properly. You need to explain why it should only be 81x1.
Star Strider
on 15 Mar 2023
The ‘t_new’ cell array should be indexed by the index vector ‘Xpk’ —
t_new = Time{i}(Xpk)
That will produce the (81x1) vector.
.
AL
on 15 Mar 2023
Star Strider
on 16 Mar 2023
@AL — I just now saw this.
I see the problem, and the solution is therefore straightforward. However you already accepted another Answer, so I will not post my solution.
Categories
Find more on Loops and Conditional Statements in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
