How can I implement this algorithm in matlab?

8 次查看(过去 30 天)
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 个评论
Mark N
Mark N 2018-11-21
Lets say delta t = 0.1 and the superscripts arent indices, just to count iterations
Mark N
Mark N 2018-11-21
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

请先登录,再进行评论。

回答(1 个)

Robert U
Robert U 2018-11-21
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 个评论
Rik
Rik 2018-11-21
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

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Get Started with MATLAB 的更多信息

标签

产品


版本

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by