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 (1007.47 KB, 125 trang )
80
Chương 5. Phương pháp số giải phương trình vi phân
phương pháp này là tìm nghiệm gần đúng của phương trình tích phân
x
y(x) = y0 +
f (t, y(t))dt
x0
(5.2)
mà tương đương với phương trình (5.1).
Xuất phát từ xấp xỉ gần đúng đầu tiên y0(x) ≡ y0 ta tìm các xấp xỉ tiếp theo bằng
công thức qui nạp
x
yn (x) = y0 +
f (t, yn−1(t))dt
x0
(5.3)
Sự kiện dãy nghiệm xấp xỉ này hội tụ đã được chứng minh trong tiết 1.2, tốc độ hội
tụ được đánh giá bởi sai số thứ n
n (x)
− x0 |n+1
,
(n + 1)!
n |x
:= |y(x) − yn (x)| ≤ ML
∀x ∈ [x0 − h, x0 + h]
trong đó M, L, h là các hằng số đề cập trong đònh lý tồn tại và duy nhất nghiệm 1.2.2.
Ví dụ 1: Tìm nghiệm gần đúng của phương trình y = x − y với y(0) = 1
Vì hàm vế phải f (x, y) = x − y liên tục trong toàn mặt phẳng và thoả điều kiện
Lipschitz trong lân cận của điểm (0, 1) nên bài toán đã cho có lời giải duy nhất. Bắt
đầu với
y0 (x) = 1
và dùng công thức (5.3) ta được
x2
y1 (x) = 1 +
− 1)dt = 1 − x +
2
x3
x
y2 (x) = 1 + 0 (t − y1 (t))dt = 1 − x + x2 −
6
x3 x4
x
y3 (x) = 1 + 0 (t − y2 (t))dt = 1 − x + x2 −
+
3
24
x5
x3 x4
x
+
−
y4 (x) = 1 + 0 (t − y3 (t))dt = 1 − x + x2 −
3
12 120
························
x
(t
0
Một cách tổng quát, xấp xỉ thứ n cho bởi
yn (x) = 1 − x + x2 −
x4
xn+1
x3
+
− · · · + (−1)n+1
3
3.4
3.4.5 . . . (n + 1)
Trong ví dụ này, nghiệm chính xác là
y(x) = 2e−x + x − 1
(Bạn đọc hãy đánh giá tốc độ hội tụ!)
81
5.1. Các phương pháp giải tích giải gần đúng PTVP.
Phương pháp xấp xỉ Picard cũng có thể áp dụng cho hệ PTVP như trong ví dụ sau
đây:
Ví dụ 2: Tìm nghiệm gần đúng của hệ
y1 = x + y1 y2
2
y2 = x2 − y1
thoả điều kiện ban đầu y1(0) = 1, y2(0) = 0.
Áp dụng công thức (5.3) một cách luân phiên cho y1 và y2 với xấp xỉ ban đầu lần
0
0
lượt là y1 = 1 và y2 = 0, ta tìm được
x2
x3
x
1
+ 0)dt = 1 + , y2 (x) = 0 + 0 (t2 − 12 )dt = −x +
2
3
t2
t3
x4 x6
+ ,
t+ 1+
−t +
dt = 1 −
2
3
24 36
1
y1 (x) = 1 +
x
(t
0
2
y1 (x) = 1 +
x
0
2
y2 (x) =
x
0
t2 − 1 +
t2
2
2
dt = −x −
x5
,
5
························
5.1.2 Phương pháp chuỗi Taylor.
Trong một số trường hợp mà vế phải f (x, y) của phương trình (5.1) có thể khai triển
được thành chuỗi Taylor trong lân cận của (x0 , y0), ta có thể tìm nghiệm y(x), trong
một lân cận của x0 dưới dạng chuổi Taylor tại điểm đó
∞
y(x) =
n=0
y (n)
(x − x0 )n
n!
Do đó, ta có thể xấp xỉ nghiệm chính xác bởi đa thức Taylor đến cấp N nào đó; đa
thức này hoàn toàn xác đònh bởi các đạo hàm y(k)(x0), với k = 0, N . Các giá trò đạo
hàm này tính được dựa vào phương trình (5.1)
y (0) (x0 ) = y(x0 ) = y0
y (x0 ) = f (x0 , y(x0)) = f (x0 , y0 )
y (x0 ) = fx (x0 , y0 ) + fy (x0 , y0 ).y (x0 )
y (x0 ) = fxx (x0 , y0 ) + 2fxy (x0 , y0).y (x0 ) + fyy (x0 , y0 )[y (x0 )]2 + fy (x0 , y0 ).y (x0 )
························
Ví dụ 1: Tìm nghiệm gần đúng của phương trình sau bằng phương pháp chuỗi Taylor
y = x − y,
y(0) = 1
82
Chương 5. Phương pháp số giải phương trình vi phân
Giải: Ta có
y(0) = 1, y (0) = 0 − 1 = −1
y (0) = (1 − y )(0,1) = 2
y (0) = (−y )(0,1) = −2
y (4) (0) = (−y )(0,1) = 2
························
Từ đó nghiệm xấp xỉ có dạng
y(x) = 1 − x + x2 −
2xN
x3 x4
+
− · · · + (−1)N
3
12
N!
Nhận xét: Chú ý rằng các số hạng đầu tiên của nghiệm này trùng với các số hạng
của nghiệm xấp xỉ theo Picard.
Phương pháp chuỗi Taylor cũng áp dụng cho các phương trình vi phân cấp cao như
trong ví dụ sau đây.
Ví dụ 2: Giải xấp xỉ phương trình
y + xy + y = 0
với điều kiện ban đầu:
y(0) = 0, y (0) = 1
Giải: Ta có
y = −y − xy ,
Từ đó ta tính được
y = −2y − xy ,
y (4) = −3y − xy , . . .
y (0) = (−y − xy )(0,0) = 0
y (0) = (−2y − xy )(0,0) = −2
y (4) (0) = (−3y − xy )(0,0) = 0
y (5) (0) = (−4y − xy (4) )(0,0) = 8
························
Nghiệm xấp xỉ có dạng
y(x) = x −
x3 x5
+
+···
3
15
5.2 Các phương pháp số giải PTVP.
Trong bài này ta cũng xét bài toán giá trò ban đầu
y = f (x, y),
y(x0 ) = y0
83
5.2. Các phương pháp số giải PTVP.
Ý tưởng của phương pháp số giải phương trình vi phân là “rời rạc hoá” biến của
phương trình. Chính xác hơn, thay vì tìm nghiệm đúng y(x) của bài toán giá trò ban
đầu trên [a, b] x0 ta xây dựng một dãy các giá trò xấp xỉ
y1 ≈ y(x1 ), y2 ≈ y(x2 ), y3 ≈ y(x3 ), . . .
với các điểm
x1 := x0 + h, x2 := x1 + h, x3 := x2 + h, . . .
xuất phát từ điểm ban đầu x0.
Hằng số h trong các công thức trên được gọi là bước của phương pháp; tuỳ theo
dấu của h âm hay dương mà ta “đi lùi” hay “đi tới”.
Để đánh giá độ chính xác của phương pháp ta dùng khái niệm sai số, mà đơn giản
chỉ là hiệu giữa giá trò thực sự và giá trò xấp xỉ. Tại điểm bất kỳ xi+1 , ta gọi sai số
toàn cục là hiệu
ei+1 = y(xi+1 ) − yi+1
Dó nhiên, sai số toàn cục thường được quan tâm nhưng lại không dễ đánh giá và khó
điều khiển. Thay vào đó người ta có thể đo bằng sai số đòa phương xảy ra trong
một bước xấp xỉ. Nếu gọi v(x) là nghiệm (đúng) của bài toán giá trò ban đầu
v = f (x, v),
v(xi ) = yi
thì sai số đòa phương tại x = xi+1 là
ei+1 = v(xi+1 ) − yi+1
˜
Dó nhiên, ta có thể điều khiển sai số toàn cục một cách gián tiếp bằng cách điều khiển
sai số đòa phương.
Người ta tạm phân loại các phương pháp số tuỳ theo nó có “bộ nhớ” hay không.
Tức là, với yi đã cho cách xác đònh yi+1 có phụ thuộc chỉ vào thông tin tại xi hay
không. Các phương pháp số mà yi+1 hoàn toàn được xác đònh bởi thông tin tại điểm xi
(mà không phụ thuộc vào các điểm trước đó) được biết đến với tên gọi phương pháp
“một bước”.
Vậy phương pháp một bước tổng quát có thể được mô tả bởi
yi+1 = yi + h∆(xi , yi),
y0 = y(x0 )
(5.4)
trong đó ∆ là hàm đặc trưng cho phương pháp.
Mục đích là ta tìm các thuật toán chính xác, tức là thuật toán sao cho với thuật toán
này, nghiệm thực sự y(x) “hầu như” thoả (5.4) theo nghóa
y(xi+1) = y(xi) + h∆(xi , y(xi )) + hτi
với τi bé.
84
Chương 5. Phương pháp số giải phương trình vi phân
Đại lượïng hτi được gọi là sai số chặt cụt đòa phương của phương pháp. Một
phương pháp số được gọi là cấp p nếu với mọi xi ∈ (a, b) và với mọi h đủ bé, có tồn
tại các hằng số C sao cho
|τi | = Chp
Điều này nghóa là τi dần đến 0 không chậm hơn hp ; và ta sẽ diễn tả điều đó bởi
τi = O(hp ).
Sau đây ta sẽ xét một vài phương pháp một bước thông dụng.
5.2.1 Phương pháp chuỗi Taylor.
Tuỳ theo biểu thức của ∆ mà ta phân loại các phương pháp một bước. Một trong
những phương pháp một bước đơn giản nhất là phương pháp chuỗi Taylor, mà nền
tảng của nó là khai triển Taylor của nghiệm y(x).
Giả sử đạo hàm đến cấp p + 1 của y(x) liên tục trên đoạn [a, b] nào đó, khi đó ta
có khai triển
hp−1
hp+1
(p+1)
(ξi )
y(xi+1 ) = y(xi ) + h y (xi ) + · · · + y (xi )
+y
p!
(p + 1)!
(p)
ở đây xi ≤ ξi ≤ xi+1 .
Tính liên tục của y(p+1) chỉ ra rằng nó bò chặn trên [a, b] và như vậy
y (p+1) (ξi )
Dùng sự kiện y
= f (x, y),
hp+1
= O(hp+1) = hO(hp )
(p + 1)!
(5.5) có thể được viết lại dưới dạng
y(xi+1 ) = y(xi ) + h f (xi , y(xi )) + · · · + f (p) (xi , y(xi))
hp−1
+ hO(hp )
p!
trong đó các đạo hàm “toàn phần” của f được đònh nghóa bởi
f (0) (x, y) = f (x, y),
f (1) (x, y) = fx (x, y) + fy (x, y)f (x, y),
(k−1)
f (k) (x, y) = fx
(k−1)
(x, y) + fy
(x, y)f (x, y),
k = 2, 3, 4, . . .
Từ đó ta có
∆(xi , y(xi)) = f (xi , y(xi )) + · · · + f (p) (xi , y(xi))
và với cách chọn ∆ này, ta có thuật toán chuỗi Taylor sau đây:
hp−1
p!
(5.5)
85
5.2. Các phương pháp số giải PTVP.
Thuật toán chuỗi Taylor:
Thuật toán này cho phép nhận được nghiệm xấp xỉ cấp p cho bài toán giá trò ban đầu
(5.1) trên [a, b] như sau:
Đặt h =
b−a
n
và
i = 0, 1, 2, . . . , n − 1
xi+1 = xi + h,
yi+1 = yi + h f (xi , yi) + · · · + f (p−1) (xi , yi)
hp−1
p!
trong đó x0 , y0 là các dữ kiện ban đầu.
5.2.2 Phương pháp Euler và Euler cải tiến.
Phương pháp chuỗi Taylor cấp p = 1 được gọi là phương pháp Euler:
xi+1 = xi + h,
yi+1 = yi + hf (xi , yi)
Về phương diện hình học, nghiệm gần đúng cho bởi phương pháp Euler được minh
hoạ bởi một đường gấp khúc mà đoạn đầu tiên trùng với tiếp tuyến với đường cong
nghiệm tại x0 .
Ví dụ: Giải gần đúng bài toán y = y, y(0) = 1 với bước h = 0, 25.
Xuất phát từ x0 = 0, y0 = 1 và h = 0, 25, ta có thuật tính (để ý rằng f (x, y) = y )
xi+1 = xi + 0, 25,
yi+1 = yi + 0, 25yi
Kết quả tính toán bốn xấp xỉ đầu tiên là Nhược điểm của phương pháp Euler là chỉ
Bước thứ i
0
1
2
3
4
Giá trò đúng
0,0 1,0
1,0
0,25 1,25
1,2840
0,5 1,5625 1,6487
0,75 1,9531 2,1170
1,0 2,4414 2,7183
xi
yi
Table 5.1: Nghiệm xấp xỉ bằng phương pháp Euler.
dừng ở đạo hàm cấp I nên đôi khi sai số khá lớn, không chấp nhận được. Để khắc
phục, người ta tìm cách hạn chế sự thay đổi quá lớn của đạo hàm bằng cách thêm vào
các tính toán trung gian thích hợp.
86
Chương 5. Phương pháp số giải phương trình vi phân
y
3.0
l
l
1.5
l
l
l
X
0.0
-0.25
0.50
1.25
Hình 5.1: Nghiệm đúng và nghiệm xấp xỉ theo phương pháp Euler
Cụ thể, phương pháp Euler cải tiến cho bởi công thức sau (còn gọi là công thức
Heun):
xi+1 = xi + h,
yi+1 = yi +
h
2
∗
f (xi , yi ) + f (xi+1 , yi+1 )
∗
trong đó yi+1 := yi + hf (xi , yi ) là giá trò xấp xỉ theo phương pháp Euler.
5.2.3 Các phương pháp Runge−Kutta.
Các phương pháp Runge−Kutta được thiết kế gần giống như phương pháp chuỗi Taylor,
nhưng có vài điểm tiến bộ hơn như không yêu cầu tính toán tường minh các đạo hàm
của f (x, y). Ý tưởng cơ bản của nó là dùng một tổ hợp tuyến tính của các giá trò của
f (x, y) để xấp xỉ cho y(x). Tổ hợp tuyến tính này được ghép sao cho gần với khai
triển Taylor của y(x) để nhận được các phương pháp với cấp p cao nhất có thể được.
Ta minh hoạ phương pháp Runge−Kutta trong trường hợp dùng hai giá trò của
f (x, y) tại mỗi bước; kỹ thuật này hoàn toàn dễ mở rộng cho tất cả các công thức kiểu
Runge−Kutta.
Cho trước các giá trò xi , yi ; ta chọn các giá trò xi , yi và các hằng số α1, α2 để làm
ˆ ˆ
cho
x ˆ
yi+1 = yi + h [α1 f (xi , yi ) + α2 f (ˆi , yi )]
(5.6)
phù hợp nhất với khai triển Taylor
h
h2
y(xi+1 ) = yi + h f (xi , yi ) + f (1) (xi , yi) + f (2) (xi , yi ) + · · ·
2
6
(5.7)
87
5.2. Các phương pháp số giải PTVP.
Sau đây, các đạo hàm được hiểu tại điểm (xi , yi). Để thuận tiện ta đặt
xi = xi + hβ1 ,
ˆ
yi = yi + β2 hf (xi , yi).
ˆ
Khi đó, ta cần phải “khớp” biểu thức
R = α1 f + α2 f (xi + β1 h, yi + β2 hf )
(α1 + α2 )f + α2 h(β2 f fy + β1 fx ) +
α2 h2 2 2
2
(β2 f fyy + 2β1 β2 f fxy + β1 fxx ) + O(h3 )
2
(5.8)
với khai triển Taylor
h2
h
T = f + f (1) + f (2) + O(h3 )
2
6
h2
h
2
= f + (f fy + fx ) + (f 2 fyy + 2f fxy + fxx + fx fy + f fy ) + O(h3)
2
6
(5.9)
Cân bằng các hệ số của các luỹ thừa của h ta được
h0 :
1
h :
α1 + α2 = 1
1
2
α2 β2 + α2 β1 =
Ta đặt α2 = γ = 0 và xem như tham số, ta được
α1 = 1 − γ
1
β1 = β2 =
2γ
α2 = γ,
Tổ hợp các công thức trên cho ta một phương pháp một bước cấp
và f đủ trơn. Từ đó ta có thuật toán sau đây:
p=2
(với γ
= 0)
Thuật toán Runge−Kutta cấp 2:
Để nhận được nghiệm xấp xỉ cấp
b−a
h=
và tính toán dãy sau:
p = 2
cho bài toán giá trò ban đầu (5.1), ta đặt
n
xi+1 = xi + h,
i = 0, 1, . . . , n − 1
yi+1 = yi + h (1 − γ)f (xi , yi) + γf (xi +
h
h
, yi + f (xi , yi ))
2γ
2γ
Nhận xét: Phương pháp Euler là trường hợp cấp p = 1 đặc biệt với γ = 0. Với γ = 1
2
ta có phương pháp Euler cải tiến và cũng được gọi là phương pháp Runge−Kutta cấp
2. Khi γ = 1 ta có phương pháp Euler−Cauchy.
88
Chương 5. Phương pháp số giải phương trình vi phân
Ví dụ: Minh hoạ phương pháp Euler−Cauchy đối với bài toán y
với h = 0.1
Biểu thức quy nạp cho yi+1 là
xi
yi+1
= y 2 + 1, y(0) = 0
= 0, 0.1, . . . , 1.0
h
h
= yi + hf (xi + , yi + f (xi , yi))
2
2
h
2
= yi + 1 + (yi + (1 + yi ))2
2
Kết quả tính toán cho trong bảng sau:
xi
0.0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1.0
yi
0.00000
0.10025
0.20252
0.30900
0.42224
0.54539
0.68263
0.83977
1.02534
1.25256
1.54327
Sai số |yi − tan(xi )|
0.00e+00
0.85e−04
0.19e−03
0.33e−03
0.56e−03
0.92e−03
0.15e−02
0.25e−02
0.43e−02
0.76e−02
0.14e−01
Table 5.2: Nghiệm xấp xỉ bằng phương pháp Euler−Cauchy.
Nhận xét: Hạn chế lớn nhất của phương pháp Runge−Kutta là khối lượng tính toán
khá lớn khi cấp p tăng lên. Chẳng hạn, tại mỗi bước ta phải tính p giá trò khi cấp
p = 1, 2, 3, 4; 7 giá trò khi p = 6; 9 giá trò khi p = 7, 11 giá trò khi p = 8;....Vì thế, thực
tế người ta thường dừng lại ở cấp p = 4, và ta có thuật toán sau đây:
Thuật toán Runge−Kutta cấp 4:
Thuật toán này thể hiện bởi dãy các công thức sau:
k1 = f (xi , yi),
h
h
k2 = f (xi + , yi + k1 ),
2
2
h
h
k3 = f (xi + , yi + k2 ),
2
2
k4 = f (xi + h, yi + hk3 ),
và
h
yi+1 = yi + (k1 + 2k2 + 2k3 + k4 )
6
89
5.2. Các phương pháp số giải PTVP.
Ví dụ: Tìm nghiệm gần đúng của bài toán y
= −y + x2 − 3 sin(12x), y(0) = 2.
Ta áp dụng phương pháp R−K cấp 4 với bước h = 0.2 trên đoạn [0, 1]. Các kết quả
tính toán bằng MAPLE cho trong bảng sau:
xi
0.0
0.2
0.4
0.6
0.8
1.0
yi
2.00000
1.23506
1.23303
1.15932
0.68259
1.13040
Table 5.3: Nghiệm xấp xỉ bằng phương pháp R−K cấp 4.
Nhận xét: Phương pháp Runge−Kutta có thể được áp dụng để giải một hệ phương
trình vi phân thường cấp I. Các bước tính toán vẫn được thực hiện như trên.
5.2.4 Các phương pháp đa bước (multi-step):
Ta để ý rằng các phương pháp mà ta đã thảo luận trên đây là không có bộ nhớ, tức
là giá trò của y(x) với x trước xi không ảnh hưởng trực tiếp đến giá trò của y(x) với x
sau xi . Các phương pháp khác tiến bộ hơn ở chỗ có tính đến ảnh hưởng của các giá
trò trước đó đến bước mà ta đang xét, gọi là các phương pháp đa bước. Sau đây ta chủ
yếu xét đến các phương pháp (đa bước) Adams−Bashforth và Adams− Moulton mà
nội dung được mô tả bởi các công thức sau đây:
Giả sử ta đã tìm được các giá trò xấp xỉ yi+1−j ∼ y(xi+1−j ) với j = 2, 3, . . . , p của
=
nghiệm y(x) của bài toán (5.1). Để tìm giá trò tiếp theo yi ∼ y(xi ) ta có thể tiến hành
=
theo các bước sau đây. Từ phương trình vi phân đã cho ta có thể xấp xỉ các đạo hàm
y (xi+1−j ) bởi
y (xi+1−j ) = f (xi+1−j , y(xi+1−j )) ∼ f (xi+1−j , yi+1−j ) = fi+1−j
=
Khi đó, giá trò tiếp theo có thể cho bởi công thức
xi+1
y(xi+1 ) = y(xi ) +
xi+1
y (x)dx = y(xi ) +
xi
f (x, y(x))dx
xi
Phương pháp Adams−Bashforth chủ yếu bao gồm việc thay f (x, y(x)) bởi đa thức nội
suy P (x) của nó tại các điểm mốc xi+1−j với các giá trò tương ứng fi+1−j , trong đó
j = 1, 2, . . . , p trong tích phân trên.
p
yi+1 = yi + h
αp,j fi+1−j
j=1
(5.10)
90
Chương 5. Phương pháp số giải phương trình vi phân
Trong công thức này, tại mỗi bước ta chỉ phải tính một giá trò của f . Một nét thú
vò của phương pháp này là việc xấp xỉ y (x) bởi đa thức P (x), vì khi đó giá trò của
nghiệm y(x) giữa hai điểm lưới liên tiếp có thể xấp xỉ nhờ đa thức này
y(x) ∼ yi +
=
x
P (t)dt.
xi
Nhận xét: Phương pháp Adams−Bashforth cấp
còn khi p = 2 nó được cho bởi
yi+1 = yi + h
p = 1
chính là phương pháp Euler,
3
1
f (xi , yi ) − f (xi−1 , yi−1)
2
2
Công thức Adams−Moulton (AM) sinh ra khi đa thức nội suy P (x) cho bởi các giá
trò fi+1−j với j = 0, 1, . . . , p − 1
p−1
yi+1 = yi + h
αp,j fi+1−j
ˆ
(5.11)
j=0
Điểm khác biệt của phương pháp (AM) với phương pháp (AB) là ở chỗ vế phải của
(5.11) có chứa số hạng fi+1 = f (xi+1 , yi+1) mà chỉ được đònh nghóa một cách “ẩn”.
Vậy đầu tiên ta “tiên đoán” giá trò này bằng phương pháp (AM) trong công thức (5.10),
rồi sau đó “điều chỉnh” nó bằng công thức (5.11).
5.3 Phương trình vi phân và phần mềm tính toán MAPLE.
Trong mục này ta giới thiệu và minh hoạ một số gói lệnh và thủ tục chủ yếu của
MAPLE 7 nhằm hỗ trợ cho việc nghiên cứu phương trình vi phân thường. Dó nhiên,
đây không phải là phần mềm duy nhất với các chức năng như thế; do đó bạn đọc cũng
tìm thấy những công cụ tương tự trong MATHEMATICA, MATLAB,....
5.3.1 Giới thiệu chung:
MAPLE là sản phẩm của Waterloo Maple Inc. mà có nguồn gốc xuất phát từ Đại học
tổng hợp Waterloo (Canada) và Đại học kỹ thuật Zurich, và được đăng ký nhãn hiệu
thương mại từ phiên bản MAPLE V. Cho đến nay nó được phổ biến rộng rãi trên toàn
thế giới, đặc biệt trong các trường đại học và tại các trung tâm tính toán, nhờ ở tính
năng gọn nhẹ, dễ sử dụng và khả năng tính toán của nó.
MAPLE là một hệ phần mềm tính toán chuyên dụng cung cấp một số lượng lớn các
toán tử toán học khác nhau về nhiều lónh vực như giải tích số, tính toán đại số ký hiệu,
đồ thò,....Một khối lượng câu lệnh khổng lồ của nó giúp người sử dụng dễ dàng thực
hiện từ các phép tính số học đơn giản đến các tính toán phức tạp như giải tích tensor,
lý thuyết nhóm,v.v. Nó cung cấp một giao diện đẹp, dễ sử dụng, một môi trường làm