MATLAB Answers

Eulers method for system of linear equations

3 views (last 30 days)
Oskar Mevik Päts
Oskar Mevik Päts on 27 Nov 2019
Edited: Jan on 28 Nov 2019
function posi = position(m)
m = 10; % Car count
N = 400; % Steps
h = 0,1; % Stepsize
v_1 = 25; %Car 1's speed
% Assigns starting value
for i = 1:m
posi(1,m) = (m +1 - i) * 10;
end
% The first car's position is independent of other cars
for i = 1:N
posi(i+1,1) = posi(i,1) + h * v_1;
end
for j = 2:m
for i = 1:N
posi(i+1,j) = posi(i,j) + h * velo(i,j,posi(i,j-1),posi(i,j));
end
end
end
function veloc = velo(i,j,x,y)
m = 10;
N = 400;
v_1 = 25;
d = 10;
h = 0.1;
% All cars but the first one starts at zero speed.
for j = 1:m
veloc(1,j+1) = 0;
end
% If the distant difference between two cars is "d", the speed doesn't
% change.
if x - y == d
veloc(i,j) = veloc(i-1,j);
% Otherwise the speed changes
else
veloc(i,j) = veloc(i,j-1) + h * acc(i,j,x,y);
end
function acce = acc(i,j,x,y)
d = 10;
% If position difference is big the car will accelerate quick
if x - y > d * 2
acce(i,j) = 10;
% If position difference is big the car will accelerate quick
elseif x - y > d
acce(i,j) = 5;
% If too close, slow down.
elseif x - y < d
acce(i,j) = -2;
end
The problem's origin is a system of ODE's.
My idea is to create a N x m - matrix, for each car's position, velocity and acceleration for each euler step. For that I use three different functions. I don't see why this doesnt work.
Unable to perform assignment because the size of the left side is 1-by-1 and the size of the
right side is 1-by-10.
Error in velo (line 22)
veloc(i,j) = veloc(i,j-1) + h * acc(i,j,x,y);
Error in position (line 20)
posi(i+1,j) = posi(i,j) + h * velo(i,j,posi(i,j-1),posi(i,j));
It seems like it's the call to the acceleration function that is lacking something. I wanna keep the variables x,y from the original function. What am I doing wrong?
Any help is muy appriciated! <3

  0 Comments

Sign in to comment.

Answers (1)

Jan
Jan on 28 Nov 2019
Edited: Jan on 28 Nov 2019
h = 0,1;
% ^ you mean 0.1 with a dot
There is no need to create the accleration as array. Reply a scalar instead:
function acce = acc(i,j,x,y)
d = 10;
if x - y > d * 2
% If position difference is big the car will accelerate quick
acce = 10; % Without (i,j)!
elseif x - y > d % If position difference is big the car will accelerate quick
acce = 5;
elseif x - y < d % If too close, slow down
acce = -2;
end
By the way: this fails for x-y==d. Include this case in one of the other cases.
The same problem happens for the velocity also. You do not need to define veloc(i,j) , but the scalar veloc. Define the arrays of positions and velocities in the main function. Then the current acceleration is calculated and used to determine the new velocities, which again are use to update the positions.

  0 Comments

Sign in to comment.

Sign in to answer this question.