Tải bản đầy đủ (.doc) (57 trang)

Chuong 6 .Matlab pot

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 (640.38 KB, 57 trang )

CHƯƠNG 6
GIẢI PHƯƠNG TRÌNH ĐẠO HÀM
RIÊNG BẰNG MATLAB
NỘI DUNG
Bài 1: GIỚI THIỆU SƠ LƯỢC VỀ MATLAB
I. Tổng quan
II. Một số lệnh cơ bản
III. Bài tập
Bài 2 : MỘT SỐ BÀI TOÁN MỘT CHIỀU
I. Bài toán Laplace 1 chiều
II. Bài toán nhiệt một chiều – Bài tập
III. Bậc hội tụ và điều kiện biên Neumann – Bài tập
Bài 3 : MỘT SỐ BÀI TOÁN HAI CHIỀU
I. Bài toán laplace 2 chiều
II. Bài toán nhiệt hai chiều – Bài tập
III. Bậc hội tụ và điều kiện biên Neumann – Bài tập
Bài 1: GIỚI THIỆU SƠ LƯỢC VỀ MATLAB
I. TỔNG QUAN
1.Chương trình :
 Một chương trình Matlab thường được soạn trong các M-file ( các file
có đuôi .m )
 Để chạy các dòng lệnh trong file xyz.m nào đó , ta vào cửa sổ làm
việc và gõ xyz rồi Enter .
Lưu ý : lúc này đường dẫn tới thư mục chứa file xyz.m ( và các file liên quan ) phải
được khai báo trong Current Dicrectory của Matlab . Khi khởi động , thư mục
này mặc định là Word trong chỗ cài Matlab ( thường là C:\MATLAB\Work )
2.Dòng lệnh :
 Các dòng lệnh trong Matlab được thực hiện tiếp nối nhau .Mỗi dòng
lệnh thông thường có thể có dấu “ ; ” ở cuối hoặc không .Nếu dòng lệnh không có
dấu “ ; ” ở cuối thì kết quả sẽ được xuất ra . Trong trường hợp không muốn nhìn
các kết quả trung gian mà chỉ xem kết quả cuối cùng ta sử dụng dấu “ ; ” cho các


dòng lệnh mà ta không muôn xem kết quả .
Ví dụ : Dòng lệnh x=1+2 sẽ xuất ra x=3 .Tuy nhiên dòng lệnh x=1+2;
sẽ không xuất ra gì hết ( mặc dù giá trị của biến x bây giờ là 3).
 Nếu muốn loại bỏ một dòng lệnh khi chạy chương trình , ta có thể để
dấu % ở đấu dòng lệnh . Thông thường dấu % được sử dụng để ghi các chú thích
( chỉ dùng cho người đọc máy không thực thi ).
3.Hàm số :
 Ta có quyền viết sin(2) vì hàm sin là một hàm đã có sẵn trong thư
Viện Matlab . ngoài ra ta có quyền định nghĩa thêm các hàm mới , và sau khi định
nghĩa thì ta có quyền sử dụng các hàm mới này y hệt như các hàm cơ bản như
hàm sin.
 Hàm xyz được viết trên file xyz.m , có cú pháp kiểu như
Function a=xyz(b,c)
% day la ham xyz
Trong đó b,c là các dữ liệu nhập vào , a là giá trị trả về ( trong chương trình sẽ có ít
nhất một lệnh gán , chẳn hạn a=b+c; ) , dòng chữ day la ham xyz là chú thích về
công dụng của hàm xyz.
 Để xem công dụng của một hàm xyz ( là hàm có sẵn trong thư viện
hoặc do ta định nghĩa ), ta vào cửa sổ làm việc và gõ help xyz rồi Enter .Ta sẽ
được xem chú thích file xyz.m
4.Biến số :
 Các biến được ký hiệu bằng một ký tự hoặc một chuỗi ký tự.
Matlab phân biệt chữ thường và chữ hoa .
 Các biến thông thương được định nghĩa trong một file được gọi
là biến địa phương ( local variable).Matlab cũng cho phép sử dụng một số biến toàn
cục (global variable).Biến toàn cục xx phải được khai báo global xx
trong tất cả các file mà xx xuất hiện , trong đó một file định nghĩa xx , chẳng hạn
gán xx=3.
 Biến i và j được mặc định là số ảo đơn vị ( i^2=1 ) Tuy nhiên ,nếu ta
dùng lệnh gán i=3 thì biến i mang giá trị 3.

II. MỘT SỐ LỆNH CƠ BẢN :
Thư viện sẵn có của Matlab rất phong phú . Nói chung có thể tự học các lệnh
trong Matlab một cách dễ dàng bằng cách vào phần Help ( bấm F1 ) của chương
trình .Trong các chương trình ở phần sau ta chỉ cần một số rất ít các lệnh dưới đây.
1.Lệnh gán: Có dạng x=y .Chý ý rằng để thực hiện lệnh gán thì x không cần
phải khai báo trước , mà cũng không cần có cùng kiểu dữ liệu với y . Lệnh này đơn
giản làm cho x trở thành một copy của y.
2.Các lệnh trên Matrận và Vector :
Ma trận :
 Lệnh A(m,n) trả về phần tử dòng m . cột n của ma trận A.
 Lệnh A’ sẽ chuyển A thành
t
A

 Lệnh A=zeros(m,n) sẽ cho A là ma trận 0 có m dòng và n cột .Tương
tự cho lệnh ones(m,n).
 Lệnh size(A) sẽ cho số dòng và số cột của A .
 Lệnh B=f(A) sẽ cho ma trận B có cùng cỡ với ma trận A và
B(m,n)=f(A(m,n)).
 Lệnh A+B, A*B cho phép cộng và nhân ma trận.
 Lệnh A^(-1) cho phép nghịch đảo ma trận A
Vectơ : ta có thể dùng lại các lệnh của matrận ngoài ra
 Lệnh X=[a1,a2,a3] sẽ cho vectơ X có X(n)=an.Lưu ý chỉ số n đánh từ 1
 Lệnh X=[a,b] sẽ cho vectơ X=[a,a+1, ,b], trong đó a,b là các số nguyên
 Lệnh A\b tương đương với A^(-1)*b.
 Lệnh norm(X,p) cho chuẩn của X theo
p
l
. Thông thường ta dùng
norm(X) tương đương norm(X,2) là chuẩn Euclide , và norm(X,inf) là chuẩn sup.

3.Các lệnh cấu trúc :
 Lệnh if có dạng
if ( biểu thức logic)
( Các dòng lệnh )
elsc
( Các dòng lệnh )
end
Lưu ý là elsc có thể bỏ đi để được dạng thu gọn if end. Trong các biểu thức
logic, ta có thể dùng các toán tử so sánh như == (equal), ~= ( not equal), >=, <=,>,<,
và các toán tử logic như & (and), | (or),
 Lệnh for có dạng :
for i:=a:b
( Các dòng lệnh )
end
Ở đây ban đầu i=a , sau mỗi bước lặp i sẽ được tăng lên 1 , và i=b tại vòng lặp cuối
cùng.
 Lệnh while có dạng
While ( biểu thức logic)
( Các dòng lệnh )
end
Vòng lặp sẽ dừng khi biểu thức logic trả về giá trị 0 ( sai ).
4.Vẽ hình :
Matlab cung cấp rất nhiều công cụ vẽ hình , tuy nhiên ta có thể dùng một số lệnh
đơn giản cho phép vẽ hình từ dữ liệu rời rạc
Trước tiên ta có một số lệnh vẽ hình trong 2 chiều :
 Lệnh plot(X,Y) trong đó X,Y là hai vector có cung cỡ , sẽ vẽ bằng
cách nối các điểm có tọa độ ( X(n),Y(n)).
 Một số option ( có hoặc không sau lệnh plot ) : Ta có thể dùng
xlabel(‘x’),ylabel(‘f(x)’) để ghi chú cho trục hoành và trục tung .Ta có thể dùng
title(‘Tua de hinh ve’) để thêm tựa đề cho một hình . ta cũng có thể định trước

miền hiển thị , chẳn hạn lệnh axis([ 0 1 2 3]) sẽ chỉ hiển thị phần hình vẽ trên hình
vuông [0,1]x[2,3]. Nếu muốn đồ thị có màu đỏ chẳn hạn , ta dùng plot(X,Y,‘r’).
 Trong trường hợp muốn vẽ nhiều hình , ta phải gọi các lệnh vẽ hình
khác nhau chẳng hạn:
figure(1)
plot(X1,Y1,‘r’)
figure(2)
plot(X2,Y2,‘b’)
Khi đó ta sẽ co hai hình vẽ phân biệt .Nêu ta không có các lệnh figure,Matlab sẽ
mặc định ta đang vẽ trên figure(1) và do đó ,nếu ta vẽ nhiều hình thì cũng chỉ có
hình cuối cùng được lưu lại .
 Các lệnh hold on và hold off cho Matlab biết ta muốn giữ nguyên
hiện trạng đang có của một hình và thực hiện các lệnh đè lên, chẳn hạn:
figure(2)
plot(X2,Y2,‘r’)
hold on
plot(X2,Y2,‘r’)
hold off
Sẽ vẽ đồ thị của (X1,Y1) bằng màu đỏ và đồ thị ứng với (X2,Y2) bằng màu xanh
trên cùng một hình vẽ .Nếu không có các lệnh hold on, hold off , thì chỉ có đồ thị
thứ hai được vẽ lại .
 Ta cũng có thể dùng lệnh : plot(X1,Y1,“r’,X2,Y2,‘b’) để vẽ đồ thị
tương ứng với (X1,Y1) bằng màu đỏ và đồ thị ứng với (X2,Y2) bằng màu xanh trên
cùng một hình vẽ .Cách vẽ này thương dùng để so sánh hai ( hoặc nhiều) hàm số với
nhau .
 Lệnh surf(X,Y,Z) sẽ vẽ bằng cách nội suy tuyến tính các điểm
(X(m),Y(n),Z(n,m)), trong đó X,Y là hai vector và Z là ma trận với cở tương
thích .Lệnh surfc(X,Y,Z) có chức năng tương tự , nhưng thêm “ cái bóng” xuống
đáy đồ thị . Lưu ý : các lệnh khác cho trương hợp 2 chiều vẫn dùng được cho
trường hơp 3 chiều

5.Một số lệnh khác:
 Lệnh clear all dùng để xóa tất cả các lưu trữ tạm của Matlab .nó
thường được dùng để bắt đầu file.m chứa chương trình chính của chúng ta ( để mỗi
lần chạy thì không bị ảnh hưởng bởi các lần chạy trước đó ).
 Lệnh disp(‘thong bao’) dùng để xuất các thông báo
Như chúng ta sẽ thấy ,Matlab la một ngôn ngữ lập trình rất dễ sử dụng , đặc biệt
nếu ta đã biết sử dụng Pascal. Nó cho phép làm được khá nhiều việc trong toán dựa
trên một số rất ít các lệnh.
III. BÀI TẬP
Bài 1.1: Vẽ đồ thị hàm số f(x)= x^2 + sin(x) trên đoạn [0;1] bằng cách lấy 11 điểm
1
; 1,10
10
i
i
x i

= =
.Yêu cầu
 Định nghĩa hàm f(x)= x^2 + sin(x) riêng trong file f.m . Sau đó vẽ đồ
thị hàm số trong file bai1.m
 Trên đồ thị ghi chú trục hoành là “ x ”, trục tung là “ x^2 + sin(x) ”;
đặt tựa đề là “ Đồ thị hàm số f(x)= x^2 + sin(x) ”
Chương trình Matlab: ( Các file có trong thư mục bai1.1.m )
% file f.m
function a=f(x);
a=x^2+sin(x);
%file bai1.m
clear all
N=10;

X=[0:N]*1/N;
Y=zeros(1,N+1);
for i=1:(N+1)
Y(i)= f(X(i));
end
plot(X,Y);
xlabel('x');
ylabel('x^2+sin(x)');
title('Do thi ham so f(x)=x^2+sin(x)');
Chạy chương trình : Các file này đã có sẵn trong thư mục bai1.1 . để chạy
chương trình ta làm từng bước sau.
 Mở cửa sổ làm việc của Matlab.
 Vào ô có chữ Current Directory, ghi đường dẫn chỉ tới thư mục
bai1.1 hay Ta cũng có thể kích vào dấu ….để Matlab chọn cây thư mục rồi chọn thư
mục bai1.1.
 Tới dòng >> trên cửa sổ làm việc , gõ bai1, rồi Enter. Ta sẽ thu được hình
vẽ như mong muốn.
 Để lưu hình vẽ này váo tính , ta mở hình vẽ đó , Vào file\Save As , rồi đặt
tên và chọn định dạng thích hợp ( chẳng hạn .bmp hoặc .eps ) . Hình vẽ này sẽ
được lưu vào thư mục hiện hành bai1.1.
Kết quả sau khi chạy chương trình bai1.1
Bài 1.2: Ta biết rằng
1
2.( 1)
sin( ) ,0 1,
.
n
n
x n x x
n

π
π

=

= < <

Theo nghĩa trong
2
(0,1)L
. Yêu cầu
 Viết file s.m để định nghĩa hàm s(x) như sau :
1
2.( 1)
( ) sin( )
.
n
M
n
s x n x
n
π
π
=

=

Trong đó M là biến toàn cục (global )
 Viết file bai 1.2.m , trong đó định nghĩa M=20 . Trên đoạn [ 0,1] lấy N+1
điểm

1
; 1,
10
i
i
x i N

= =
với N=100 .Vẽ đồ thị s(x) và y= x trên cùng một hình vẽ .
 Tính sấp xỉ các sai số
2
(0;1)
( )
L
s x x−

(0;1)
( )
L
s x x


dựa trên các dữ
liệu rời rạc tại các điểm
x
i
. Nêu nhận xét
Hướng dẫn : Để tính sai số ta dùng các xấp xỉ

2

1
1
22
1
0
1
( ) ( ) . ( )
1
N
i i
L
i
s x x s x x dx s x x
N
+
=
− = − ≈ −
+



[0,1]
( ) sup ( )
L
x
s x x s x x


− = −
Chương trình Matlab: ( Các file có trong thư mục bai1.2.m )

% file s.m
function a=s(x);
global M
a=0;
for n=1:M
a=a+2*(-1)^(n+1)/n/pi*sin(n*pi*x);
end
%file bai2.m
clear all
global M
M=20;
N=100;
X=[0:N]*1/N;
Y=zeros(1,N+1);
for i=1:(N+1)
Y(i)= s(X(i));
end
plot(X,X,'r',X,Y,'b');
xlabel('x');
title('Plots of y=s(x) (blue)and y=x (red)');
disp('error in L^2');
err2=norm(X-Y)/sqrt(N+1)
disp('error in L^infinity');
errsup=norm(X-Y,inf)
Kết quả sau khi chạy chương trình bai1.2
Sai số : err2 = 0.1242 , errsup =1.0000
Nhận xét : Sự xấp xỉ trong
2
L
khá tốt nhưng xấp xỉ trong

L

thì không tốt , nguyên nhân
là tại x = 1 thì s(x) = 0.
……………………….
Bài 2: MỘT SỐ BÀI TOÁN MỘT CHIỀU
I. BÀI TOÁN LAPLACE 1 CHIỀU
1. Bài toán : Tìm hàm u(x) trên [0;1] thỏa mãn

''( ) ( ), [0;1]
(0) ; (1)
0 1
u x f x x
u a u a

= ∈

= =

2.Phân rã bài toán:
Cho
; 1/n h N
x
+
∈ = = ∆¢
. Với
( )f x
đã cho
Ta chia đoạn [0;1] thành N đoạn độ dài h bởi N+1 điểm
1

, 1,2, , 1.
i
x i N
i
N

= = +
Ta sẽ tính xấp xỉ
[ ]
1 2 1 1 2 1
( ), ( ), , ( ) [ , , , ]
t
N N
U u x u x u x U U U
+ +
= =
.Có 2 trường
hợp
Trường hợp điểm biến : Dựa vào điều kiên biên với i = 1 và i = N + 1 ta có
1 0
( )u x a=
,
1 1
( )
N
u x a
+
=
Vậy
0 1

(1) ; ( 1)U a U N a= + =
Sử dụng xấp xỉ Taylor bậc một ta có :
2 1 1
( ) ( ) '( ).u x u x u x h− ≈

Từ đó suy ra :
2 1
U U−
Sử dụng xấp xỉ Taylor bậc hai :
2
2 1 1 1
( ) ( ) '( ). ''( ).
2
h
u x u x u x h u x− ≈ +

Từ đó suy ra :
2 1
U U−
Trường hợp điểm trong : Với
2,i N=
,
Ta sử dụng công thức xấp xỉ :
2
( ) 2 ( ) ( )
"( )
u x h u x u x h
u x
h
− − + +


Và thu được :
2
1 1
( ) 2 ( ) ( ) ( ).
i i i i
u x u x u x f x h
− +
− + ≈
Vậy
2
( 1) 2 ( ) ( 1) ( ).U i U i U i f x h− − + + =
Tóm lại ta có : AU = b
Trong đó
1 1 0 0 0 0 0
1 2 1 0 0 0 0
0 1 2 1 0 0 0 0

0 0 0 0 0 1 2 1
0 0 0 0 0 0 1
A

 
 ÷

 ÷
 ÷

=
 ÷

 ÷
 ÷

 ÷
 ÷
 
;
0
2
2
2
3
2
1
( ).
( ).

( ).
N
a
f x h
f x h
b
f x h
a
 
 ÷
 ÷
 ÷
=

 ÷
 ÷
 ÷
 ÷
 ÷
 
Hệ phương trình này có nghiệm duy nhất
1
U A b

=
3.Chương trình Matlab:
Bài tập 2. 1 : Xét bái toán

[ ]
2
"( ) sin( ) , 0;1
(0) 0; (1) 0
u x x x
u u
π π

= − ∈

= =

Phương trình này có nghiệm chính xác là
( ) sin( )
ex
u x x

π
=
.Chương trình dưới đây sẽ giải
xấp xỉ phương trình trên bằng cách phân rã với N= 20 và so sánh với nghiệm chính xác .
Ta chia đoạn [0,1] thành
20N
=
đoạn như sau :
1 2 1
1
0, , , 1
+
= = =
N
x x x
N

1
=h
N
Tương tự bài toán (2.1) với
0
1
2
0
0
( ) sin( )f x x
α
α
π π

 =

=


= −

Sử dụng chương trình matlab để giải hệ phương trình
Chương trình Matlab: ( Các file có trong thư mục bai2.1.m )
% Tao file f.m
function a=f(x);
a=-pi^2*sin(pi*x);
% Tao File uex.m
function a= ucx(x);
% the exact solution
a=sin(pi*x);
% Chuong trinh chinh file bai 2.1.m
clear all
N=20;
h=1/N;
X=[0:N]*h;
a0=0;
a1=0;
%create vector b
b=zeros(N+1,1);
b(1)=a0;
b(N+1)=a1;
for i=2:N
b(i)=h^2*f(X(i));
end

%create matrix A
A=zeros(N+1,N+1);
A(1,1)=1;
A(N+1,N+1)=1;
for i=2:N
A(i,i)=-2;
A(i,i-1)=1;
A(i,i+1)=1;
end
%solve AU=b
U=A\b;
% The exact solution Uex=[uex(x(1)), ,uex(x(N+1))]
Uex=zeros(N+1,1);
for i=1:N+1
Uex(i)=uex(X(i));
end
%plot U and Uex on a same figure
plot(X,U,'b',X,Uex,'r');
xlabel('x');
title('The numerical solution (blue) and the exact solution(red)');
%error
disp('error in norm L^2 and in norm sup')
err2=norm(U-Uex)/sqrt(N+1)
errmax=norm(U-Uex,inf)
Kết quả sau khi chạy chương trình Matlab2.1
Sai số : err2 = 0.0014 và errmax = 0.0021
Bài tập 2 .2: Tìm nghiệm gần đúng bài toán
( ) ( ) (1 )cos
(0) 1
(1) 1

′′
− = +


=


= −

u x u x x
u
u
π π
(Bài toán có nghiệm là
( ) cosu x x
π
=
)
Giải : Ta chia đoạn [0,1] thành
10
=
N
đoạn như sau :
1 2 1
1
0, , , 1
+
= = =
N
x x x

N

1
=h
N
Tương tự bài toán (2.1) với
0
1
1
1
( ) (1 )cosf x x
α
α
π π
=


= −


= +

Chương trình Matlab: ( Các file có trong thư mục bai2.2.m )
% Tao file f.m
function a=vp(x);
a=(1+pi^2)*cos(pi*x);
% Tao File uex.m
function a= ucx(x);
a=cos(pi*x);
% Chuong trinh chinh file bai 2.2.m

clear all
N=10;
h=1/N;
X=[0:N]*h;
a0=1;
a1=-1;
% Tao vecto b
b=zeros(N+1,1);
b(1)=a0;
b(N+1)=a1;
for i=2:N
b(i)=(-1)*h^2*f(X(i));
end
% Tao ma tran A
A=zeros(N+1,N+1);
A(1,1)=1;
A(N+1,N+1)=1;
for i=2:N
A(i,i)=(-1)*(2+h^2);
A(i,i-1)=1;
A(i,i+1)=1;
End
%solve AU=b
U=A\b;
Uex=zeros(N+1,1);
for i=1:N+1
Uex(i)=uex(X(i));
end
saiso=norm(U-Uex)/sqrt(N+1)
saisomax=norm(U-Uex,inf)

plot(X,U,'r',X,Uex,'b');
Kết quả sau khi chạy chương trình Matlab2.2:
II. BÀI TOÁN NHIỆT MỘT CHIỀU
1. Bài Toán :Tìm hàm
( , )u x t
trên [0,1]
×
[0,T] thỏa mản :
0
1
0
( , )
(0, ) ( )
(1, ) ( )
( ,0) ( )
t xx
u u f x t
u t g t
u t g t
u x u x
− =


=


=


=


Trong đó
0 1
(0, ) ( ), (1, ) ( )u t g t u t g t= =
gọi là điều kiện ở biên
Xét phương trình sau :
1
0
(0, ) , (1, )
( ,0)
t xx
t t
x
x
u u
u t e u t e
u x e
+
− =


= =


=

với
0 1, 0 1x t≤ ≤ ≤ ≤
Hãy tính u(1, x) với
1/10x t∆ = ∆ =

, trong đó tại biên x = 0 sử dụng xấp xỉ

2 1 1
( , ) ( , ) ( , ).
r r x r
u t x u t x u t x h− ≈
Vẽ lời giải số và lời giải chính xác ( là
t x
e
+
) trên cùng một hình vẽ .Tính sai số
Hãy đưa ra một xấp xỉ khác tại biên x=0 để có xấp xỉ tốt hơn . Vẽ hai lời giải
số và lời chính xác cùng một hình vẽ .Tính các sai số
2.Phân rã bài toán :
Cho
1
, , ,
T
M N Z h x k t
N M
+
∈ = = ∆ = = ∆
( Ở đây T=1 )
Ta chia [0,T] thành N phần bằng nhau bởi N+1 điểm chia
( 1). , 1, , 1
i
x i h i N= − = +
, Và trên [0;T] thành M phần bằng nhau bởi M+1 điểm
chia
( 1). , 1, , 1

r
t r k r M= − = +
Tính xấp xỉ u(t,x) nghĩa là tính
[ ]
1 2 1
, , ,
M
U U U U
+
=

Với
[ ]
1 2 1
( , ), ( , ), , ( , ) , 1,2, , 1.
t
r r r r N
U u t x u t x u t x r M
+
= = +
Trong đó
[ ]
1 1 2 1
(0, ), (0, ), , (0, )
N
U u x u x u x
+
=
Chính là điều kiện biên , Vì vậy trong
trường hợp này

1
(0, )
x
U u x e= =
Với r = 2 trở đi ta tính như sau :
Trường hợp điểm biên :Với i =1 và i = n+1 ta có
1
1
( , ) ( ,1)
r
t
r N r
u t x u t e
+
+
= =
Suy ra :
1
( 1) ( ,1)
r
t
r r
U N u t e
+
+ = =
Sử dụng xấp xỉ Taylor bậc một ta có :

2 1 1
( , ) ( , ) ( , ). ( ,0). .
r

t
r r x r x r
u t x u t x u t x h u t h e h− = = =
Suy ra :
(2) (1) .
r
t
r r
U U e h− ≈
Sử dụng xấp xỉ Taylor bậc hai ta có :
2 2
2 1 1 1 1
( , ) ( , ) ( , ). ( , ). . ( , ).
2 2
r
t
r r x r xx r t r
h h
u t x u t x u t x h u t x e h u t x− = + = +

1 1 1 1
( , ) ( , ) ( , ).
r r t r
u t x u t x u t x k

− ≈
.
Suy ra
2 2
2 1 1 1

( , ) (1 ) ( , ) . ( , ).
2 2
r
t
r r r
h h
u t x u t x e h u t x
k k

− + = +
Hay :
2 2
1
(2) (1 ) (1) . (1)
2 2
r
t
r r r
h h
U U e h U
k k

− + ≈ −
Trường hợp điểm trong : Với i = 2,3,….,N
Ta sử dụng công thức xấp xỉ
1
1 1
2
( , ) ( , )
( , )

( , ) ( , ) 2 ( , )
( , )
r i r i
t r i
r i r i r i
xx r i
u t x u t x
u t x
k
u t x u t x u t x
u t x
h

+ −





+ −



;
;
Thế vào rút gọn ta có
2 2
1 1 1
( , ,) 2 ( , ) ( , ) ( , ), 2 , 2
r i r i r i r i

h h
u t x u t x u t x u t x i N r M
k k
− + −
 
− + + − ≤ ≤ ≤ ≤
 ÷
 
;
Do đó ta có :
2 2
1
( 1) 2 ( ) ( 1) ( )
r r r r
h h
U i U i U i U i
k k

 
− − + + + ≈ −
 ÷
 
Như vậy :
Trường hợp xấp xỉ Taylor bậc 1 ta có hệ phương trình
.
r r
AU b=
Với
1 1 0 0 0 0 0
1 1 0 0 0 0

0 1 1 0 0 0 0

0 0 0 0 0 1 1
0 0 0 0 0 0 1
A
λ
λ
λ

 
 ÷

 ÷
 ÷

=
 ÷
 ÷
 ÷

 ÷
 ÷
 
;
2
2
h
k
λ
= +

,
2
1
2
1
1
.
. (2)


. ( )
r
r
t
r
r
t
e h
h
U
k
b
h
U N
k
e


+
 

 ÷
 ÷

 ÷
 ÷
 ÷
=
 ÷
 ÷
 ÷

 ÷
 ÷
 
Trường hợp xấp xỉ Taylor bậc 2 ta có hệ phương trình
.
r r
AU b=
Với
2
(1 ) 1 0 0 0 0 0
2
1 1 0 0 0 0
0 1 1 0 0 0 0

0 0 0 0 0 1 1
0 0 0 0 0 0 1
h
k
A

λ
λ
λ
 
− +
 ÷
 ÷

 ÷
 ÷

=
 ÷
 ÷
 ÷

 ÷
 ÷
 
;
2
2
h
k
λ
= +
,
2
1
2

1
2
1
1
. (1)
2
. (2)


. ( )
r
r
t
r
r
r
t
h
e h U
k
h
U
k
b
h
U N
k
e




+
 

 ÷
 ÷
 ÷

 ÷
 ÷
=
 ÷
 ÷
 ÷
 ÷

 ÷
 ÷
 ÷
 
Hệ phương trình có nghiệm duy nhất
1
r r
U A b

=
3.Chương trình Matlab : ( Các file có trong thư mục bai2.3.m )
%tao file ux0.m
function a=ux0(t);
a=exp(t);

%tao file uex.m
function a=uex(t,x);
a=exp(t+x);
%tao file u1.m
function a=u1(t);
a=exp(t+1);
%tao file u0.m
function a=u0(x);
a=exp(x);
%tao file chinh bai2.3.m
clear all
T=1; M = 10; k=T/M; N=10; h = 1/N;
X = [0:N]*h;% vecto khong gian
R = [0:M]*k % vecto thoi gian
% dieu kien dau U1
U=zeros (N+1,1);
for i=1:(N+1)
U(i)=u0(X(i));
end
% tinh nghiem so U tai t =T
for r=2:(M+1)
%tao ma tran A va vecto b
A = zeros(N+1,N+1);
A(1,1)=-1; A(1,2)=1; A(N+1,N+1)=1;
b=zeros(N+1,1);
b(1)=ux0(R(r))*h; b(N+1)=u1(R(r));
for i=2:N
A(i,i-1)=-1;
A(i,i)=2+h^2/k;
A(i,i+1)=-1;

b(i)=U(i)*h^2/k; % o day U la nghiem tai t = R(r-1)
end
%giai AU=b
U = A\b;
end
%xap xi bac hai
% dieu kien dau U1
U1=zeros(N+1,1);
for i=1:(N+1)
U1(i)=u0(X(i));
end
%tinh nghiem so U1 tai t+T
for r=2:(M+1)
% tao ma tran A va vecto b
A1=zeros(N+1,N+1);
A1(1,1)=1+h^2/(2*k);A1(1,2)=-1;A1(N+1,N+1)=1;
b1=zeros(N+1,1);b1(1)=-ux0(R(r))*h+U1(1)*h^2/(2*k);b1(N+1)=u1(R(r));
for i=2:N
A1(i,i-1)=-1;
A1(i,i)=2+h^2/k;
A1(i,i+1)=-1;
b1(i)=U1(i)*h^2/k; % o day U1 la nghiem tai t =R(r-1)
end
% Giai AU = b
U1=A1\b1;
end
%tinh nghiem chinh xax Uex=[uex(x(1)), uex(x(N+1))]
Uex=zeros(N+1,1);
for i=1:(N+1)
Uex(i)=uex(T,X(i));

end;
% ve U, U1 va Uex tren cung mot hinh
plot(X,U,'b',X,U1,'k',X,Uex,'r');
xlabel('x');
title('Nghiem so xap xi bac 1 (net cham dut, bac 2 (net dut) va nghiem chinh xax
(net lien))')
% sai so
disp ('Sai so theo chuan L^2 va chuan sup')
err1=norm(U-Uex)/sqrt(N+1)
errmax1=norm(U-Uex,inf)
err2 = norm(U1-Uex)/sqrt(N+1)
errmax2 = norm (U1-Uex,inf)

Kết quả sau khi chay chương trình:
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
2.5
3
3.5
4
4.5
5
5.5
6
6.5
7
7.5
x
Nghiem so xap xi bac 1 (net cham dut, bac 2 (net dut) va nghiem chinh xax (net lien))
Sai so theo chuan L^2 va chuan sup
err1 = 0.1089 , errmax1 = 0.1721

err2 = 0.0516 , errmax2 = 0.0680
Bài tập 2.4 : Tìm nghiệm gần đúng bài toán
( )
2
1 4 sin(2 ), ( , ) (0,1) (0,1)
(0, ) (1, ) 0 [0,1]
( ,0)=sin(2 ) [0,1]
t
t xx
u u e x x t
u t u t t
u x x x
π π
π

− = + ∈ ×


= = ∈





Với nghiệm chính xác
( , ) sin(2 )=
t
u x t x e
π
Giải:

Tương tự như bài toán (2.1.1)
+ Ta chia [0,T] thành M đoạn
1 2 3 1
0, , 2 , ,
M
T T
t t t t T
M M
+
= = = =
+ Ta chia [0,1] thành N đoạn
1 2 1
1
0, , , 1
N
x x x
N
+
= = =
Đặt
1
,
T
k h
M N
= =
với
1T =
,
30, 10N M= =

Với
( )
2
0 1 0
( , ) 1 4 sin(2 ), ( ) ( ) 0, ( ) sin(2 )
t
f x t e x g t g t u x x
π π π
= + = = =

Ta sử dụng công thức xấp xỉ
2
( ) ( )
( )
( ) ( ) 2 ( )
( )
u x h u x
u x
h
u x h u x h u x
u x
h
+ −





+ + − −


′′


;
;
Và đưa đến hệ phương trình
r r
AU b=
Với
2
2
2
1 0 0 0 0
1 2 1 0 0
0 1 2 1 0

0 1 2 1
0 1
h
k
h
A
k
h
k
 
 
 
− + −
 

 
 
− + −
=
 
 
 
 
− + −
 
 
 
 
2 2
2 2
0 2 2 1 1 1
( ), ( , ) ( , ), , ( , ) ( , ), ( )
r r r r N r N r r
h h
b g t h f x t u x t h f x t u x t g t
k k
− −
 
= + +
 
 
Sử dụng matlab để giải hệ phương trình trên
Chương trình Matlab:( Các file có trong thư mục bai2.4.m )
% Tao file vp.m
function a=vp(t,x);

a=(1+4*pi^2)*exp(t)*sin(2*pi*x);
%tao file g0.m
function a=g0(t);
a=0;
%tao file g1.m
function a=g1(t);
a=0;
%tao file u0.m
function a=u0(x);
a=sin(2*pi*x);
%tao file uex.m
function a=uex(t,x);
a=exp(t)*sin(2*pi*x);
%tao file chinh bai2.4.m
clear all
N=20;M=10;h=1/N;T=1;k=T/M;
X=[0:N]*h;% grid of space
R=[0:M]*k;% grid of space
% initial condition
U=zeros(N+1,1);
for i=1:(N+1)
U(i)=uex(0,X(i));
end
% computer the numerical solution U at t=T
for r=2:(M+1)
% create matrix A and vector b
A=zeros(N+1,N+1);
b=zeros(N+1,1);
A(1,1)=1;
A(N+1,N+1)=1;

b(1)=g0(R(r));
b(1)=g1(R(r));
for i=2:N
A(i,i)=2+h^2/k;
A(i,i-1)=-1;
A(i,i+1)=-1;
b(i)=vp(R(r),X(i))*h^2+U(i)*(h^2)/k;
end
% solve AU=b
U=A\b;
end
% The exact solution Uex=[uex(x1),… ,uex(x(N+1))]
Uex=zeros(N+1,1);
for i=1:(N+1)
Uex(i)=uex(T,X(i));
end
% plot the exact solution and the exact solution on a same figure
plot(X,U,'b',X,Uex,'r');
xlabel('x');
title (' The numerical solution (blue) and the exact solution (red) ');
% error
disp('error in norm L^2 and in norm sup')
err2=norm(U-Uex)/sqrt(N+1)
errmax=norm(U-Uex,inf)
Kết quả sau khi chạy chương trình bai 2.4.m
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
-3
-2
-1
0

1
2
3
x
The numerical solution (blue) and the exact solution (red)
error in norm L^2 and in norm sup
err2 = 0.0174 errmax = 0.0252
III. BẬC HỘI TỤ VÀ ĐIỀU KIỆN BIÊN NEUMANN
1.Bậc hội tụ :
Bây giờ ta quan tâm đến sai số giữa lời giải số và lời giải chính xác .Thông
thường sai số này được tính theo chuẩn
2
L
hoặc
L

. Câu hỏi là sự hội tụ của sai số
về 0 phụ thuộc thế nào tới các mesh-sizes
1/h N x= = ∆

/k T M t= = ∆
?
Trong hầu hết các trường hợp ta có :
 Bài toán I có bậc hội tụ là
2
( )O h
, trong đó
2 2
( ) .O h const h≤
khi

0h →
.
Lý do là ta đã dùng công thức xấp xỉ

"
( ) 2 ( ) ( )
"( )
u x h u x u x h
u x
h
− − + +

 Bài toán II có bậc hội tụ là
{ }
2
(max , )O k h
. Lý do là ta đã sử dụng hai xấp
xỉ
1
1 1
2
( , ) ( , )
( , )
( , ) ( , ) 2 ( , )
( , )
r i r i
r i
r i r i r i
xx r i
u t x u t x

u t x
t k
u t x u t x u t x
u t x
h

+ −







+ −



;
;
Trong đó xấp xỉ thứ nhất có bậc O(k) , xấp xỉ thứ hai có bậc
2
( )O h
. Như vậy
ta nên chọn
2
.k c h=
với c là hằng số dương không quá lớn , để bậc hội tụ cũng là
2
( )O h

.
2.Điều kiện biên Neumann :
Ta xét bài toán I với điều kiện biên phức tạp hơn :

''( ) ( ), [0;1]
'(0) ; (1)
0 1
u x f x x
u a u a

= ∈

= =

Khi đó ta cần có sự điều chỉnh để xây dựng ma trận A và vector b .Chỗ khác biệt là
tại điểm
1
0x =
ta phải sử dụng một công thức xấp xỉ .Ta có hai cách làm
Cách 1: Ta có thể sử dụng xấp xỉ đơn giản ( Taylor bậc 1)

2 1 1 0
( ) ( ) '( ) .u x u x u x a h− ≈ =
Trong đó

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×