help with my 4th order runge kutta code
1 view (last 30 days)
Show older comments
I received this error: "Unable to perform assignment because the size of the left side is 1-by-4 and the size of the right side is 4-by-4." when trying to run my 4th order runge kutta code to solve the 4 non linear odes of an elastic pendulum. Any help on how to fix this would be appreciated. The line of code where the error is:
Y(i+1,:) = Y(i,:) + phi*h;
edit: here is my code
tspan1=[0,2*pi];
h=0.01;
r1=11;
rdot1=0;
theta1=0;
thetadot1=0;
init1= [r1;theta1;rdot1;thetadot1];
[T,Y]=rk4_fun(@spring1,tspan1,init1,h);
function [T,Y]=rk4_fun(f,tspan,y0,h)
x0 = tspan(1);xf = tspan(2);
T = (x0:h:xf)';
n = length(T);
n_eqn = length(y0);
Y = ones(n,n_eqn);
Y(1,:) = y0;
for i = 1:n-1
k1 = f(T(i),Y(i,:))';
k2 = f(T(i)+h/2,Y(i,:) + k1*h/2)';
k3 = f(T(i)+h/2,Y(i,:) + k2*h/2)';
k4 = f(T(i)+h,Y(i,:) + k3*h)';
phi = (k1+2*k2+2*k3+k4)/6;
Y(i+1,:) = Y(i,:) + phi*h;
end
end
function ydt = spring1(t, y)
g = 1000;
km = 100;
lo=10;
[rows,cols] = size(y);
ydt = zeros(rows,cols);
ydt(1) = y(3);
ydt(2) = y(4);
ydt(3) = y(1)*y(4)*y(4) + g*cos(y(2)) - km*(y(1)-lo);
ydt(4) = -(g*sin(y(2))+2*y(3)*y(4))/y(1);
end
2 Comments
James Tursa
on 17 Oct 2021
In the future, it is best to post the entire code that produces the error so that we can get the proper context. Without seeing the rest of your code we have to make guesses.
John D'Errico
on 17 Oct 2021
Without seeing the rest of the code, it is impossble to help you.
Most importantly, we need to know the size of both the phi and h variables. Not what you THINK them to be. But what they are. EXACTLY.
Accepted Answer
James Tursa
on 17 Oct 2021
My guess without seeing the rest of your code is that phi is a column vector, so when you add phi*h to the row vector Y(i,:) it creates a 4x4 matrix. Try changing phi to a row vector, or transpose it in the equation itself. E.g.,
Y(i+1,:) = Y(i,:) + phi'*h;
0 Comments
More Answers (1)
See Also
Categories
Find more on Ordinary Differential Equations in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!