How can I implement this algorithm in matlab?

3 views (last 30 days)
Mark N
Mark N on 20 Nov 2018
Commented: Rik on 21 Nov 2018
Hi! Would somebody be kind enough to show me how to implement this algorithm as a function to return an array with values of x^n and v^n
Lets just say k=5 m=0.5 x0=1 and v0=0.1 with total run time of T=10
  4 Comments
Mark N
Mark N on 21 Nov 2018
Lets say delta t = 0.1 and the superscripts arent indices, just to count iterations
Mark N
Mark N on 21 Nov 2018
x(1) = x0;
v(1) = v0;
function [v(:,i),x(:,i)] = semi-implicit(k,m,N,T,x0,v0)
for i= 1:N
v(:,i+1)= (v(:,i) - (dt*(k/m)*x(:,i)));
x(:,i+1)= (x(:,i) + (dt*v(:,i+1)));
end
end
This is what i've tried but seems its completely wrong

Sign in to comment.

Answers (1)

Robert U
Robert U on 21 Nov 2018
Hi Mark N
There are some issues with the your matlab syntax.
function [v,x] = semi_implicit(k,m,dt,T,x0,v0)
% check inputs
validateattributes(k, {'numeric'},{'column'});
validateattributes(m, {'numeric'},{'column'});
validateattributes(dt,{'numeric'},{'column'});
validateattributes(T, {'numeric'},{'scalar','nonnegative'});
validateattributes(x0,{'numeric'},{'column'});
validateattributes(v0,{'numeric'},{'column'});
if ~isscalar(k) || ~isscalar(m) || ~isscalar(dt) || ~isscalar(x0) || ~isscalar(v0)
dLgnths = [length(k);length(m);length(dt);length(x0);length(v0)];
if ~all((dLgnths == max(dLgnths)) | dLgnths == 1)
errout = find(~((dLgnths == max(dLgnths)) | dLgnths == 1));
error('Please, check input #%d for being either scalar or vector of length %d (depending on max. length of given input vectors).',errout(1),max(dLgnths))
end
end
% initialize
x = x0;
v = v0;
for ik= 1:T
v(:,end+1)= v(:,end) - (dt .* (k./m) .* x(:,end));
x(:,end+1)= x(:,end) + (dt .* v(:,end));
end
% copy end values to output (here, by overwriting variables v and x)
v = v(:,end);
x = x(:,end);
end
Kind regards,
Robert
  1 Comment
Rik
Rik on 21 Nov 2018
Nice write-up. I do have one remark: if you know how many elements an array will have, you should generally not allow them to grow dynamically (the exceptions are often cases where you know there are only a handful of iterations and the size calculation is expensive).
% initialize
x=zeros(size(x0,1),T);
x(:,1) = x0;
v=zeros(size(v0,1),T);
v(:,1) = v0;
for ik= 1:T
v(:,ik+1)= v(:,ik) - (dt .* (k./m) .* x(:,ik));
x(:,ik+1)= x(:,ik) + (dt .* v(:,ik));
end

Sign in to comment.

Categories

Find more on Creating and Concatenating Matrices in Help Center and File Exchange

Tags

Products


Release

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!