ax.imshowimg, extent=0, img.shape[], 0, img.shape[]] # Tạo mảng giá trị từ 0 đến chiều dài và chiều rộng của hình với bước nhảy là 50x_ticks np.arange, img.shape[], 50 y_ticks np.arange,
Trang 1TP HỒ CHÍ MINH, THÁNG 5, NĂM 2024
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO BÀI TẬP LỚN
BỘ MÔN PHƯƠNG PHÁP TÍNH (MT1009)
CHỦ ĐỀ: SỬ DỤNG SPLINE BẬC 3 ĐỂ TẠO ĐƯỜNG
BAO CHO MỘT HÌNH PHẲNG BẤT KÌ
NHÓM: 3-L09
Trang 21
Danh sách thành viên nhóm:
2310282 Nguyễn Hữu Bằng Code xử lý ảnh và giải pt 100%
2213335 Phan Nguyễn Phú Thông Phương pháp, Tổng hợp 100%
Trang 32
MỤC LỤC:
I Cơ sở lý thuyết Spline bậc ba: 3
1 Các khái niệm cơ bản: 3
a Định nghĩa 1: 3
b Định nghĩa 2: 5
2 Spline bậc 3 tự nhiên: 6
3 Spline bậc ba ràng buộc: 7
II Thiết kế ba ̀i toán spline bâ ̣c 3 8
Bài 1: 8
Code giải bài tập: 9
Bài 2: 9
Code giải bài tập: 10
III Lập trình matlab: 10
IV Xử lý ảnh: 12
V Tổng kết: 15
VI Tài liệu tham khảo: 16
Trang 43
I Cơ sở lý thuyết Spline bậc ba:
-Hàm spline bậc 3 là một hàm đa thức bậc 3 liên tục đến bậc 2 tại các nút Hàm spline bậc 3 thường được sử dụng để nội suy hoặc xấp xỉ các hàm gián đoạn
-Việc xây dựng một đa thức đi qua các điểm nội suy cho trước trong trường hợp n lớn là rất khó khăn Biện pháp khắc phục là trên từng đoạn liên tiếp của các cặp điểm nút nội suy ta nối chúng bởi các đường cong đơn giản như đoạn thẳng Tuy nhiên, khi đó tại các điểm nút hàm sẽ mất tính khả vi Do đó, phải xây dựng đường cong bằng cách nối các đoạn cong nhỏ lại với nhau sao cho vẫn bảo toàn tính khả vi của hàm
-Đường cong như vậy được gọi là đường spline (đường ghép trơn) Các hàm trên các đoạn nhỏ này thường là các đa thức và bậc cao nhất của các đa thức đó gọi là bậc của spline
*Các điều kiện biên:
-Các hệ số của hàm spline có thể được xác định bằng cách sử dụng các điều kiện biên sau:
*Điều kiện liên tục:
-p(xi)=yi
*Điều kiện liên tục của đạo hàm bậc 1:
-p′(xi)=yi′
*Điều kiện liên tục của đạo hàm bậc 2:
-p′′(xi)=yi′′
-Giải hệ phương trình:
-Với n điểm nút, ta có n phương trình liên hệ giữa các hệ số của hàm spline Các hệ
số này có thể được giải bằng cách sử dụng các phương pháp giải hệ phương trình tuyến tính
1 Các khái niệm cơ bản:
a Định nghĩa 1:
-Cho f(x) xác định trên đoạn [a,b] và một phép phân hoạch của nó: a=x0<x1<x2=b Đặt y0=f(x0) , y1=f(x1), y2=f(x2) Một spline bậc ba nội suy hàm f(x) trên [a,b] là hàm g(x) thỏa các điều kiện sau:
g(x) có đạo hàm đến cấp 2 liên tục trên [a,b]
g(x) = g0(x) x ∈ [ x0 , x1 ]
g1(x) x ∈ [ x1 , x2 ]
Trang 54
(Ở đây g0(x),g1(x) là các đa thức bậc ba)
g(x0)=f(x0)=y0,g(x1)=f(x1)=y1,g(x2)=f(x2)=y2
-Xét đoạn [ x0 , x1 ] Đặt h0 = x1 – x0
Vì g0(x) là đa thức bậc ba nên g0(x) = a0 + b0(x-x0) + c0(x-x0)2 + d0(x-x0)3
-Do g(x0) = g0(x0) = y0 => y0 = a0 và g(x1) = g0(x1) = y1
a0 + b0(x1-x0) + c0(x1-x0)2 + d0(x1-x0)3 = y1
a0 + b0h0 + c0h0 + d0h0 = y1
=>Từ đó , ta có b0 = ( y1 – y0 )/h0-c0h0-d0h02
-Xét đoạn [ x1 , x2 ] Đặt h1 = x1 – x2
Vì g1(x) là đa thức bậc ba nên g1(x) = a1 + b1(x-x1) + c1(x-x1)2 +d1(x-x1)3
-Do g(x1) = g1(x1) = y1 => y1 = a1 và g(x2) = g1(x2) = y2
a1 + b1(x2-x1) + c1(x2-x1)2 +d1(x2-x1)3 = y2
Trang 65
a1 + b1h1 + c1h1 + d1h1 = y2
=>Từ đó , ta có b1 = (y2 – y1)/h1-c1h1 – d1h12
Do tính khả vi của hàm g(x) đến cấp 2 tại x1 nên g0’(x1) = g1’(x1) và g0”(x1) = g1”(x1)
Từ điều kiện g0”(x1) = g1”(x1) ta được :
2c0 + 6d0(x1-x0) = 2c1 +6d1(x1-x1) => d0 = (c1 – c0)/3h0
=>b0 = (y1-y0)/h0 – c0h0 – d0h0 = (y1-y0)/h0 – c0h0 – ((c1-c0)/(3h0))h0
= (y1-y0)/h0 – (h0/3)(c1 + 2c0)
Do tính khả vi của hàm g(x) đến cấp 2 tại x2 nên g1”(x2) = g2”(x2)
2c1 + 6d1(x2-x1) = 2c2 + 6d2(x2-x2) => d1 = (c2-c1)/3h1
b1 = (y2-y1)/h1 – c1h1 -d1h1 = (y2-y1)/h1 – c1h1 – ((c2-c1)/3h1)h1
=(y2-y1)/h1-(h1/3)(c2+2c1)
Từ điều kiện g0’(x1) = g1’(x1) ta được :
b0 + 2c0(x1-x0) + 3d0(x1-x0)2 = b1 + 2c1(x1-x1) + 3d1(x1-x1) 2
=>b1=b0 + 2c0h0 +3d0h0
Thay b1 = (y2-y1)/h1-(h1/3)(c2+2c1) ; b0 = (y1-y0)/h0-(h0/3)(c1+2c0) ; d0=(c1-c0)/3h0
ta được : h0c0 + 2(h0+h1)c1 + h1c2 = 3(y2-y1)/h1-3(y1-y0)/ h0
Hệ này có vô số nghiệm
b Định nghĩa 2:
Cho f(x) xác định trên đoạn [a,b] và một phép phân hoạch của nó :
a = x0 < x1 < x2 <…< xn = b
Đặt yk = f(xk),k=0,1,2,…n Một spline bậc ba nội suy hàm f(x) trên [a,b] là hàm g(x) thỏa mãn các điều kiện sau :
-g(x) có đạo hàm đến cấp 2 liên tục trên [a,b]
-Trên mỗi đoạn [xk,xk+1] , k = 0,1,2, n-1 , g(x) = gk(x) là 1 đa thức bậc ba
Trang 76
- gk(x) = f(xk) = yk , ∀k = 0,1,2,…n
Xét đoạn [xk,xk+1] , k = 0,1,2,…n-1 Đặt hk =xk+1 – xk
Vì gk(x) là đa thức bậc ba nên gk(x) = ak + bk (x-xk) + ck(x-xk)2 + dk (x-xk)3
Do g(xk) = gk (xk) = yk => yk = ak và ak +bkhk + ckhk + dkhk = g(x k+1) = gk ( x k+1) =
y k+1
Từ đó, ta có hệ {
𝑏𝑘 =𝑦𝑘+1 −𝑦𝑘
ℎ𝑘 − 𝑐𝑘ℎ𝑘− 𝑑𝑘ℎ𝑘2, ∀𝑘 = 0 𝑛 − 1
𝑏𝑘−1 =𝑦𝑘−𝑦𝑘−1
ℎ𝑘−1 − 𝑐𝑘−1ℎ𝑘−1− 𝑑𝑘−1ℎ𝑘−12 , ∀𝑘 = 1 𝑛
Xét tại điểm 𝑥𝑘, k = 1 n-1 Do tính khả vi của hàm g (x) đến cấp 2 tại 𝑥𝑘 nên 𝑔′𝑘−1 (𝑋𝑘) = 𝑔′𝑘 (𝑋𝑘) và 𝑔′′𝑘−1 (𝑋𝑘) = 𝑔′′𝑘 (𝑋𝑘) Từ điều kiện 𝑔′′𝑘−1 (𝑋𝑘) = 𝑔′′𝑘 (𝑋𝑘) ta được:
{
𝑑𝑘−1 =𝑐𝑘 −𝑐𝑘−1
ℎ𝑘 , ∀𝑘 = 1 𝑛 − 1
𝑑𝑘 =𝑐𝑘+1 −𝑐𝑘
3ℎ 𝑘 , ∀𝑘 = 1 𝑛 − 1 ⟹ {
𝑏𝑘 =𝑦𝑘+1−𝑦𝑘
ℎ𝑘 − ℎ𝑘
3 (𝑐𝑘+1+ 2𝑐𝑘), ∀𝑘 = 1 𝑛 − 1
𝑏𝑘−1 =𝑦𝑘 −𝑦𝑘−1
ℎ𝑘−1 −ℎ𝑘−1
3 (𝑐𝑘+ 2𝑐𝑘−1), ∀𝑘 = 1 𝑛
Từ điều kiện 𝑔′𝑘−1 (𝑋𝑘) = 𝑔′𝑘 (𝑋𝑘) ta được 𝑏𝑘 = 𝑏𝑘−1+ 2𝑐𝑘−1ℎ𝑘−1+ 3𝑑𝑘−1ℎ𝑘−12
⟹ {ℎ𝑘−1𝑐𝑘−1+ 2(ℎ𝑘−1+ ℎ𝑘)𝑐𝑘 + ℎ𝑘𝑐𝑘+1= 3𝑦𝑘+1 −𝑦𝑘
ℎ𝑘 − 3𝑦𝑘 −𝑦𝑘−1
ℎ𝑘−1
∀𝑘 = 1 𝑛 − 1
Hệ này có vô số nghiệm nên để có tính duy nhất, ta phải bổ sung thêm các điều kiện biên
2 Spline bậc 3 tự nhiên:
Điều kiện để xác định 1 spline bậc ba tự nhiên là g’’(a) = g’’(b) = 0
Giải thuật xác định spline tự nhiên :
Điều kiện g”(a)=g”(b) = 0 suy ra c0 = cn = 0
B1 Tính hk = xk+1- xk , k = 0, n-1 Ak= yk , k = 0, n-1
Ak= yk ,k=0,n
B2 Giải hệ Ac = b tìm c = (c0 , c1 , …, cn )t
Trang 87
B3 Tính các hệ số bk, dk
𝑏𝑘 =𝑦𝑘+1− 𝑦𝑘
ℎ𝑘
3 (𝑐𝑘+1+ 2𝑐𝑘)
𝑑𝑘 =𝑐𝑘+1− 𝑐𝑘
3ℎ𝑘 , ∀𝑘 = 0 𝑛 − 1
3 Spline bậc ba ràng buộc:
Điều kiện để xác định 1 spline bậc ba ràng buộc là
g’(a) = α, g’(b) = β
Khi đó ta có thêm 2 phương trình
{
2ℎ0𝑐0+ ℎ0𝑐1 = 3𝑦1 − 𝑦0
ℎ0 − 3𝛼
ℎ𝑛−1𝑐𝑛−1+ 2ℎ𝑛−1𝑐𝑛 = 3𝛽 − 3𝑦𝑛 − 𝑦𝑛−1
ℎ𝑛−1 Giải thuật xác định spline ràng buộc :
B1 Tính h
k=xk+1- xk, k = 0, n-1
ak= yk, k = 0, n
B2 Giải hệ Ac = b tìm c = (c0, c1, …, cn)t
B3 Tính các hệ số bk, dk
Trang 98
{
𝑎𝑘 = 𝑦𝑘
𝑏𝑘 = 𝑦𝑘+1− 𝑦𝑘
ℎ𝑘
3 (𝑐𝑘+1+ 2𝑐𝑘)
𝑑𝑘 =𝑐𝑘+1− 𝑐𝑘
3ℎ𝑘 , ∀𝑘 = 0 𝑛 − 1
II Thiết kế bài toán spline bâ ̣c 3
Bài 1:
Cho bảng số
Sử dụng Spline bậc ba tự nhiên nội suy bảng số trên để xấp xỉ gia strij của hàm tại x=1.4 và x=2.5
Bài giải:
h0=0.4; h1=0.6; h2=0.6
1
0
0
75 33.75
0 0
0 46.77
30.906
0
A
B
1
1
1
0; 46.77; 30.906; 0
.( 2 ) 3
3
k k
k
k
k
h
d
h
Trang 109
Ta có:
3
( ) 1.2 24.736( 1.3) 38.975( 1.3) ;1.3 1.7
6473 ( ) 8.6 6.0268( 1.7) 46.77( 1.7) ( 1.7) ;1.7 2.3
150 ( ) 4.7 3.4916( 2.3) 30.906( 2.3) 25.755( 2.3) ; 2.3
(1.4) 3.6346; (2.5) 5.0319
x
Code giải bài tập:
Bài 2:
Cho bảng số
Xây dựng spline bâ ̣c 3 tự nhiên nô ̣i suy :
Bài giải:
Ta có: ℎ0=1 ℎ1=3 ℎ2=2
A= (
ℎ0 2(ℎ0+ ℎ1) ℎ1
0
0
ℎ1 0
2(ℎ1+ ℎ2) 0
0 0
ℎ2 1 ) =(
0 0
3 0
10 0
0 0 2 1 )
Trang 1110
B =
(
0
3𝑦2 −𝑦1
ℎ1 − 3𝑦1 −𝑦0
ℎ0
3𝑦3 −𝑦2
ℎ2 − 3𝑦2 −𝑦1
ℎ1
= (
0
−2
1 2
0 )
Giải hê ̣ AC=B ( spline bâ ̣c 3 nên 𝐶0=0 và 𝐶3=0)
ta có: {8𝐶3𝐶1+ 3𝐶2 = −2
1+ 10𝐶2 =1
2
⇒ {𝐶1 =
−43 142
𝐶2 =10
71
Với k=0 ⇒
{
𝑎0 = 𝑦0 = 1.3
𝑏0 =𝑦1−𝑦0
ℎ0 −ℎ0
3 (𝑐1+ 2𝑐0) =
𝑑0 =𝑐1 −𝑐0
3ℎ0 = −43
426
1919 2130
Với k=1 ⇒
{
𝑎1 = 𝑦1 = 2.1
𝑏1 =𝑦2 −𝑦1
ℎ1 −ℎ1
3 (𝑐2+ 2𝑐1) =
𝑑1 =𝑐2 −𝑐1
3ℎ 1 = 7
142
537 1065
Với k=2 ⇒
{
𝑎2 = 𝑦2 = 2.5
𝑏2 =𝑦3 −𝑦2
ℎ 2 −ℎ2
3 (𝑐3+ 2𝑐2) =
𝑑2 =𝑐3 −𝑐2
3ℎ 2 = −5
213
239 2130
Vâ ̣y 𝑔(𝑥) =
{
1.3 +21301919𝑥 −42643 𝑥3 , 𝑥 ∈ [2,3]
2.1 + 537
1065(𝑥 − 1) − 43
142(𝑥 − 1)2+ 7
142(𝑥 − 1)3 , 𝑥 ∈ [3,6]
2.5 + 239
2130(𝑥 − 2) +10
71(𝑥 − 1)2− 5
213(𝑥 − 1)3 , 𝑥 ∈ [6,8]
Code giải bài tập:
III Lập trình python:
import numpy as np
from scipy.interpolate import CubicSpline
def main():
Trang 1211
# Nhập số lượng điểm
n = int(input("Nhập số lượng điểm n: "))
x = []
y = []
def main ():
n = int ( input ( "Nhập số lượng điểm n: " ))
x = []
y = []
xi float ( input ( "Nhập tọa độ x của điểm thứ { + } : " ))
yi float ( input ( "Nhập tọa độ y của điểm thứ { + } : " ))
x append (xi)
y append (yi)
cs CubicSpline ( , y, bc_type = 'natural' )
print ( "Hàm bậc ba từ x { + } đến x { + } :" )
print ( "S { + } (x) = { cs [ , ] *(x - { [ ] )^3 + { cs [ , ] *(x -
{ [ ] )^2 + { cs [ , ] *(x - { [ ] ) + { cs [ , ] " )
# Nhập giá trị x
x1 float ( input ( "Nhập giá trị x1 để tính hàm spline: " ))
x2 float ( input ( "Nhập giá trị x2 để tính hàm spline: " ))
result1 cs(x1)
result2 cs(x2)
print ( "Hàm spline tại x = { x1 } là: S( { x1 } ) = { result1 :.6f} " )
print ( "Hàm spline tại x = { x2 } là: S( { x2 } ) = { result2 :.6f} " )
if name == " main " :
main ()
Trang 1312
IV Xử lý ảnh:
- Xét một chi tiết cơ khí có dạng như sau, ta sẽ dùng code python để vẽ đường bao cho chi tiết cơ khí:
Trang 14
13
- Đầu tiên ta sẽ phủ lưới tọa độ cho hình trên:
- Sau đó sẽ chấm những điểm theo đường bao của chi tiết để lưu những tọa độ
điểm đi qua và tiến hành tính toán spline bậc 3 để vẽ đường bao cho vật thể:
- Code dùng để vẽ đường bao:
Trang 1514
# Đọc hình ảnh
img mpimg imread ( 'C: \\ Users \\ BANG \\ OneDrive \\ Hi ̀nh a ̉nh \\ chitietmay.jpg' )
# Tạo trục đồ thị
fig, ax plt subplots ()
# Hiển thị hình ảnh
ax.imshow(img, extent = 0 , img.shape[ ], 0 , img.shape[ ]])
# Tạo mảng giá trị từ 0 đến chiều dài và chiều rộng của hình với bước nhảy là 50
x_ticks np arange ( , img.shape[ ], 50 )
y_ticks np arange ( , img.shape[ ], 50 )
# Đặt các điểm cho lưới tọa độ
ax.set_xticks(x_ticks)
ax.set_yticks(y_ticks)
# Thêm lưới tọa độ màu đen
ax.grid( True , color = 'black' , linestyle = '-' , linewidth = )
# Danh sách để lưu tọa độ
coords []
# Hàm để xử lý sự kiện click chuột
def onclick (event):
ix, iy event.xdata, event.ydata
coords append ((ix, iy))
print ( 'x = %d , y = %d ' (ix, iy))
# Kết nối sự kiện click chuột với hàm onclick
cid fig.canvas mpl_connect ( 'button_press_event' , onclick )
# Hiển thị đồ thị
plt show ()
# Tách tọa độ x và y
x, y = zip ( coords)
# Tạo spline bậc 3
spline UnivariateSpline ( , y, k 3 )
# Tạo một mảng các giá trị x liên tục
x_smooth np linspace ( min ( ), max ( ), 500 )
# Tính toán các giá trị y tương ứng
Trang 1615
y_smooth spline(x_smooth)
# Vẽ đường bao màu đen
plt figure ()
plt imshow (img, extent = 0 , img.shape[ ], 0 , img.shape[ ]])
plt plot (x_smooth, y_smooth, 'red' , linewidth = )
plt xticks ( np arange ( , img.shape[ ], 50 ))
plt yticks ( np arange ( , img.shape[ ], 50 ))
plt grid (color = 'black' , linestyle = '-' , linewidth = )
plt show ()
1 Mục tiêu đạt được:
Nắm vững khái niệm và tính chất của spline bậc 3: Sinh viên đã hoàn toàn nắm vững các khái niệm cơ bản về spline bậc 3, bao gồm định nghĩa, phương trình, tính chất và ứng dụng Sinh viên có thể giải thích rõ ràng và chính xác các khái niệm này, đồng thời vận dụng chúng vào giải quyết các bài toán liên quan
Áp dụng spline bậc 3 để tạo đường bao cho 1 hình phẳng bất kỳ: Sinh viên đã thành công áp dụng phương pháp spline bậc 3 để tạo đường bao cho một hình phẳng bất kỳ được chọn Quá trình thực hiện được tiến hành một cách khoa học, logic và chính xác, đảm bảo tính chính xác và hiệu quả của kết quả thu được
Phân tích và đánh giá hiệu quả của phương pháp áp dụng: Sinh viên đã tiến hành phân tích và đánh giá một cách chi tiết về hiệu quả của phương pháp spline bậc 3 trong việc tạo đường bao cho hình phẳng Việc phân tích bao gồm các khía cạnh như độ chính xác, độ mịn, thời gian tính toán và khả năng áp dụng cho các hình phẳng có hình dạng phức tạp Kết quả phân tích cho thấy phương pháp spline bậc 3 có hiệu quả cao, đáp ứng được các yêu cầu về độ chính xác, độ mịn và thời gian tính toán
2 Kết quả đạt được:
Sinh viên đã nắm vững khái niệm và tính chất của spline bậc 3: Thông qua quá trình nghiên cứu và thực hành, sinh viên đã đạt được sự hiểu biết sâu sắc về các khái niệm và tính chất cơ bản của spline bậc 3 Sinh viên có thể giải thích rõ ràng và chính xác các khái niệm này, đồng thời vận dụng chúng vào giải quyết các bài toán liên quan một cách hiệu quả
Sinh viên đã áp dụng thành công spline bậc 3 để tạo đường bao cho 1 hình phẳng bất kỳ: Việc áp dụng spline bậc 3 để tạo đường bao cho hình phẳng đã được thực hiện thành công Sinh viên đã lựa chọn một hình phẳng bất kỳ, sau
đó áp dụng phương pháp spline bậc 3 để tạo đường bao cho hình phẳng đó Kết quả thu được cho thấy đường bao được tạo ra có độ chính xác cao, thể hiện đúng hình dạng của hình phẳng ban đầu
Trang 1716
Sinh viên đã phân tích và đánh giá hiệu quả của phương pháp áp dụng: Sinh viên đã tiến hành phân tích và đánh giá một cách chi tiết về hiệu quả của
phương pháp spline bậc 3 trong việc tạo đường bao cho hình phẳng Việc phân tích bao gồm các khía cạnh như độ chính xác, độ mịn, thời gian tính toán và khả năng áp dụng cho các hình phẳng có hình dạng phức tạp Kết quả phân tích cho thấy phương pháp spline bậc 3 có hiệu quả cao, đáp ứng được các yêu cầu
về độ chính xác, độ mịn và thời gian tính toán Ngoài ra, phương pháp này cũng có khả năng áp dụng cho các hình phẳng có hình dạng phức tạp, thể hiện tính linh hoạt và khả năng ứng dụng rộng rãi
VI Tài liệu tham khảo:
[1] A L Garcia and C Penland, MATLAB Projects for Scientists and Engineers, Prentice Hall, Upper Saddle River, NJ, 1996
[2] Steven Chapra, Numerical methods for Engineers
[3] http://www.khoahocviet.info/meresci/vi/meresci04d3.html