Tải bản đầy đủ (.docx) (18 trang)

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 va RungeKutta

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (217.98 KB, 18 trang )

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



×