MATLAB: I want to find particular values of t at which y becomes 2 (by writing some commands in code itself). Can I extract such values of t as a vector

finding input value corresponding to some value of output in 1d equation.

clear
clc;
N=2000; % Number of time stpes
dt=0.05; %Time step
%Initialize
y=zeros(N,1);
t=zeros(N,1);
%Initial values
t(1)=0;
y(1)=1;
for j=2:N
t(j)=t(j-1)+dt;
y(j)=y(j-1)+dt*sin(t(j-1));
end
plot(t,y)

Best Answer

Try this:
N=2000; % Number of time stpes
dt=0.05; %Time step
%Initialize
y=zeros(N,1);
t=zeros(N,1);
%Initial values
t(1)=0;
y(1)=1;
for j=2:N
t(j)=t(j-1)+dt;
y(j)=y(j-1)+dt*sin(t(j-1));
end
zci = @(v) find(v(:).*circshift(v(:), [-1 0]) <= 0); % Returns Approximate Zero-Crossing Indices Of Argument Vector
idx_2 = zci(y - 2); % Vector Of Approximate Indices Where ‘y=2’
for k = 1:numel(idx_2)
t2(k) = interp1(y(idx_2(k)+[-1 1]), t(idx_2(k)+[-1 1]), 2, 'linear','extrap'); % Interopolate: ‘t’ Where ‘y=2’
end
figure
plot(t,y)
hold on
plot(t2, 2*ones(size(t2)), 'pg')
hold off
This uses the ‘zci’ utility function to find the approximate indices where ‘t=2’, then uses the ‘idx_2’ index vector to loop through your data to find the closest values of ‘t’ that the interp1 function can calculate where ‘y=2’.