1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

18 2,3K 9
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 18
Dung lượng 246,58 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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... 4.1.Code tìm nghiệm chính xác phương trình vi phân cấp 2.. 4.2.Code tìm

Trang 1

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)

Trang 2

 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

Trang 3

disp(' Nghiem chinh xac phuong trinh vi phan cap 2') % trinh bay noi dung cua chuoi ky tu ra man hinh

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); %bien doi chuoi thanh ham

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; % 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') % Trinh bay bang gia tri ra man hinh

disp(' x y f ' )

for i=1:n+1;

disp( [ x(i) , y(i) , f(i) ] )

end

Trang 4

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

clc; % 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= '); % nhap ham duoi dang chuoi ky tu trong dau ''

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)= '); % y1(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= ');

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);

Trang 5

y1(i+1)=y1(i)+(1/2)*(K11+K21);

y2(i+1)=y2(i)+(1/2)*(K12+K22);

end;

disp('BANG GIA TRI') % Trinh bay bang gia tri ra man hinh

disp(' x 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= '); % nhap ham duoi dang chuoi ky tu trong dau ''

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

Trang 6

Fk=input('Nhap ham chinh xac dao ham cua y(x)= ');

Fk=inline(Fk); %bien doi chuoi thanh ham

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);

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') % Trinh bay bang gia tri ra man hinh

disp(' x y y1 f y2' )

for i=1:n+1;

disp( [ x(i) , y(i) , y1(i), f(i) , y2(i)] )

end

Trang 7

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

clc; % 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='); % nhap ham duoi dang chuoi ky tu trong dau ''

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)= '); % y1(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= ');

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);

Trang 8

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;

disp('BANG GIA TRI') % Trinh bay bang gia tri ra man hinh

disp(' x 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='); % nhap ham duoi dang chuoi ky tu trong dau ''

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)= '); % y1(a)

y2(1)=input('Nhap gia tri dao ham cua y(a)= '); % y2(a)

Trang 9

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

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);

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));

Trang 10

f(i)=Fk(x(i));

end

disp('BANG GIA TRI')

disp(' x 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 y ’’−2 y ’+2 y=e 2 x sinx , 0 ≤ x ≤ 1 với điều kiện

ban đầu y (0)=−0.4, y '(0)=−0.6 Bước nhảy h=0.1 Nghiệm chính xác

y1(x )=0.2 e 2 x

(sinx−2 cosx), y2(x )= y1'

(x )=0.2 e 2 x

(4 sinx−3 cosx)

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:

Trang 11

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 Euler cải tiến

B1.Nhập code 4.2

B2.Run(F5)

B3.Khai báo:

Trang 12

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)

Trang 13

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

Trang 14

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

Trang 15

B1.Nhập code 4.5

B2.Run(F5)

B3.Khai báo:

B4.Ghi nhận kết quả:

Trang 16

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ả:

Trang 17

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:

y ’’=5 y ’+ x2y +2 M , 1 ≤ x ≤1.6

với điều kiện ban đầu y (1)=0.6 M , y '(1)=0.5 M 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 y (1.2)y (1.6).

Giải B1.Nhập code 4.2

B2.Run(F5)

B3.Khai báo:

B4.Ghi nhận kết quả:

Trang 18

TÀI LIỆU THAM KHẢO

1 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.

2 Giáo trình Phương pháp tính, tác giả Lê Thái Thanh.

3 Các diễn đàn code phương pháp tính

4 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).

5 Tài liệu hướng dẫn ứng dụng nhanh Matlab, tác giả đội “Chúng ta cùng

tiến”.

Ngày đăng: 21/04/2018, 00:21

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w