TRƯỜNG ĐẠI HỌC CÔNG NGHỆ - ĐHQGHN
KHOA CƠ HỌC KĨ THUẬT VÀ TỰ ĐỘNG HÓA
BÁO CÁO THỰC HÀNH
KĨ THUẬT MÔ HÌNH MÔ PHỎNG
NĂM 2015
TÊN ĐỀ TÀI
BÀI SỐ 1 : MÔ TẢ QUỸ ĐẠO VIÊN ĐẠN
SVTH : Nhóm 2 - K58H
Khoa
: Cơ học Kỹ Thuật và Tự động hóa
GVHD : PGS-TS Đinh Văn Mạnh
Hà Nội - 2015
1
Lớp K58H
DANH SÁCH SINH VIÊN THAM GIA THỰC HIỆN
1.
2.
3.
4.
5.
6.
7.
Tạ Quang Hưng ( Nhóm trưởng )
Nguyễn Trọng Đức
Nguyễn Như Đạo
Lê Văn Nam
Nguyễn Văn Lâm
Lê Minh Quý
Ngô Văn Cảnh
* * *
Đánh giá của giảng viên :
2
MỤC LỤC
Trang
Mục Lục..................................................................................
A - Giới Thiệu......................................................................3
1. Khát quát chung..................................................................
2. Đối tượng ............................................................................
3. Mục tiêu và nội dung thực hành..........................................
4.Phương pháp nghiên cứu.....................................................
B - Nội Dung: ......................................................................
Chương I : Mô hình toán chuyển động của đạn trong không khí
..............................................................................................5
1. Thành lập hệ phương trình vi phân chuyển động của đạn
..............................................................................................5
2. Phương pháp giải tích................................................7
3. Phương pháp Runge – Kutta 4....................................8
Chương II : Lập sơ đồ khối , thiết kế giao diện đồ họa của
chương trình........................................................................12
Chương III: Hiển thị kết quả bằng đồ thị trên máy tính.......14
3
Chương IV : Code chương trình trên Matlab ......................17
C - Kết luận......................................................................25
TÀI LIỆU THAM KHẢO
4
A - GIỚI THIỆU
MỞ ĐẦU
1.
Khái quát chung
Tên đề tài : Bài số 1 Mô tả quỹ đạo viên đạn
+ Viên đạn có khối lượng m (kg)
+ Khi ra khỏi nòng súng , viên đạn có vận tốc v (m/s) , ở độ cao
h0 (m)
+ Có xét đến lực cản của không khí và ảnh hưởng của gió
2.
Đối tượng
Nghiên cứu chuyển động của đạn trong không khí xây dựng
mô hình mô phỏng quỹ đạo viên đạn trên ứng dụng matlab .
3.
Mục tiêu và nội dung thực hành
-
Hiểu , tính toán xậy dựng được mô hình bài toán
Vận dụng phương pháp Runge-Kutta 4 thực hành trên
Matlab
Đưa ra một số kết quả - nhận xét
Mục tiêu hoạt động nhóm : Rèn luyện kĩ năng làm việc
nhóm , xậy dựng ý tưởng, đóng góp bổ sung – hoàn thiện ,
đoàn kết – hoạt động tích cực đối với mỗi thành viên
-
4.
Phương pháp nghiên cứu
Kết hợp phương pháp nghiên cứu tính toán lý thuyết với
thực nghiệm . Xây dựng hệ phương trình vi phân chuyển động
ba chiều của đạn ,coi đạn như vật thể chuyển động trong không
khí, tiến hành giải mô hình toán học đó theo phương pháp số
với thuật toán Rungu – Kutta trên máy tính cho viên đạn . Phân
tích so sánh kết quả tính toán lý thuyết và thực nghiệm, rút ra
kết luận về khả năng phù hợp , khả năng ứng dụng.
5
B - NỘI DUNG
Chương I
MÔ HÌNH TOÁN CHUYỂN ĐỘNG
CỦA ĐẠN TRONG KHÔNG KHÍ VÀ LỜI GIẢI
1.
Thành lập hệ phương trình vi phân chuyển động
của đạn trong không khí
Một viên đạn được bắn đi trong trọng trường đều
với vận tốc đầu vo nghiêng với phương ngang một góc .
Khối lượng của viên đạn là m , gia tốc trọng trường là g ,
lực cản của không khí tác dụng lên viên đạn là , trong
đó k là hằng số tỷ lệ đã biết và u là vận tốc gió.
•
Phân tích bài toán
Xem viên đạn như một chất điểm chuyển động dưới tác dụng
của lực trọng trường là lực cản không khí và ảnh hưởng của gió
Hệ tọa độ Đềcác :
6
Hệ tọa độ Oxyz cố định trong không khí , là hệ tọa độ chuẩn để
xách định các đặc trưng chuyển động của đạn .
Trong đó :
O trùng với tâm miệng lòng pháo, thiết bị phóng ở thời
điểm trước khi bắn
Ox nằm ngang và nằm trong mặt phẳng chứa vecto vận
tốc đầu của viên đạn và trục Oy
Oy vuông góc với Ox , hướng lên phía trên , thuộc mặt
phẳng đứng
Oz thẳng góc với các trục Ox , Oy , tức là thẳng góc với
vectơ
Viết phương trình vi phân chuyển động dạng vectơ :
(a)
Chiếu đẳng thức vectơ ( a ) lên các trục tọa độ ta nhận được hệ
phương trình vi phân chuyển động :
Sau khi rút gọn ta được hệ phương trình :
(1)
(2)
(3)
Chọn gốc thời gian là lúc viên đạn ra khỏi nòng súng , ta có các
điều kiện như sau :
;;
;;
7
2.
Phương pháp giải tích
Hệ phương trình gồm 3 phương trình độc lập , vậy có thể tích
phân riêng từng phương trình theo các điều kiện đầu tương
ứng.
Trước tiên ta tìm nhờ tích phân phương trình (3)
pháp hạ cấp rồi phân li ta được :
. Nhờ phương
Từ đó : .
Khi thay điều kiện đầu :
, ta có
Do đó
Bây giờ tích phân phương trình vừa nhận được với điều kiện đầu
: ta có kết quả :
Cũng phương pháp tương tự , tích phân phương trình (1) & (2)
với điều kiện đầu : , , ta có kết quả:
với điều kiện đầu : , , ta có kết quả:
Vậy viên đạn chuyển động trong mặt phẳng đứng chứa nòng
sung theo các phương trình :
z=0
3.
Phương pháp số trị
8
Trong phần trước ta đã khảo sát phương pháp giải tích để tìm
nghiệm cho bài toán Cauchy .Với phần này , ta sẽ xét những kĩ
thuật số trị thông dụng phục vụ cho việc lấy tích phân của hệ
các phương trình vi phân thường qua việc biểu diễn nghiệm
dưới dạng bảng các giá trị gần đúng của hàm nghiệm cần tìm .
Sau đó ta sẽ dùng những kĩ thuật này để mô phỏng quỹ đạo
của viên đạn :
•
PHƯƠNG PHÁP RUNGE-KUTTA ( R-K )
Phương trình vi phân thường :
Xét bài toán Côsi :
Để tìm các giá trị gần đúng của nghiệm đúng y(x) của bài toán ,
ta chia thành n đoạn nhỏ bằng nhau bởi các điểm chia :
, i = 0 , 1 ,… , n -1
;
Giả sử đã biết giá trị gần đúng của nghiệm đúng , cần tính giá
trị gần đúng của nghiệm đúng
Muốn thế ta khai triển Taylor nghiệm y(x) của bài toán tại :
,
Trong đẳng thức trên , cho , ta có :
Trong đó
Để tránh tính trực tiếp ,
ta đặt
Trong đó :
9
Nếu chọn ; ta có :
đã biết ;
…
;
Đây là phương pháp Runge-Kutta trên đây có độ chính xác bậc
2.
Nếu bỏ qua số hạng thì ta nhận được công thức Runge-Kutta có
độ chính xác bậc 4 :
đã biết ;
…
;
Hệ phương trình
Bây giờ đối với một hệ phương trình ,xát hai phương trình cho
đơn giản, ta phát biểu bài toán Côsi như sau :
Cho khoảng . Tìm hai hàm số và xác định trên , và thỏa mãn
,
,
10
Trong đó ,là hai hàm số cho trước của x ,y, z còn là hai số thực
cho trước
Phương trình cấp cao
Để cho đơn giản ta xét phương trình cấp hai . Bài toán Côsi
phát biểu như sau :
Cho khoảng [ xo ,X ] . Tìm hàm số y =y(x) . Xác định trên [ x o
,X ] , thỏa mãn :
;
Bài toán này có thể đưa về bài toán đối với một hệ bằng cách
đặt :
.Thật vậy lúc đó ta có :
Do đó ta có hệ :
;;
11
Đó chính là bài toán Côsi đối với một hệ với g(x,y,z) = z .Ta có
thể áp dụng vào bài toán giải hệ.
•
Vận dụng :
Áp dụng kiến thức lý thuyết trên mục trên , vận dụng thực hành
thuật toán Runge – Kutta trên matlab để hệ phương trình.
Hình 1: Code matlab chứa vòng lặp for giải phương trình (1)
theo RK -4
12
Chương II
SƠ ĐỒ KHỐI VÀ GIAO DIỆN ĐỒ HỌA CHƯƠNG TRÌNH
=
=
[ I ] – SƠ ĐỒ KHỐI
13
=
[ II ] GIAO DIỆN ĐỒ HỌA CHƯƠNG TRÌNH
-
Lập trình bằng Matlab GUI
[B]
[A]
[C]
[ A ] Thông tin dữ liệu nhập vào
Khối lượng đạn (kg)
Góc bắn anpha (rad)
Vị trí bắn ở độ cao HO
(m)
Hệ số của lực cản không
khí đối với viên đạn k
Vận tốc khi thoát ra
khỏi nòng súng (m/s)
Vận tốc gió v0
14
[ B ] Vùng đồ thị quỹ đạo
[ C ] Vùng hiển thị thông tin kết quả
tmax
: thời gian để đạn chạm đất (s)
Hmax : độ cao lớn nhất (m)
Lmax : tầm bay xa nhất (m)
Chương III
HIỂN THỊ KẾT QUẢ BẰNG ĐỒ THỊ MÁY TÍNH
[ I ] Nhận xét chung
-
Quỹ đạo viên đạn được mô phỏng bằng phương pháp
Runge –Kutta có quỹ đạo theo hình parabol .
Chịu ảnh hưởng của các thông số dữ liệu đầu vào khác
nhau sẽ có quỹ đạo khác nhau .
[ II ] Ảnh hưởng của một thông số khác nhau nhưng cùng
những điều kiện khác
Hình 1 :Ảnh hưởng của chia khoảng h ( RK-4)
Hình2 : Ảnh hưởng của góc bắn anpha
Hình 3 : Ảnh hưởng của vận tốc gió
Hình 4 : Ảnh hưởng lực sức cản không khí (hệ
số k )
Hình 5 : Ảnh hưởng của độ cao vị trí bắn
( H0)
Chương IV
CODE CHƯƠNG TRÌNH TRÊN MATLAB
[ I ] Chương trình matlab
clc
clear all
% nhap cac dieu kien bai toan
m = 4 ;
g =9.8;
anpha=pi/6;
v0=30;
u0=2;
H = 10;
k=0.001;
% giai phuong trinh vi phan theo R-K 4
h=0.01;
t=0:h:20;
x(1)=0;
z(1)=v0*cos(anpha);
u=@(t,x,z)z;
v=@(t,x,z)-g*k*(z-u0);
xmax=0;
for i=1:(length(t)-1)
k1=h*u(t(i),x(i),z(i));
l1=h*v(t(i),x(i),z(i));
k2=h*u(t(i)+0.5*h,x(i)+0.5*k1,z(i)+0.5*l1);
l2=h*v(t(i)+0.5*h,x(i)+0.5*k1,z(i)+0.5*l1);
k3=h*u(t(i)+0.5*h,x(i)+0.5*k2,z(i)+0.5*l2);
l3=h*u(t(i)+0.5*h,x(i)+0.5*k2,z(i)+0.5*l2);
k4=h*u(t(i)+h,x(i)+k3,z(i)+l3);
l4=h*v(t(i)+h,x(i)+k3,z(i)+l3);
x(i+1)=x(i)+1/6*(k1+2*k2+2*k3+k4);
z(i+1)=z(i)+1/6*(l1+2*l2+2*l3+l4);
i=i+1;
end
y(1)=0;
m(1)=v0*sin(anpha);
f=@(t,y,m)m;
g=@(t,y,m)-g*k*(1/k+m);
ymax=0;
chiso=0;
for i=1:(length(t)-1)
a1=h*f(t(i),y(i),m(i));
b1=h*g(t(i),y(i),m(i));
a2=h*f(t(i)+0.5*h,y(i)+0.5*a1,m(i)+0.5*b1);
b2=h*g(t(i)+0.5*h,y(i)+0.5*a1,m(i)+0.5*b1);
a3=h*f(t(i)+0.5*h,y(i)+0.5*a2,m(i)+0.5*b2);
b3=h*g(t(i)+0.5*h,y(i)+0.5*a2,m(i)+0.5*b2);
a4=h*f(t(i)+h,y(i)+a3,m(i)+b3);
b4=h*g(t(i)+h,y(i)+a3,m(i)+b3);
y(i+1)=y(i)+1/6*(a1+2*a2+2*a3+a4);
m(i+1)=m(i)+1/6*(b1+2*b2+2*b3+b4);
if ymax <= y(i+1)
ymax = y(i+1);
chiso=i+1;
end
if y(i+1)+H >=0
xmax=y(i+1)+H;
imax=i+1;
end
i=i+1;
end
hold on
plot(x,y+H,'r','linewidth',1.5);
plot(x(chiso),ymax+H,'*g');
plot(x(imax),xmax,'*r');
tmax= t(imax)
Hmax=ymax+H
Lmax=x(imax)
ylim([0 ymax+H+5]);
xlim([0 x(imax)+10]);
grid on
[ II ] Chương trình tạo giao diện đồ họa trên matlab GUI
% gom 2 file :
quydaodan.m
va file : quydaodan.fig
function varargout = quydaodan(varargin)
% Begin - Khong sua doan nay
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @quydaodan_OpeningFcn, ...
'gui_OutputFcn', @quydaodan_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback',
[]);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
function quydaodan_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
guidata(hObject, handles);
function varargout = quydaodan_OutputFcn(hObject, eventdata,
handles)
varargout{1} = handles.output;
% --- Close cua so chuong trinh
function dongchuongtrinh_Callback(hObject, eventdata, handles)
dong = questdlg(' Ban muon thoat chuong trinh ?',...
'Close',...
'Yes','No','Yes');
switch dong
case 'Yes'
close
case 'No'
end
% --- Tao luoi
function luoi_Callback(hObject, eventdata, handles)
% --- Run chuong trinh
function chayctrinh_Callback(hObject, eventdata, handles)
g=9.8;
m = get(handles.kluong,'string');
m=str2num(m);
H = get(handles.docaobandau,'string');
H=str2num(H);
v0 = get(handles.vantocbandau,'string');
v0=str2num(v0);
anpha = get(handles.gocban,'string');
anpha =str2num(anpha);
u0 = get(handles.vantocgio,'string');
u0 =str2num(u0);
sok= get(handles.hesok,'value');
switch sok
case 1
k = 0.001;
case 2
k = 0.002;
case 3
k = 0.003;
case 4
k = 0.004;
case 5
k = 0.005;
end
h=0.01;
t=0:h:20;
x(1)=0;
z(1)=v0*cos(anpha);
u=@(t,x,z)z;
v=@(t,x,z)-g*k*(z-u0);
xmax=0;
for i=1:(length(t)-1)
k1=h*u(t(i),x(i),z(i));
l1=h*v(t(i),x(i),z(i));
k2=h*u(t(i)+0.5*h,x(i)+0.5*k1,z(i)+0.5*l1);
l2=h*v(t(i)+0.5*h,x(i)+0.5*k1,z(i)+0.5*l1);
k3=h*u(t(i)+0.5*h,x(i)+0.5*k2,z(i)+0.5*l2);
l3=h*u(t(i)+0.5*h,x(i)+0.5*k2,z(i)+0.5*l2);
k4=h*u(t(i)+h,x(i)+k3,z(i)+l3);
l4=h*v(t(i)+h,x(i)+k3,z(i)+l3);
x(i+1)=x(i)+1/6*(k1+2*k2+2*k3+k4);
z(i+1)=z(i)+1/6*(l1+2*l2+2*l3+l4);
i=i+1;
end
y(1)=0;
m(1)=v0*sin(anpha);
f=@(t,y,m)m;
g=@(t,y,m)-g*k*(1/k+m);
ymax=0;
chiso=0;
for i=1:(length(t)-1)
a1=h*f(t(i),y(i),m(i));
b1=h*g(t(i),y(i),m(i));
a2=h*f(t(i)+0.5*h,y(i)+0.5*a1,m(i)+0.5*b1);
b2=h*g(t(i)+0.5*h,y(i)+0.5*a1,m(i)+0.5*b1);
a3=h*f(t(i)+0.5*h,y(i)+0.5*a2,m(i)+0.5*b2);
b3=h*g(t(i)+0.5*h,y(i)+0.5*a2,m(i)+0.5*b2);
a4=h*f(t(i)+h,y(i)+a3,m(i)+b3);
b4=h*g(t(i)+h,y(i)+a3,m(i)+b3);
y(i+1)=y(i)+1/6*(a1+2*a2+2*a3+a4);
m(i+1)=m(i)+1/6*(b1+2*b2+2*b3+b4);
if ymax <= y(i+1)
ymax = y(i+1);
chiso=i+1;
end
if y(i+1)+H >=0
xmax=y(i+1)+H;
imax=i+1;
end
i=i+1;
end
% --- Hien thi ket qua - ve do thi
Hmax=num2str(ymax+H);
set(handles.docaolonnhat,'string',Hmax);
Lmax=num2str(x(imax));
set(handles.tambayxanhat,'string',Lmax);
tmax=t(imax);
tmax=num2str(tmax);
set(handles.thoigian,'string',tmax);
maudo=get(handles.maudo,'value');
mauxanh=get(handles.mauxanh,'value');
maublue=get(handles.maublue,'value');
hold on
if maudo==1
plot(x,y+H,'r','linewidth',2);
elseif mauxanh==1
plot(x,y+H,'g','linewidth',2);
elseif maublue==1
plot(x,y+H,'b','linewidth',2);
end
plot(x(chiso),ymax+H,'*g');
plot(x(imax),xmax,'*r');
ylim([0 ymax+H+5]);
xlim([0 x(imax)+10]);
batluoi = get(handles.luoi,'value');
if batluoi==1
grid on
else
grid off
end
% --- Restart chuong trinh
function xoa_Callback(hObject, eventdata, handles)
cla;
clc;
clear all;
% -----------------------------------------------------------------function File_Callback(hObject, eventdata, handles)
% -----------------------------------------------------------------function About_Callback(hObject, eventdata, handles)
% -----------------------------------------------------------------function Thanhvien_Callback(hObject, eventdata, handles)
web nhom2.htm
% -----------------------------------------------------------------function Quit_Callback(hObject, eventdata, handles)
function kluong_Callback(hObject, eventdata, handles)
function kluong_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function docaobandau_Callback(hObject, eventdata, handles)
function docaobandau_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
function vantocbandau_Callback(hObject, eventdata, handles)
function vantocbandau_CreateFcn(hObject, eventdata, handles)
if ispc && isequal(get(hObject,'BackgroundColor'),
get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');