- Đăng vào
Giải phương trình vi phân bằng Matlab ode45
Bài hướng dẫn này sẽ giới thiệu các bạn cách giải phương trình vi phân bậc 2 có hệ số là các hằng số bằng Matlab ode45. Ode là một công cụ được mình sử dụng khá thường xuyên để giải các phương trình vi phân trong matlab.
Chúng ta cần nhớ rằng ode45 chỉ có thể giải được phương trình vi phân bậc nhất. Vì vậy các bạn muốn giải phương trình vi phân bậc thì chúng ta phải chuyển về hệ hai phương trình vi phân bậc nhất.
Phương trình vi phân bậc nhất
Phương trình vi phân bậc nhất có dạng:
hay viết ở dạng khác:
Ví dụ: để giải phương trình vi phân bậc nhất với điều kiện ban đầu bằng Matlab Ode45
function first_oder_ode
% SOLVE dx/dt = -3 exp(-t).
% initial conditions: x(0) = 0
t=0:0.001:5; % time scalex
initial_x=0;
[t,x]=ode45( @rhs, t, initial_x);
plot(t,x);
xlabel('t'); ylabel('x');
grid on
function dxdt=rhs(t,x)
dxdt = 3*exp(-t);
end
end
Kết quả:
Giải phương trình vi phân bậc hai
Ví dụ: chúng ta tiến hành giải phương trình vi phân bậc hai sau
Như đã nói ở trên, chúng ta chuyển phương trình vi phân bậc 2 thành hệ hai phương trình vi phân bậc nhất bằng cách đặt ẩn phụ :
Thế vào phương trình (1) chúng ta có hệ
Nếu đặt thì hệ trên có thể viết thành dạng phương trình vi phân bậc nhất của biến
Giải bằng Matlab
function second_oder_ode
% SOLVE d2x/dt2+5 dx/dt - 4 x = sin(10 t)
% initial conditions: x(0) = 0, x'(0)=0
t=0:0.001:3; % time scale
initial_x = 0;
initial_dxdt = 0;
[t,x]=ode45( @rhs, t, [initial_x initial_dxdt] );
plot(t,x(:,1));
xlabel('t'); ylabel('x');
grid on
function dxdt=rhs(t,x)
dxdt_1 = x(2);
dxdt_2 = -5*x(2) + 4*x(1) + sin(10*t);
dxdt=[dxdt_1; dxdt_2];
end
end
Kết quả
Ứng dụng trong mô phỏng
Dưới đây sẽ là ví dụ dùng ode45 giải phương trình vi phân trong mô phỏng hệ vật nặng, lò xo và giảm chấn
Hệ lò xo giảm chấn có 1 bậc tự do, hệ thống bao gồm xe có khối lượng , gắn với lò xo độ cứng và giảm chấn có hệ số . Khi ngoại lực tác động lên xe thì chúng ta cần xác định được vị trí của xe. Áp dụng định luật 2 Newton chúng ta xác định được phương trình động lực học của cơ hệ
Viết lại ở dạng hệ phương trình vi phân bậc nhất bằng cách đặt ẩn phụ :
Thế vào (3) chúng ta được hệ phương trình vi phân bậc nhất
Hay dạng phương trình trạng thái của cơ hệ
Code Matlab
function mass_spring_damper()
clear;
close all;
t_start = 0;
t_end = 6; %final time in seconds.
time_span =t_start:0.001:t_end;
k = 40; % spring stiffness. N/m
m = 5; % mass, kg
c = 31;
initial_position = 0;
initial_speed = 0;
x0 = [initial_position initial_speed];
[t,x]=ode45(@rhs,time_span,x0);
plot(t,x(:,1));
ylim([-.1 .5]);
grid on
%**************************************
% solves m x''+ c x' + k x = f(t)
%**************************************
function xdot=rhs(t,x)
xdot_1 = x(2);
xdot_2 = -(c/m)*x(2) - (k/m)*x(1) + force(t)/m;
xdot = [xdot_1 ; xdot_2 ];
end
%********************
% The forcing function, edit to change as needed.
%********************
function f=force(t)
P = 100; % force amplitude
%f=P*sin(omega*t);
f=10; %unit step
%if t<eps %impulse
% f=1
%else
% f=0;
%end
%f=P*t; %ramp input
end
end
Kết quả