MATLAB Solving ODE in Matlab with If Statements

  • Thread starter Thread starter sristi89
  • Start date Start date
  • Tags Tags
    Matlab
AI Thread Summary
The discussion revolves around solving a first-order ordinary differential equation (ODE) numerically using MATLAB. The user sets up the ODE with specific parameters and initializes a vector for the solution. The main issue arises when the solution exceeds a threshold of 150; the user needs to reset the initial condition to 100 and continue the simulation from that point. Several attempts to implement this reset using if statements within the loop are presented. The first approach recalculates the next value directly after the threshold is exceeded, while the second approach checks the current value before deciding how to compute the next step. The key challenge is correctly implementing the logic to ensure that the solution reflects the reset condition without disrupting the overall numerical integration process.
sristi89
Messages
8
Reaction score
0
Hi everyone,

So I have to solve a ODE (for dy/dt = K*(y-s) ) numerically in Matlab.

This is how I set it up:
K = 1;
s = 20;
y0 = 100;
npoints = 50;
dt = 0.1;
y = zeros(npoints,1); % this initializes the vector y to being all zeros
t = zeros(npoints,1);
y(1) = y0; % the initial condition
t(1) = 0.0;
for step=1:npoints-1 % loop over the timesteps
y(step+1) = y(step) + dt*K*(y(step)-s);
t(step+1) = t(step) + dt;
end
plot(t,y,'r'); %plots the numerical solution in red
hold on; %keep the previously plotted lines


My problem is that I have to "reset" the initial condition if the value of V(step+1)>150 with the initial condition (100). Then I have to let the loop continue with the new value.

I tried a bunch of combinations of the if statement in the for loop, but I can't make it work.
Any help would be really appreciated. Thanks!
 
Physics news on Phys.org
I'm not sure I understand exactly, but if y(step+1) has to be recalculated with the reset value when it goes over 150:

Code:
for step=1:npoints-1 % loop over the timesteps 
  y(step+1) = y(step) + dt*K*(y(step)-s); 
  if(y(step+1)>150)
    y(step+1) = y0 + dt*K*(y0-s); 
  end
  t(step+1) = t(step) + dt; 
end

If y(step+1) is to be unchanged and only the next datapoint has to be calculated with the reset value, then
Code:
for step=1:npoints-1 % loop over the timesteps 
  if(y(step)>150)
    y(step+1) = y0 + dt*K*(y0-s); 
  else
    y(step+1) = y(step) + dt*K*(y(step)-s); 
  end
  t(step+1) = t(step) + dt; 
end
 
Last edited:

Similar threads

Replies
4
Views
1K
Replies
1
Views
6K
Replies
5
Views
2K
Replies
4
Views
3K
Replies
18
Views
4K
Replies
5
Views
1K
Replies
1
Views
2K
Back
Top