Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
1.Giới thiệu đề tài.
Giải gần đúng phương trình vi phân cấp 2:
y” = f(x, y, y’), ∀x ∈ [a,b]
y(a) = α1, y’(a) = α2
Bằng công thức Euler cải tiến va Runge-Kutta:
Tính nghiệm gần đúng {y1k}, {y2k}.
So sánh với nghiệm chính xác.
2.Phương pháp giải gần đúng phương trình vi phân cấp 2 bằng công thức
Euler cải tiến và công thức Runge – Kutta.
Đặt y1 = y, y2 = y’.
Ta chuyển phương trình vi phân bậc 2 về hệ 2 phương trình vi phân cấp 1:
y’1 = y2
y’2 = f(x, y1, y2)
với điều kiện ban đầu:
y1(a) = α1, y2(a) = α2.
Sử dụng công thức Euler cải tiến hoặc công thức Runge – Kutta giải gần đúng
phương trình vi phân cấp 2:
Công thức Euler cải tiến
K11=h*f1(y2(i))
K12=h*f2(x(i),y1(i),y2(i))
K21=h*f1(y2(i)+K12)
K22=h*f2(x(i)+h,y1(i)+K11,y2(i)+K12)
y1(i+1)=y1(i)+(1/2)*(K11+K21)
y2(i+1)=y2(i)+(1/2)*(K12+K22)
1
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
Công thức Runge – Kutta
K11=h*f1(y2(i))
K12=h*f2(x(i),y1(i),y2(i))
K21=h*f1(y2(i)+0.5*K12)
K22=h*f2(x(i)+0.5*h,y1(i)+0.5*K11,y2(i)+0.5*K12)
K31=h*f1(y2(i)+0.5*K22)
K32=h*f2(x(i)+0.5*h,y1(i)+0.5*K21,y2(i)+0.5*K22)
K41=h*f1(y2(i)+K32)
K42=h*f2(x(i)+h,y1(i)+K31,y2(i)+K32)
y1(i+1)=y1(i)+(1/6)*(K11+2*K21+2*K31+K41)
y2(i+1)=y2(i)+(1/6)*(K12+2*K22+2*K32+K42)
3.Các lệnh thường dùng trong Matlab trong vấn đề giải gần đúng phương
trình vi phân cấp 2 bằng công thức Euler cải tiến và công thức Runge – Kutta.
clear;
xóa tất cả các biến khỏi vùng làm việc.
clc;
xóa cửa sổ lệnh.
disp(‘ ’)
trình bày nội dung của chuỗi ký tự ra màn hình.
for biến điều khiển = giá trị đầu : giá trị cuối,
thực hiện công việc;
end
lệnh for : dùng để thực hiện một công việc cần lặp đi lặp lại theo một quy
luật, với số bước lặp xác định trước.
format long;
hiển thị 14 con số sau dấu chấm.
input(‘’)
dùng để nhập vào một giá trị.
inline()
biến đổi chuỗi thành hàm.
4.Code Matlab cơ bản giải quyết đề tài 19.
4.1.Code tìm nghiệm chính xác phương trình vi phân cấp 2.
clear;
% xoa tat ca cac bien khoi vung lam viec
clc;
% xoa cua so lenh
format long;
% hien thi 14 con so sau dau cham
disp(' Nghiem chinh xac phuong trinh vi phan cap 2')
cua chuoi ky tu ra man hinh
% trinh bay noi dung
2
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
h=input('Nhap buoc nhay h= ');
a=input('Nhap diem dau cua khoang cach ly nghiem a= ');
b=input('Nhap diem cuoi cua khoang cach ly nghiem b= ');
Yk=input('Nhap ham chinh xac y(x)= ');
Yk=inline(Yk);
%bien doi chuoi thanh ham
Fk=input('Nhap ham chinh xac dao ham cua y(x)= ');
Fk=inline(Fk);
n=(b-a)/h;
%bien doi chuoi thanh ham
% chia doan [a,b] thanh n doan nho bang nhau
x(1)=a;
for i=1:n
x(i+1)=x(i)+h;
end
for i=1:n+1;
% tim nghiem y(i), f(i) tai tung gia tri cua x(i)
y(i)=Yk(x(i));
f(i)=Fk(x(i));
end
disp('BANG GIA TRI')
disp('
x
% Trinh bay bang gia tri ra man hinh
y
f
'
)
for i=1:n+1;
disp(
[ x(i) ,
y(i) ,
f(i)
]
)
end
4.2.Code tìm nghiệm gần đúng phương trình vi phân cấp 2 bằng công thức Euler
cải tiến.
clear;
% xoa tat ca cac bien khoi vung lam viec
3
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
clc;
GVGD: Th.s Trịnh Quốc Lương
% xoa cua so lenh
format long;
% hien thi 14 con so sau dau cham
disp('Giai gan dung phuong trinh vi phan cap 2 bang cong thuc EULER CAI
TIEN')
% trinh bay noi dung cua chuoi ky tu ra man hinh
f2=input('Nhap ham f2 theo y1 va y2= ');
trong dau ''
% nhap ham duoi dang chuoi ky tu
f2=inline(f2);
% bien doi chuoi f2 thanh ham f2 theo y1,y2
f1=inline('y2');
% bien doi chuoi 'y2' thanh ham f1 theo y2
h=input('Nhap buoc nhay h= ');
y1(1)=input('Nhap gia tri y(a)= ');
y2(1)=input('Nhap gia tri dao ham cua y(a)= ');
% y1(a)
% y2(a)
a=input('Nhap diem dau cua khoang cach ly nghiem a= ');
b=input('Nhap diem cuoi cua khoang cach ly nghiem b= ');
n=(b-a)/h;
% chia doan [a,b] thanh n doan nho bang nhau
x(1)=a;
for i=1:n
x(i+1)=x(i)+h;
end
for i=1:n+1;
K11=h*f1(y2(i));
% cong thuc EULER CAI TIEN
K12=h*f2(x(i),y1(i),y2(i));
K21=h*f1(y2(i)+K12);
K22=h*f2(x(i)+h,y1(i)+K11,y2(i)+K12);
y1(i+1)=y1(i)+(1/2)*(K11+K21);
y2(i+1)=y2(i)+(1/2)*(K12+K22);
4
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
end;
disp('BANG GIA TRI')
disp('
x
% Trinh bay bang gia tri ra man hinh
y1
y2'
)
for i=1:n+1;
disp(
[ x(i) ,
y1(i),
y2(i)]
)
end
4.3.Code so sánh nghiệm gần đúng trong công thức Euler cải tiến với nghiệm
chính xác.
clear;
% xoa tat ca cac bien khoi vung lam viec
clc;
% xoa cua so lenh
format long;
% hien thi 14 con so sau dau cham
disp('So sanh nghiem gan dung trong cong thuc EULER CAI TIEN voi NGHIEM
CHINH XAC')
% trinh bay noi dung cua chuoi ky tu ra man hinh
f2=input('Nhap ham f2 theo y1 va y2= ');
trong dau ''
% nhap ham duoi dang chuoi ky tu
f2=inline(f2);
% bien doi chuoi f2 thanh ham f2 theo y1,y2
f1=inline('y2');
% bien doi chuoi 'y2' thanh ham f1 theo y2
h=input('Nhap buoc nhay h= ');
y1(1)=input('Nhap gia tri y(a)= ');
%y 1(a)
y2(1)=input('Nhap gia tri dao ham cua y(a)= ');
% y2(a)
a=input('Nhap diem dau cua khoang cach ly nghiem a= ');
b=input('Nhap diem cuoi cua khoang cach ly nghiem b= ');
Yk=input('Nhap ham chinh xac y(x)= ');
Yk=inline(Yk);
%bien doi chuoi thanh ham
Fk=input('Nhap ham chinh xac dao ham cua y(x)= ');
Fk=inline(Fk);
%bien doi chuoi thanh ham
5
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
n=(b-a)/h;
GVGD: Th.s Trịnh Quốc Lương
% chia doan [a,b] thanh n doan nho bang nhau
x(1)=a;
for i=1:n
x(i+1)=x(i)+h;
end
for i=1:n+1;
K11=h*f1(y2(i));
% cong thuc EULER CAI TIEN
K12=h*f2(x(i),y1(i),y2(i));
K21=h*f1(y2(i)+K12);
K22=h*f2(x(i)+h,y1(i)+K11,y2(i)+K12);
y1(i+1)=y1(i)+(1/2)*(K11+K21);
y2(i+1)=y2(i)+(1/2)*(K12+K22);
end;
for i=1:n+1;
% tim nghiem y(i), f(i) tai tung gia tri cua x(i)
y(i)=Yk(x(i));
f(i)=Fk(x(i));
end
disp('BANG GIA TRI')
disp('
x
% Trinh bay bang gia tri ra man hinh
y
y1
[ x(i) , y(i) ,
y1(i), f(i) ,
f
y2'
)
for i=1:n+1;
disp(
y2(i)]
)
end
4.4.Code tìm nghiệm gần đúng phương trình vi phân cấp 2 bằng công thức Runge
- Kutta.
clear;
% xoa tat ca cac bien khoi vung lam viec
6
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
clc;
GVGD: Th.s Trịnh Quốc Lương
% xoa cua so lenh
format long;
% hien thi 14 con so sau dau cham
disp('Giai gan dung phuong trinh vi phan cap 2 bang cong thuc RUNGE KUTTA')
f2=input('Nhap ham f2 theo y1 va y2=');
trong dau ''
% nhap ham duoi dang chuoi ky tu
f2=inline(f2);
% bien doi chuoi f2 thanh ham f2 theo y1,y2
f1=inline('y2');
% bien doi chuoi 'y2' thanh ham f1 theo y2
h=input('Nhap buoc nhay h= ');
y1(1)=input('Nhap gia tri y(a)= ');
y2(1)=input('Nhap gia tri dao ham cua y(a)= ');
% y1(a)
% y2(a)
a=input('Nhap diem dau cua khoang cach ly nghiem a= ');
b=input('Nhap diem cuoi cua khoang cach ly nghiem b= ');
n=(b-a)/h;
% chia doan [a,b] thanh n doan nho bang nhau
x(1)=a;
for i=1:n
x(i+1)=x(i)+h;
end
for i=1:n+1;
K11=h*f1(y2(i));
% cong thuc RUNGE - KUTTA
K12=h*f2(x(i),y1(i),y2(i));
K21=h*f1(y2(i)+0.5*K12);
K22=h*f2(x(i)+0.5*h,y1(i)+0.5*K11,y2(i)+0.5*K12);
K31=h*f1(y2(i)+0.5*K22);
K32=h*f2(x(i)+0.5*h,y1(i)+0.5*K21,y2(i)+0.5*K22);
K41=h*f1(y2(i)+K32);
7
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
K42=h*f2(x(i)+h,y1(i)+K31,y2(i)+K32);
y1(i+1)=y1(i)+(1/6)*(K11+2*K21+2*K31+K41);
y2(i+1)=y2(i)+(1/6)*(K12+2*K22+2*K32+K42);
end;
disp('BANG GIA TRI')
disp('
x
% Trinh bay bang gia tri ra man hinh
y1
y2')
for i=1:n+1;
disp( [ x(i) ,
y1(i),
y2(i)])
end
4.5.Code so sánh nghiệm gần đúng trong công thức Runge - Kutta với nghiệm
chính xác.
clear;
% xoa tat ca cac bien khoi vung lam viec
clc;
% xoa cua so lenh
format long;
% hien thi 14 con so sau dau cham
disp('So sanh nghiem gan dung trong cong thuc RUNGE - KUTTA voi NGHIEM
CHINH XAC')
f2=input('Nhap ham f2 theo y1 va y2=');
trong dau ''
% nhap ham duoi dang chuoi ky tu
f2=inline(f2);
% bien doi chuoi f2 thanh ham f2 theo y1,y2
f1=inline('y2');
% bien doi chuoi 'y2' thanh ham f1 theo y2
h=input('Nhap buoc nhay h= ');
y1(1)=input('Nhap gia tri y(a)= ');
y2(1)=input('Nhap gia tri dao ham cua y(a)= ');
% y1(a)
% y2(a)
a=input('Nhap diem dau cua khoang cach ly nghiem a= ');
b=input('Nhap diem cuoi cua khoang cach ly nghiem b= ');
Yk=input('Nhap ham chinh xac y(x)= ');
8
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
Yk=inline(Yk);
%bien doi chuoi thanh ham
Fk=input('Nhap ham chinh xac dao ham cua y(x)= ');
Fk=inline(Fk);
n=(b-a)/h;
%bien doi chuoi thanh ham
% chia doan [a,b] thanh n doan nho bang nhau
x(1)=a;
for i=1:n
x(i+1)=x(i)+h;
end
for i=1:n+1;
K11=h*f1(y2(i));
% cong thuc RUNGE - KUTTA
K12=h*f2(x(i),y1(i),y2(i));
K21=h*f1(y2(i)+0.5*K12);
K22=h*f2(x(i)+0.5*h,y1(i)+0.5*K11,y2(i)+0.5*K12);
K31=h*f1(y2(i)+0.5*K22);
K32=h*f2(x(i)+0.5*h,y1(i)+0.5*K21,y2(i)+0.5*K22);
K41=h*f1(y2(i)+K32);
K42=h*f2(x(i)+h,y1(i)+K31,y2(i)+K32);
y1(i+1)=y1(i)+(1/6)*(K11+2*K21+2*K31+K41);
y2(i+1)=y2(i)+(1/6)*(K12+2*K22+2*K32+K42);
end;
for i=1:n+1;
% tim nghiem y(i), f(i) tai tung gia tri cua x(i)
y(i)=Yk(x(i));
f(i)=Fk(x(i));
end
disp('BANG GIA TRI')
9
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
disp('
x
GVGD: Th.s Trịnh Quốc Lương
y
y1
f
y2')
for i=1:n+1;
disp( [ x(i) ,
y(i) ,
y1(i),
f(i),
y2(i)])
end
5.Ví dụ minh họa.
5.1.(Trích ví dụ 6.6, trang 78, giáo trình phương pháp tính, tác giả Lê Thái Thanh)
Xét phương trình vi phân cấp hai
Nghiệm chính xác ,
,
với điều kiện ban đầu Bước nhảy h=0.1.
Bằng công thức Euler cải tiến va Runge-Kutta:
Tính nghiệm gần đúng {y1k}, {y2k}.
So sánh với nghiệm chính xác.
Giải
Tìm nghiệm chính xác phương trình vi phân cấp 2.
B1.Nhập code 4.1
B2.Run(F5)
B3.Khai báo:
B4.Ghi nhận kết quả:
10
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
Tìm nghiệm gần đúng phương trình vi phân cấp 2 bằng công thức Euler cải
tiến.
B1.Nhập code 4.2
B2.Run(F5)
B3.Khai báo:
11
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
B4.Ghi nhận kết quả:
So sánh nghiệm gần đúng trong công thức Euler cải tiến với nghiệm chính
xác.
B1.Nhập code 4.3
B2.Run(F5)
12
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
B3.Khai báo:
B4.Ghi nhận kết quả:
Tìm nghiệm gần đúng phương trình vi phân cấp 2 bằng công thức Runge Kutta.
B1.Nhập code 4.4
13
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
B2.Run(F5)
B3.Khai báo:
B4.Ghi nhận kết quả:
So sánh nghiệm gần đúng trong công thức Runge - Kutta với nghiệm chính
xác.
14
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
B1.Nhập code 4.5
B2.Run(F5)
B3.Khai báo:
B4.Ghi nhận kết quả:
15
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
5.2.(Trích ví dụ trong bài giảng thầy Trịnh Quốc Lương).
Xét bài toán Cauchy:
y“(x) = (Mx+5) y2(x) – 2My’(x)+1.2x + M, 1≤x
điều kiện ban đầu
y(1) = 1.3M, y’(1) = 1.8M
Dùng công thức Euler cải tiến, xấp xỉ giá trị của hàm y(t) và y’(t) tại điểm x = 1.2
với bước h = 0.2 và M = 2.7.
Giải
B1.Nhập code 4.2
B2.Run(F5)
B3.Khai báo:
B4.Ghi nhận kết quả:
16
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
5.3.(Trích ví dụ trong bài giảng thầy Trịnh Quốc Lương).
Cho phương trình vi phân cấp 2:
,
với điều kiện ban đầu Bước nhảy h=0.2, M=1.4.
Dùng công thức Euler cải tiến tính gần đúng và .
Giải
B1.Nhập code 4.2
B2.Run(F5)
B3.Khai báo:
B4.Ghi nhận kết quả:
17
Nhóm 24_ để tài 19
Báo cáo bài tập lớn
GVGD: Th.s Trịnh Quốc Lương
TÀI LIỆU THAM KHẢO
1.
2.
3.
4.
5.
Bài giảng chương 6: Giải gần đúng phương trình vi phân, thầy Trịnh Quốc
Lương.
Giáo trình Phương pháp tính, tác giả Lê Thái Thanh.
Các diễn đàn code phương pháp tính.
Bài báo cáo bài tập lớn phương pháp tính của các anh Bùi Minh
Chung(G0804070), Ngô Minh Dũng (G0804121), Trần Quang
Vũ(G0804811).
Tài liệu hướng dẫn ứng dụng nhanh Matlab, tác giả đội “Chúng ta cùng
tiến”.
18
Nhóm 24_ để tài 19