How to solve the coupled second order differential equations using the Rung-Kutta method?
조회 수: 3 (최근 30일)
이전 댓글 표시
Hello,
I try to solve the two degree of freedom system(2DOF, spring-damper) with RK4.
I solve the 1DOF problem, but the answer of the above problem was not correctly.
I tried two method,
The first..
% Name: RK4_1
% Detail: Runge-Kutta 4th order examples
clear all;
close all;
h=0.001; % [sec]
t = 0 : h: 3*pi; % [sec]
x10(1) = 0; % [m]
x11(1) = 0; % [m/s]
x20(1) = 0; % [m]
x21(1) = 0; % [m/s]
x = zeros(2, length(t));
x(:,1) = [x10(1); x20(1)];
v = zeros(2, length(t));
v(:,1) = [x11(1); x21(1)];
m1 = 1; % [kg]
m2 = 1; % [kg]
k1 = 10; % [N/m]
k2 = 10; % [N/m]
c1 = 1; % [Ns/m]
c2 = 1; % [Ns/m]
p = 10 * ones(1,length(t)); % [N]
F = zeros(2, length(t));
F(2,:) = p/m2;
K11 = -(k1+k2)/m1;
K12 = k2/m1;
K21 = -k2/m2;
K22 = k2/m2;
Kmat = [K11 K12; K21 K22];
C11 = -c1/m1;
C12 = c2/m1;
C21 = -c2/m2;
C22 = c2/m2;
Cmat = [C11 C12; C21 C22];
f = @(t, x, y) y;
g = @(t, x, y, p) (Kmat*x + Cmat*y + p);
for i = 1: length(t)-1
k1 = h*f(t(i), x(:,i), v(:,i));
l1 = h*g(t(i), x(:,i), v(:,i), F(:,i));
k2 = h*f(t(i), x(:,i) + (1/2)*k1, v(:,i) + (1/2)*l1);
l2 = h*g(t(i), x(:,i) + (1/2)*k1, v(:,i) + (1/2)*l1, F(:,i));
k3 = h*f(t(i), x(:,i) + (1/2)*k2, v(:,i) + (1/2)*l2);
l3 = h*g(t(i), x(:,i) + (1/2)*k2, v(:,i) + (1/2)*l2, F(:,i));
k4 = h*f(t(i), x(:,i) + k3, v(:,i) + l3);
l4 = h*g(t(i), x(:,i) + k3, v(:,i) + l3, F(:,i));
dx = (1/6) * (k1 + 2*k2 + 2*k3 + k4);
dv = (1/6) * (l1 + 2*l2 + 2*l3 + l4);
x(:,i+1) = x(:,i) + dx;
v(:,i+1) = v(:,1) + dv;
end
For = F';
Pos = x';
Vel = v';
data = [Pos Vel];
xlswrite('data.xlsb',data);
And, the other method..
% Name: RK4_1
% Detail: Runge-Kutta 4th order examples
clear all;
close all;
h=0.001; % [sec]
t = 0 : h: 10*pi; % [sec]
x10(1) = 0; % [m]
x11(1) = 0; % [m/s]
x20(1) = 0; % [m]
x21(1) = 0; % [m/s]
p = 10 * ones(1,length(t)); % [N]
m1 = 1; % [kg]
m2 = 1; % [kg]
k1 = 10; % [N/m]
k2 = 10; % [N/m]
c1 = 1; % [Ns/m]
c2 = 1; % [Ns/m]
f1 = @(t, x1, x1d) x1d;
g1 = @(t, x1, x1d, x2, x2d) (-(k1+k2)*x1 - c1*x1d + k2*x2 + c2*x2d ) / m1;
f2 = @(t, x2, x2d) x2d;
g2 = @(t, x1, x1d, x2, x2d, F) (-k2*x2 - c2*x2d + k2*x1 + c2*x1d + F ) / m2;
for i = 1: length(t)-1
k11 = h*f1(t(i), x10(i), x11(i));
l11 = h*g1(t(i), x10(i), x11(i), x20(i), x21(i));
k21 = h*f2(t(i), x20(i), x21(i));
l21 = h*g2(t(i), x10(i), x11(i), x20(i), x21(i), p(i));
k12 = h*f1(t(i)+0.5*h, x10(i)+0.5*k11, x11(i)+0.5*l11);
l12 = h*g1(t(i)+0.5*h, x10(i)+0.5*k11, x11(i)+0.5*l11, x20(i)+0.5*k21, x21(i)+0.5*l21);
k22 = h*f2(t(i)+0.5*h, x20(i)+0.5*k21, x21(i)+0.5*l21);
l22 = h*g2(t(i)+0.5*h, x10(i)+0.5*k11, x11(i)+0.5*l11, x20(i)+0.5*k21, x21(i)+0.5*l21, p(i));
k13 = h*f1(t(i)+0.5*h, x10(i)+0.5*k12, x11(i)+0.5*l12);
l13 = h*g1(t(i)+0.5*h, x10(i)+0.5*k12, x11(i)+0.5*l12, x20(i)+0.5*k22, x21(i)+0.5*l22);
k23 = h*f2(t(i)+0.5*h, x20(i)+0.5*k22, x21(i)+0.5*l22);
l23 = h*g2(t(i)+0.5*h, x10(i)+0.5*k12, x11(i)+0.5*l12, x20(i)+0.5*k22, x21(i)+0.5*l22, p(i));
k14 = h*f1(t(i)+h, x10(i)+k13, x11(i)+l13);
l14 = h*g1(t(i)+h, x10(i)+k13, x11(i)+l13, x20(i)+k23, x21(i)+l23);
k24 = h*f2(t(i)+h, x20(i)+k23, x21(i)+l23);
l24 = h*g2(t(i)+h, x10(i)+k13, x11(i)+l13, x20(i)+k23, x21(i)+l23, p(i));
x10(i+1) = x10(i) + 1/6*(k11+2*k12+2*k13+k14);
x11(i+1) = x11(i) + 1/6*(l11+2*l12+2*l13+l14);
x20(i+1) = x20(i) + 1/6*(k21+2*k22+2*k23+k24);
x21(i+1) = x21(i) + 1/6*(l21+2*l22+2*l23+l24);
end
data = [x10' x11' x20' x21'];
xlswrite('data.xlsb',data);
But, both are not working correctly..
Can I get an advice for this problem?
댓글 수: 0
답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Analysis and Verification에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!