I am trying find the response of a three story building using 4th order runge kutta but my response is diverging I am not sure why can someone help?

2 visualizzazioni (ultimi 30 giorni)
m = (500*1000)
M = [2*m 0 0; 0 2*m 0; 0 0 m]
[nd,nd]= size(M)
disp('mass matrix')
M
%insert elcentro data
t = e002
accn = e003
dt = t(2) - t(1)
plot(t,accn,'black'); set(gca,'Fontsize',13)
xlabel('TIME (SEC)')
ylabel('ACCELERATION (m/s2)')
%force vector calculations
for i = 1:nd
f(:,i)=-accn*M(i,i)
end
disp ('Force vector')
f
plot(t,f(:,1),'black'); set(gca,'Fontsize',13)
xlabel('TIME (SEC)')
ylabel('FORCE FLOOR 1 (N)')
plot(t,f(:,2),'black'); set(gca,'Fontsize',13)
xlabel('TIME (SEC)')
ylabel('FORCE FLOOR 2 (N)')
plot(t,f(:,3),'black'); set(gca,'Fontsize',13)
xlabel('TIME (SEC)')
ylabel('FORCE FLOOR 3 (N)')
%Damping Matrix input
C = 10^5 * [7 -3 0; -3 3.2 -1.4; 0 -1.4 1.4]
disp ('Damping matrix')
C
%Stiffness Matrix input
E = 0.209*10^9; I =1.5796*10^-2
K1 = 2*E*I
K2 = 3*E*I
K3 = 3*E*I
K =[K1+K2 -K2 0; -K2 K2+K3 -K3; 0 -K3 C(3,3)]
disp ('Stiffness matrix')
K
u1 = [0;0;0]
v1 = [0;0;0]
tt = 53.74
n= 150
n1 = n + 1
F = [0;0;0]
an1 = inv(M) * (F - C * v1 - K * u1)
t=0.0
for i = 2 : n1
F = [f(i,1);f(i,2);f(i,3)]
% for k1
ui = u1
vi = v1
ai = an1
d1 = vi
q1 = ai
% for k2
l = 0.5
x = ui + l * dt * d1
d2 = vi + l * dt * q1
q2 = inv(M) * (F - C * d2 - K * x)
% for k3
l = 0.5
x = ui + l * dt * d2
d3 = vi + l * dt * q2
q3 = inv(M) * (F - C * d3 - K * x)
% for k4
l = 1
x = ui + l * dt * d3
d4 = vi + l * dt * q3
q4 = inv(M) * (F - C * d4 - K * x)
x1 = u1 + dt * (d1 + 2 * d2 + 2 * d3 + d4)/6
ve1 = v1 + dt * (q1 + 2 * q2 + 2 * q3 + q4)/6
anc1 = inv(M) * (F - C * ve1 - K * x1)
u1 = x1
v1 = ve1
an1 = anc1
end
  1 Commento
James Tursa
James Tursa il 9 Ago 2022
Modificato: James Tursa il 9 Ago 2022
This code is hard to read. I suggest you completely rewrite this using a matrix-vector formulation along the lines of the examples you can find in the ode45( ) doc. That is, create a derivative function with a (t,y) signature, where y is the state vector. Then write your RK4 code using this function. That way you can compare your results directly with ode45( ) results using the exact same derivative function.
Also, can you post an image of the differential equation you are solving?

Accedi per commentare.

Risposte (1)

Chrissy Kimemwenze
Chrissy Kimemwenze il 9 Ago 2022
Here is the equation I am trying to solve. I tried using ode45 but I can get it to work.
  2 Commenti
Chrissy Kimemwenze
Chrissy Kimemwenze il 11 Ago 2022
% HERE IS MY ODE45 CODE how can I input the earthquake load since the load is changing at each time step
tspan=[0:0.02:53.76];
z0=[0;0;0.01;0;0.05;0];
[t,z]=ode45(@forced_vibration,tspan,z0);
plot(t,z(:,1),'color','b','LineWidth',2);
grid on
xlabel('Time (t) (sec)')
ylabel('Displacement x1 (m)')
title('Displacement floor 1 Vs Time')
plot(t,z(:,2),'color','b','LineWidth',2)
grid on
xlabel('Time (t) (sec)')
ylabel('Velocity V1 (m/s)')
title('Velocity Vs Time')
plot(t,z(:,3),'color','b','LineWidth',2)
grid on
xlabel('Time (t) (sec)')
ylabel('Displacement x2 (m)');
title('Displacement floor 2 Vs Time')
plot(t,z(:,4),'color','b','LineWidth',2)
grid on
xlabel('Time (t) (sec)')
ylabel('Velocity V2 (m/s)')
title('Velocity Vs Time')
plot(t,z(:,5),'color','b','LineWidth',2)
grid on
xlabel('Time (t) (sec)')
ylabel('Displacement x3 (m)');
title('Displacement floor 3 Vs Time')
plot(t,z(:,6),'color','b','LineWidth',2)
grid on
xlabel('Time (t) (sec)')
ylabel('Velocity V3 (m/s)')
title('Velocity Vs Time')
function f = forced_vibration(t,z)
% Mass(kg)
m = (500*1000);
M = [2*m 0 0; 0 2*m 0; 0 0 m];
[nd,nd]= size(M);
% Damping coefficient (Ns/m)
C = 10^5 * [7 -3 0; -3 3.2 -1.4; 0 -1.4 1.4];
% Stiffness coefficient (N/m)
E = 0.209*10^9; I =1.5796*10^-2;
h = 3.6;
K1 = 36*E*I/h^3;
K2 = 36*E*I/h^3;
K3 = 24*E*I/h^3;
K =[K1+K2 -K2 0; -K2 K2+K3 -K3; 0 -K3 C(3,3)];
m1 = M(1,1);
m2 = M(2,2);
m3 = M(3,3);
c1 = C(1,1);
c2 = -C(2,1);
c3 = C(2,2);
c4 = C(2,3);
k1 = K(1,1);
k2 = -K(2,1);
k3 = K(2,2);
k4 = -K(2,3);
force = [ 0 , 0, 0];
f = [z(2); 1/m1 * (force(1,1) - c1 * z(2) + c2 * z(4) - k1 * z(1) + k2 * z(3)); z(4);1/m2 * (force(1,2) + c2 * z(2) - c3 * z(4) + c4 * z(6) + k2 * z(1) - k3 * z(3) + k4 * z(5)) ; z(6); 1/m3 * (force(1,3) + c4 * z(4) - c4 * z(6) + k4 * z(3) - k4 * z(5))] ;
end

Accedi per commentare.

Categorie

Scopri di più su Numerical Integration and Differential Equations in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by