TRÄN CŨNG NGHỊ (Chủ biên), vũ TRỌNG CANG
pTTj [ T iT J m T M S R r » f J
ffllH l
■
ĐẠI HỌC QUỒC GIA TP HO CHI MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
Trần Công Nghị (Chủ biên), Võ Trọng Cang
LẬP TRÌNH ỨNG DỤNG
TRONG THIẾT KỂ VÀ ĐÓNG TÀU
1
T H Ư V ì EM
3
0
0
3
6
0
8
2
NHÀ XUẤT BẲN ĐẠI HỌC QUÔC GIA
TP HỒ CHÍ MINH - 2013
GT.QỊ.KTh(V)
791 -2013/CXB/03-40
ĐHQG.HCM-13
GT.KTh.830'-13(T)
MỤC LỤC
Chương I NỘI SUY, HÀM HÓA VÀ NURBS
1.1 Nội suy lagrange
1.2 Nội suy spline
1.3 Hàm hóa kết quả đo từ thí nghiệm, từ thống kê
1.4 ứng dụng phương pháp Nurbs tạo mặt vỏ tàu
1.5 Nurbs và mặt vỏ tàu
7
7
11
25
39
57
Cltương 2 PHƯƠNG PHÁP TÍNH TÌM ĐIẼM TỐI Ưu
2.1 Qui hoạch tuyến tính (Linear programming)
2.1.1 Phương pháp đồ thị
2.1.2 Phương pháp Simplex
62
64
64
67
2.2 Qui hoạch phi tuyến (Nonlinear programming)
2.2.1 Hàm một biến
2.2.2 Hàm nhiều biến
2.2.3 Xác định minmum (hoặc maximum) hàm một biến
2.2.4 Phương pháp tìm trực tiếp (không qua giai đọan tính gradient)
hàm nhiều biến, miền không hạn chế
2.2.5 Những phương pháp sử dụng gradient, miền không hạn chế
2.2.6 Tìm điểm minimum của hàm trong miền hạn chế
2.2.7 Tìm trực tiếp trong miền hạn chế
2.2.8 Sử dụng matlab giải các bài toán tìm điểm tối ưu
74
74
75
77
84
91
107
124
133
Chương 3 THI ÉT KÉ TÓI Ưu TÀU THỦY
3.1 Đánh giá các chỉ tiêu kinh tế - kỹ thuật của tàu
3.2 Sơ đồ tính hiệu quả kinh tế tàu
3.3 Thiết kế tối ưu tàu vận tải
3.4 Thiết kế tàu chở Container
3.5 Thiết kế tàu cá
143
143
145
146
157
161
Chương 4 TÍNH NÒI VÀ TÍNH ỎN ĐỊNH TÀU
4.1 Tính nổi tàu thủy
4.1.1 Kích thước chính và các hệ số thân tàu
4.1.2 Tỉ lệ Bonjean
4.1.3 Thể tích phần chim và các đại lượng liên quan đến thể tích
4.1.4 Các đường cong tính nổi
4 .1.5 Tính các đường thủy tĩnh trên máy cá nhân
4.1.6 Biểu đồ mang tên Firsov
169
169
169
173
173
174
176
178
4.2 Ổn định tàu
4.2.1 Ổn định ban đầu
4.2.2 Ồn định tại góc nghiêng lớn
4.2.3 ỉ)ồ thị ổn định
180
180
181
183
4.2.4
4.2.5
4.2.6
4.2.7
4.2.8
Thuật toán xác lập họ đường cross curves (pantokaren)
Tiêu chuẩn ổn định
Giới thiệu chưcmg trình tính tính nổi tàu
Lập thông báo ổn định cho thuyền trưởng
Xây dựng phần mềm phục vụ xếp hàng, xác định moment uốn lực
cắt tàu và đánh giá ổn định tàu hoạt động trên biển
4.2.9 Phần bổ sung
184
189
196
204
212
215
Chương 5 TÍNH sức CẢN VỎ TÀU. THIẾT KÉ CHÂN VỊT TÀU THỦY.
TÍNH TOÁN CHÒNG CHÀNH TÀU TRÊN SÓNG
219
PHẦN I: SỨC CẢN VỎ TÀU
5.1 Sức cản
5.2 Công suất hữu hiệu
5.3 Các phương pháp kinh nghiệm tính sức cản vỏ tàu
219
219
223
223
PHẦN II THIẾT KẾ CHÂN VỊT TÀU THỦY
5.4 Đặc tính hình học chân vịt
5.5 Đồ thị thiết kế chân vịt
5.6 xâm thực chân vịt tàu
5.7 Độ bến cánh chân vịt
5.8 Thiết kế chân vịt tàu thủy cánh cố định
5.9 lập chương trình thiết kế chân vịt tàu
5.10 Vẽ chân vịt trên máy cá nhân PC
237
237
244
252
257
261
269
279
PHẦN III CHÒNG CHÀNH TÀU TRÊN SÓNG
5.1 Lắc ngang tàu trên sóng điều hòa
5.2 Hàm rao
5.3 Xác định đặc trưng lắc ngang, lắc đứng, lắc dọc
5.4 Xây dựng phần mềm đánh giá lắc ngang tàu trên sóng biển
5.5 Chương trình máy tính mô phỏng chuyển động dọc của tàu
5.6 Bổ sung tài liệu
292
292
293
295
300
307
320
Chương 6 TÓI Ư u HÓA KÉT CẤU
6.1 Xây dựng bài toán thiết kế kết cấu tối ưu
6.2 Tối ưu tuyến tính
6.3 Tối ưu phi tuyến
326
326
330
345
LỜI NÔI ĐẦU
Cuốn sách “Lập trình ứng (lụng trong thiết ké và đóng tàu ” lù bản in sau sửa chữa, bỏ sung
cua sách “Tin học ứng dụng trong thiết ké và đóng tàu" NXB Đại học Ouốc gia TP.HCM
phát hành từ 2002.
Những đê tài trong tài liệu này bao gồm:
Lập trình tính toán tính nôi và tính ôn định tàu một thăn, tàu nhiêu thân,
Tính sức cản vỏ tàu, lập trình thiêt kẽ chân vịt tàu thủy, vẽ chân vịt tàu trên máy tính CP,
Tính toán tính núng đi biên (seakeeping) của tàu, xây dựng chương trình tính chòng chành
tàu trên sóng điêu hỏa và trẽn sóng biên,
Các phương pháp, các thuật toán tính toán tôi ưu và ứng dụng vào thiết kế tối ưu tàu thủy,
thiết kế kết cấu,
Các phương pháp nội suy và hàm hỏa giúp giải quyết cân bằng tùu trên nước, vẽ hoặc hiệu
chỉnh sườn tàu, đường hình tàu...
Tính cúc đường cong VCI mặt cong spline, B-spline, NƯRSB trong thiêt kê, mô phỏng vỏ tàu.
Sách trình bày theo cách tiện lợi cho người đọc. Hai chương đâu giúp bạn dọc nhớ lại những
hiên biết cân thiêt vê cúc phương pháp lỉnh toán liên quan đên nội dung của các đê tài, cỏ
điểu kiện làm quen những chương trình lính viết bang ngôn ngữ C hoặc Matlab đang áp dụng
rộng rai trong tính toán. Các chương trình máy tính nhỏ - tụm chuyên ngừ từ procedure,
subroutine, còn dược dừng tính toán những vân đẽ liên quan khúc trong ngành tàu. Nội dung
sách chu yêu góm những kiến thức đa được truyẽn đạt trong trường đại học chuyên ngành.
Trên cơ sở những van đề đang trình bày bạn đọc tìm hiếu thêm giải thuật xử lý những bài
toán cụ thê dang dặt ra và cách hoàn thiện một chương trình lính dựa vào giai thuật vừa cỏ.
Các giai thuật tính toán tính nang, như tính nói, ổn định, tính sức cản, chọn máy phù hợp,
thiết ké chân vịt cánh cố định cho tàu, tính di biên (sea keeping), vẽ tàu... đd được thư nghiệm
vù đưa veto ứng dụng.
Tài liệu trong sách cỏ thô giúp ích cho sinh viên theo học ngành đỏng tàu, kỹ sư lùm việc
trong lĩnh vực đóng sửa tàu, thiêt kê, nghiên cứu tàu cùng dông đảo bạn dọc quan tâm đên
tàu thúy.
Những người vièt xin chan thành cúm ơn cúc đông nghiệp, Tỏ giáo trình Trường Đại học
Bách khoa Tp Ho Chí Minh, NXB Đại học Quốc gia Tp HCM đã giúp dữ in lụi cuốn sách này.
Chương
NỘI SUY, HÀM HÓA VÀ NURBS
Trong chương này giới thiệu những phương pháp tính dùng nội suy và hàm hóa khi xử lý
những vấn đề thường gặp trong thiết kế vỏ tàu, tính toán tính nổi tàu thủy, xử lý kết quả đo
đạc từ thí nghiệm hoặc quan sát. Các phương pháp nêu trong chương giúp người thiết kế nội
suy, ngoại suy với yêu cầu đảm bảo chính xác các đường cong, mặt cong. Những hiểu biết cơ
bản về phương pháp NURBS, viết tắt từ Non-Uniform Rational B-Spline, giúp kỹ sư tàu thủy
nắm bắt những phương pháp tự động hóa vẽ đường hình tàu, vở tàu.
1.1 NỘI SUY LAGRANGE
Đa thúc nội suy Lagrange được viết dưới dạng1:
/(x) =p„(x) + R„(x)
( 1. 1)
hoặc dạng đầy đủ:
trong đó
/(x ) = y z.,(x )/(x ,)+ r í ( x - x ;)
,a < ệ < b
tí
L'=0
J (n + ỉ)l
n / x -x , \
L, (x) = Ị~]
-X
7=0
/*'
( 1.2)
(1.3)
Đa thức p n(x) = Y /,, (x) f (X, ) mang tên gọi da thức Lagrange, còn vế sau của phía phải
/=0
công thức gọi hàm sai số.
Đa thức p„(x) mặt khác được hiểu là đa thức bậc n, có dạng:
Pnự) = a0(x - X|) (X - x2)... (X - x„) +
+ ClI(X - Xo) (x - x2)... (x - x„) +
+ a2(x - Xo) (x - X|)... (x - x„) +
+ a,(x - Xo) (x - X|)... (x - x,.|) (x - X/+])... (x - x„)
a„(x - Xo) (x - X|)... (x - x„.2)(x - x„.| ) -
(1.4)
1 R.W. Hamming. “Numerical Methods for Scientists and Engineers", McGraw-Hill, N.Y, 1962,
F.B. Hildebrand, Introduction to Numerical Analysis”, McGraw-Hill, N.Y., 1956.
Hoffman, J.D., "Numerical Methods for Engineers and Scientists ” , 2nd edition, Marcel Dekker, Inc., New York.
(1992,2001)
8
CHƯƠNG ì
Các hệ sổ ao, a 1, Ỡ2v tính từ quan hệ:
=ẨXi) = yr, /= 0,1,2,...
(1.5)
Lần lượt thay X = Xo, X = X|,... vào công thức cuối có thế xác định công thức tính các hệ so. Ví
dụ, từ p„(xo) = Vo = ao(xo - xi)(xo - X2)... (xo - x„) sẽ nhận được:
«0 =
f ( x 0)
(x0 -x ,)(x 0 - x 2)...(x0 - x „ )
tương tự vậy có the viết:
a, = -
.
,IV 1 —
(x, - x 0)(x, - x 2)...(x, -x „ )
=
/(* „ )
(x„ - x 0)(x„ -x,)...(x„ -x„_,)
Hệ số thứ / mang dạng chung:
a. —
/ (7 )
(x, - x 0)(x, -x,)...(x, -x^.X x, - x , +1)...(x, -x „ )
( 1. 6)
Thay các biểu thức vừa xác định vào vị trí ao, a\,..., an sẽ nhận được công thức nội suy hay
còn gọi đa thức Lagrange:
Pn(x)
+
+
( x - x , ) ( x - x 2)...(x -x n)
(*0 - *1 )(*0 - *2 )-O o - x„)
( x - x 0) ( x - x 2)...(x -x „)
To + 7 ---------- 77--------- :—7-----------7 T 1 +
(7 - x0)(x, - x2)...(x, - x„)
(1.7)
Q -* o ) ( x - 7 )•••(*-7 ,-1)
(x„ - x 0)(x„ -x,)...(x„
(
hoặc dưới dạng gọn hơn như đã trình bày p n(x) = ^ L, ( x )/( x ,), với
/=0
L (x) = p f
%0
J*i
X- X.
X,
X
\
I
Những trường họp riêng lẻ của hàm nội suy Lagrange như sau.
với n = 1:
( x - x ,)
( x - x 0)
P\ (x) = 7------ - — To + 7 ------— T|
(x0 - x , )
( x , - x 0)
( 1. 8)
với n = 2:
( x - x , ) ( x - x 2)
( x - x 0) ( x - x 2)
( x - x 0) ( x - x ,)
Pi (x) = 7--------- 7 7 ------ —7 To + 7— — T T | + — -— - 7 7 -—
, T2
(x0 - X, )(x0 - x2)
(7 - x0)(x, - x2)
(x2 - x0)(x2 - X, )
với n = 3
,
(x - X, ) ( x - x ọ)(x - X .)
(x - xn) ( x - x,,)(x - xq)
p 3(x ) = 7---------77-------*-77----- ~ 7To +
0
2
3 Ti
(x 0 - Xj ) ( x0 - x 2) ( x 0 - x 3)
(x 1 - x0 ) ( Xj - x2X X, - x3)
(x - x ữ) ( x - X, ) ( x - X , )
(x 2 - x0) ( x 2 - xx) ( x 2 - x3)
(x —x n ) ( X —x, ) ( x —x9)
(x 3 - x0) ( x 3 - x l ) (x 3 - x 2) 3
(1.9)
Nộ/SUY, HÀM HÓA VÀ NURBS
Hàm p i(x) là đoạn thẳng qua hai điểm (x<), yo) (X|. yi ), có tên gọi công thức nội suy tuyến
tính. Hàm thứ hai là đường parabol bậc hai qua ba điểm cho trước, gọi là nội suy bậc hai.
Hàm thứ ba là đường parabol bậc ba qua bốn điếm cho trước, gọi là nội suy bậc ba.
Ví dụ 1: Cho trước 4 điếm của hàm y = /ịx). Hăy tính giá trị của hàm tại X = 3.44 theo phươn
pháp nội suy Lagrange bậc 1,2 và 3.
X
3,35
3,4
3,5
3,6
V
0,298507
0,294118
0,285714
0,277778
Nội suy hàm bậc 1:
/7, (3,44) =
(3 4 4 - 3 50)
„ (3 4 4 -3 40)
0-294118 + _
0,285714 = 0,290756
(3,40-3,50)
(3,50 - 3.40)
Hàm bậc 2:
p ,(3.44) . (3.44-3.40X 3.44-3.50)0 298507 + (1 4 4 -3 ,3 5 )0 4 4 -3 ,5 0 )0 2 9 4 , , g
(3.40-3,35X3,40-3,50)
(3,35-3.40X3,35-3.50)
+
(3.44-3,35X3,44-3,40)
0.285714 = 0,290697
(3,50-3,35X3,50-3,40)
Trường hợp /7 = 3 tính như sau:
Pĩ
(3,44 - 3,40)(3,44 - 3,50)(3,44 - 3,60) 0,298507+ (3^-335X 3,44-3,50X 3,44-3.60)
(3,40-3,35X3,40-3,50X3,40-3,60)
(3,35 - 3,40)(3,35 - 3,50)0,35 - 3,60)
(3,44)
+ (3 ,4 4 -3,35X3,44-3,40X3,44-3,60)
4+ (3,44-3,35X3,44 -3,40X3,44 -3 ,5 0)
(3,50-3,35X3,50-3,40X3,50-3,60) ’
78 =
(3,60-3.35X3,60-3,40X3,60-3,50)
Chương trình hóa phương pháp nội suy Lagrange được thể hiện bàng ngôn ngừ c sau.
#include
(math.h>
void L a g r a n g e (xa, y a , n, X, y, dy)
float x n [], y a [], x,*y,
*dy;
int n;
{
int i , m , n s = l ;
float den, dif, dift, h O , hp, w;
float *c, *d,
* v e ctor0 ;
dif = f a b s ( x-xa[q]);
c = vector(l,n);
d = v e c t o r (1,n ) ;
for
if
(i=l; i<=n; i++)
( ( dift = fabs(x - xa[l]
ns =i ;
dxf = dift;
>
c[i] = y a [ i ] ;
d [i ] = y a [i ] /
}
{
)) < dif)
{
41|8
0698
CHƯƠNG ỉ
10
*y = ya[ns— ];
for
( m = l ; m
{
for (1=1; i <= n - m ; i++)
h0= xa[i]
-x;
hp = xa[i+m]
w = c[i+l]
if
{
- x;
- d[i];
((den=hO-hp) == 0.0) n e r r o r ("Error here
!");
den = w/den;
d[i] = hp*den;
c[i] = h0*den;
}
*y += (*dy=(2*ns <
(n-m)
? c[ns+l]:
d[ns — ] ));
}
free_vector(d,1,n ) ;
free_vector(c,l,n);
}
Áp dụng cách tính này xác định chiều rộng tàu tại các đường nước bất kỳ dựa trên cơ sớ dữ
liệu thiết kế ban đầu. Dữ liệu có trước từ thiết kế sườn lý thuyết thứ 3 tàu vận tải bien như
sau:
T(m) =1 1,5 2 2,5 3 3,5 4 4,5
1/2 B(m) = 6,72 7,415 7,98 8,42 8,77 9,05 9,296 9,533
Cần xác định giá trị 1/2 B tại đường nước T = 1,75 2,25 3,25 4,4 5 và 5,6 m, căn cứ vào dữ
liệu trên đây, sử dụng phương pháp nội suy Lagrange bậc 3.
Kết quả tính theo chương trình 1/2 chiều rộng tàu tại các dường nước như sau:
7,714 8,2135 8,9167 9.4853 9,7815 10,12 m
Nội suy B|
NỘI SUY, HÀM HỎA VÀ NURBS
1.2 NỘI SUY SPLINE
Vê mặt hình học, hàm spline có xuất xứ từ các đường cong được nắn theo mép các thanh
thước mỏng, trước đây làm bằng gỗ, mà những người vẽ tàu trên sàn phóng dạng thường
dùng. Hiểu bản chất của hàm spline sẽ dễ dàng xây dựng các đường cong trong tự nhiên phục
tùng các hàm này. Neu spline được trình bày dưới dạng hàm s(x), trong phạm vi thay rất nhò,
s” (Ỵ) miêu tả cung uốn, còn chiều dài cung có thể thay bằng dx.
Hình 1.2 Xuất xứ tên gọi “spline ”
Khác với phưong pháp nội suy Lagrange, trong đó da thức bậc n phải miêu tả hàm đi qua n +
1 điểm, ví dụ hàm bậc 3 qua 4 điểm, phương pháp spline bậc 3 thực hiện hàm hóa dạng hàm
spline trong mỗi phân đoạn hạn chế giữa các nút kề nhau. Phương pháp này diễn đạt bàng ký
hiệu pp, viết tắt từ piecewise polynomial - đa thức trong từng phân đoạn.
p(x) = CI + bx + cx2 + c/.r’
Đa thức bậc 3 này xây dựng nhờ 4 hệ số, có đạo hàm bậc 1 và đạo hàm bậc 2.
Hàm spline không thích hợp cho việc miêu tả các đường gẫy khúc song thể hiện đường cong
tự nhiên của vỏ tàu rất sát thực tế.
Trong trường hợp thanh thước giả định trên đây chưa bị gẫy, có thể thấy rằng ,S' và liên tục
trong [x0, JC„]. Mặt khác từ lý thuyết về dầm trong cơ học có thể thấy rõ. đường s(x) là da thức
bậc ba (cubic) của X. có tính liên tục qua các nút. Đạo hàm bậc một và bậc hai của s(x) cũng
liên tạc trong phạm vi này.
Số tham số trong hàm spline bậc ba được tính đủ như sau. Giả sử đường s(x) được chia ra
thành (n - 1) phân đoạn, hạn chế bang n nút. Trong tất cả n - 1 phân đoạn của s, để miêu tả
hình dáng hình học của mỗi phân đoạn cần 4 tham số, tổng cộng cần xử ly 4n - 4 tham số.
Như dã miêu tả, (n - 1) phân đoạn cùa s(x) tựa trên n nút, hàm s(x) cùng đạo hàm bậc một và
đạo hàm bậc hai của nó liên tục tại tất cả (n - 2) nút nam trong s(x), chì trừ nút đầu tiên và nút
thứ n. Trường hợp phải thỏa mãn điều kiện s(x,) = Vi áp dụng cho n nút, cần thiết phải viết đủ
n điều kiện trên s. Và như vậy bài toán có 4/7 - 6 điều kiện. Ngoài điều này. hàm spline phải
thỏa mãn điêu kiện biên tại hai nút biên: ,v”(xi) = s '\x n) = 0.
Hàm f(x) xác định qua các nút a = Xo < X/ < ...xn = b trong khoảng [a b] theo cách sau:
s là đa thức bậc 3 trong khoảng [xjXj+i], /■= 1,1, 2, ..., n-Ị
S(xJ) = f(xJ) , j = \ , \ , 2 , . . . , n - 2
Sj+i(Xj+i) = Sj (xr /), / = 1,1,2. ..., n-2
S\r l (xJrl) = S'j(xJ+lị j = 1.1,2, ...,/7-2
S”j~l(Xj +l) = S”y (xJ+l), j= 1,1,2, ..., /7-2
12
CHƯƠNG I
Điều kiện biên của hàm ¿ thuộc một trong hai dạng:
Dạng tự nhiên:
s , \xn) = S'\x„)
Dạng ngàtn:
¿ ’(xfì) = f ’(x0) và ¿ ’(x„) = / ’(x„)
Hãy dựng hàm spline qua 3 điểm (5, 5) (7, 2) (9, 4) với điều kiện biên dạng tự nhiên để làm
quen cách thực hiện.
Trong khoảng này có hai phân đoạn, phân đoạn đầu [5 7], phân đoạn sau [7 9], Trong mỗi
phân đoạn sẽ có một hàm bậc ba.
S0(x) = aũ + bữ(x - 5) + c0(x - 5) 2 + d0( x - 5)3
¿, (x) = ữ, + bx(x - 7) + c, (x - 7)2 + d x(x - 7)3
Đe xác định 8 hệ số trong hai phương trình cần xây dựng hệ phương trình đại số gồm 8
phương trình.
5 = ¿0(5) = a0
2 = ¿0(7) = ao + 2bo + 4co + 8c/o
2 = ¿1(7) = «,
= ¿|(9) = úị + 2b\ + 4t'i + 8r/|
4
và
¿ ’o(7) = ¿0 + 4co + \ 2do = b\ = ¿ ’i(7)
¿ ” o(7) = 2co+ 12í/o = 2c, = ¿",(7 )
¿ ” o(5) = 0 = 2Co
¿ ” |(9) = 0 = 2c’i +12t/,
Tập họp các phương trình này ờ dạng sau:
5
ƠQ
2 = ỠQ + 2¿0 + 4c0 + 8c/0
CL
4 —r/( 4- 2bx + 4C| + 8(7
0=
+ 4c0 + 12c/0 —¿1
0 = 2c0 +12d0 - 2c,
0
‘
a,
với nghiệm 0
5
1
2
= 2c0
b,
17
T
1
4
c,
0
15
16
0 = 2c, +12 li.
Hai hàm spline có dạng sau:
17
5 < X < 7 .?0(.v) = 5 - ^ ( . v - 5 ) + r 4 ( . r - 5 ) J
o
SI
7 < X < 9 ¿, (X) = 2 - - (x - 7) + — (x - 7)2 + — (x - 7)'
4
’ 16v
;
32v
’
d,
5
32
5
32
NOISIJY. HAM HOA VA NURBS
Truong hop chung, xay dung cac ham bac 3 qua cac diem
xq,
X j , X2 , .
Sj (x) = a j + bj (x —x j) + c j (x —x l)2 + cil(x - x , ) '
x n nhu sau:
j = 0,1,2, ■■■,«-1
Hay ky hieu:
h, = *>♦.
S j(xA = a ,
SJ+]( x ^ ) = a /+] = S J(x i+]) = a i +b,/?, + c th] + d ,1a)
Cac dieu kien bien:
Tinh dao ham bac 1
S](x) = b l + 2c ,(x - x ,) + 3d ,(x - x 7)2
j = 0 , 1 , 2 , u -1
s'M,) = h,
S'J+](x l+,) = bJ+] = s ) ( * /+i) = /h + 2cJh + 3dlb l2
Tinh dao ham bac 2
,S’'(x) = 2c, + 6d /
■ W
j = 0,1.2, •••,/7-1
= 2c,
S"l+] (x/+1) = 2c/+I = 5; (x,+1) = 2c, + 6dih/
Hien tai chung ta da xav dung 3n phuang trinh va so an la 3«.
Vdi j = 0,1...... n
1 chung ta co the viet:
A j+ Cjh] + d , h
«,+. =«.,
&,+■ = *, + 2cJhJ +3dJh]
c,+.
+ 3d )hJ
Tir phuang trinh 3 giai dugc:
J
«7+i =
3/z,
+ V c + Cjh- +
¿ h = /’, + /7,(c', +i>/ J
+ hihi + y (2c/ + c /u )
CHƯƠNG ỉ
14
Từ đây tính bỳ.
bj = ư ( a i+, - a ) - ^ -(2 Cj + C/+I), tiếp đó
h
b,-\ = T ~ ( aj - aj- \) - - T ~ ( 2cj-y + ci)
hj-1
3
bj =bj_x+hJ_\cJ_I + c ,)
^(«,♦1 - " / ) - % ( 2c, + to J = - r - ( flj - flH ) - - f ( 2cH + c / ) + V i ( c> ! fc'/)
«,
3
3
h j-\
Chuyển c về một phía phương trình ta có:
h,-ic H + 2c',(V i + /h )+ V V i = T -(« /+i
- « ,- 1)
y = 1,2,■••,7-1
h j-\
Nếu 5” (xo) = >S’o” (xo) = 2c‘o lúc đó 6’0 = 0
Nếu S” (x„) = 5„.i” (x„) = 2c„ lúc đó c„ = 0
Dưới dạng ma trận chúng ta có thế viết:
h0
' 1
A=
K
0
0
0
ÁK + K )
\
hì
2(hị + h2)
.
.
0
0
0
0
0
0
0
0
0
h2
h„_2 2 (* „-2 + V i ) b,
0
M
^0
0
-/
Ma trận A là ma trận 3 đường chéo.
c \
( 3 / / 7 , X « 2 - « i ) - ( 3 / A „ X f l | - « 0)
£ 2
c tì- 1
>= <
(3 / /7,
(3 / /?01 X « . - « , )
( 3 / A n- , X « „ - « , , - i ) - ( 3 / ^ , - 2 X " , , - i - « » - 2 )
0
Ví dụ 2 Cho trước 4 điếm của hàm y = f(x). Hãy tính giá trị của hàm tại X = 0,25 Ví giá trị
đạo hàm tại cùng điếm theo phương pháp nội suy spline.
X
- 1,0
T 0.861995
-0,5
0
0,5
0,958020
1,09861
1,294377
Trường hợp này n = 3 và hữ = h\ = /?2 = 0,5
Với ao = 0.861995: a, = 0.958020; Ch = 1,09861; «4 = 1,294377.
15
NỘI SUY, HÀM HỎA VÀ NURBS
0
0
0
0
__ 1
Phương trinh ma trận có dạng:
c0
2
0,5
0
ĐX
2
0,5
cl >= <0.26740
0,33103
1
T3.
0
Kêt quả giải hệ phương trình:
k
bk
0.17564
Ck
0
0,06565
1 0,95802
0,22488
0.098476
0,02828
1,09861
0,34456
0.14090
-0,09392
2
-1
<
X
< -0,5
dk
Uk
0 0,86199
S0(x) = 0,86199 +0,17564(x + l)+0,06565(x + l)2
-0.5 < x < 0
S ị(x) = 0,95802+ 0,22488(x + 0,5) + 0,098476(x + 0,5)2 + 0,02828(x + 0,5)3
0 <
s 2(x) = 1,09861 + 0,344546x + 0,14090x2 - 0,09392x3
X
< 0,5
y
Từ các phương trình S(x) tính được: .5(0,25) = 1,1921, hình a, s '(0.25) = 0,3974
Trường hợp hai đầu bị ngâm điều kiện biên thê hiện như sau:
Nếu S'(a) = So\a) - f \ a ) = bo lúc đó
/ '( « ) = 7 - («I - « o ) - - ^ L(2c0 + c l)
K
3
Điều này tương đương h0(2cữ + c,) = — (í/, - a0) ~ 3f \ à )
K
Nếu s \b ) = N„’(6) = / ’(ố) = bn
CHƯƠNG ì
16
Điều này tương đương
(c„_, + 2c„) =
- ữ„.,) + 3/'(/>)
‘n - l
Từ đây có thế viết ma trận A:
^0
0
ÁK+K)
/7,
o
o
o
A=
2/?(
h\
2(/7, + /z2)
0
0
0
h2
•
0
0
0
0
0
0
Vĩ
0
2 (V 2+ V l )
c> '
0
CI
(3//i0X«1- « 0) - 3 /' ( a )
>—<
M
V,
2 V ,_
(3/A,X"2 ~ ữi ) - ( 3 / V X ữi -flo)
>
(3 / /7„_, X"„ - ( 3 /b n-2 x«,,-l
3 /' (/>)- (3 //»„., Xí/„
c, .
Các hệ số Oị j = 1,2,
C\ theo cách sau:
đã biết do vậy có thể giải hệ phương trình đại số
h
b, = T - ( " ,+i
hj
3
= 77“ (C/+I -<•’,)
3h ,
I + 2 c /)
j = 1,2,•••,/7-1
Xứ lý bài toán đang nêu trường hợp hai đầu ngàm:
Trường hợp này n = 3 và /ío = /ỉi = /72 = 0,5
Với «0 = 0,861995; «1 = 0,95802009; a2 = 1,0986123; a4 = 1,2943767
Để ý ràng f ( - 1) « 0,15532 v à / (0,5) « 0,45186, phương trình ma trận có dạng:
"1
0
0,5
2
0,5
ĐX
2
0"V
0 CI
0,5 £7
1 __ ^3
0,110064'
>= <
0,267402
0,33104
0,181001
Kết quả giải hệ phương trình:
k
Cik
bk
0 0,86199 0,15536
1 0,95802 0,23274
2 1,09861 0,33338
Ck
0,0653748
0,0893795
0,11191
dk
0,0160031
0,0150227
0,0087572
NỘI SUY, HÀM HÓA VÀ NURBS
17
-1 < X < -0.5 s ữ(x) = 0,86199 + 0,155362(x + l) +0,0653748(x + l)2
-0,5 < X< 0 s, (x) = 0,95802+ 0,23274(x + 0,5) + 0,0893795(x + 0,5)2 +0,0150207(x + 0,5)3
0 < x < 0 ,5
S2(x) = l,09861 + 0,33338x + 0,11191x2 +0,087572x3
Ví dụ tiếp theo trình bày cách xác định hàm nội suy trong từng đoạn dựa vào kết quả thí
nghiệm.
X = 0
1.0000 2.0000 2.5000 3.0000 3.5000 4.0000
y = 2.5000 0.5000 0.5000 1.5000 1.5000 1.1250 0
Các hệ số a, b, c, d trong phân đoạn với giới hạn xl - trái và xr - phải như sau:
X1
0.0
1.0
o
CN
2.5
3.0
3.5
ỵ.r
1.0
2.0
2 .5
3.0
3.5
4 .0
d
0.4225
0.4225
-3.9147
2.5039
-1.1008
-1.1008
c
-0.2674
1.0000
2.2674
-3.6047
0.1512
-1.5000
b
-2.1550
-1.4225
1.8450
1.1764
-0.5504
-1.2248
a
2.5000
0.5000
0.5000
1.5000
1.5000
1.1250
Lấy ví dụ phân đoạn [3,5 4] xác lập spline dạng sau đây:
S(x) = 1.125 - 1.2248*(x-3.5) - 1.5*(x-3.5)2 - 1.1008 * (x-3.5)3
S'(x) = -1.2248 - 3.0*(x-3.5) - 3.3024 * (x-3.5)2
s ''(X) - -3.0 - 6.6048*(x-3.5)
s (3.5)=1.12 5, s' (3.5)=-1.2248,
s '' (3.5)=~3.0
s (4.0)=0,
s' (4 )=-3.5504,
s' '(4)=-6.3024
ĐỒ thị dựa vào kết quà nội suy spline (đường nét liền) thể hiện tại hình 1.4.
Hàm spline thể hiện trong ngôn ngữ c dưới dây, viết theo giải thuật vừa nêu có thể giúp
người đọc trong các việc chuyên môn.
doúble c_spline (double u, double xy[] [2] , int N)
{
double t, dx, d x l , d x 2 , dy;
double *b, *c, *d;
double epsilon =0.1e-08;
int i , i b , j , k , N m l , N m 2 ỉ
Nml = N - 1;
Nm2 = N - 2 ;
b as calloc( N, s i z e o f ( double ) > ;
c = calloc( N, s i z e o f ( double )) ;
d = calloc( N, s i z e o f ( double ) ) ;
if ( N < 2 ) e x i t (0);
if ( N < 3 ) goto L 5 ;
d[0] = xy[l] [0] - x y [0] [0] ;■
if ( d [0] == O.OeO ) d [0] = epsilon * (xy[l] [1] - xy[0][l]);
c[l) = ( x y [1] [1] - x y [0] [1]) / d[0] ;
for ( 1 = 1 ; i < N m l ; i++)
{
dy = x y [i+1][1] - x y [ i ] [1];
d[i] = xy[i+1][0] - x y [ i ] [0];
18
CHƯƠNG 1
if ( d[i] —
O.OeO) d[i] = epsilon * dy;
b[i] = 2.0 * ( d[i-l] + d[i] );
c[i+l] = dy / d[i];
c[i] = c[i+l] - c[i];
}
b [0] = -d[0]; b[Nml] = -d[Nm2];
c[0] = c[Nml] = 0.0;
if ( N == 3 ) goto L15;
dxl = x y [3] [0] - xy[l] [0] ;
dx2 = x y [2][0] - x y [0][0];
if ( dxl =
0.OeO ) dxl = epsilon * (xy[3][l] - xy[l][l]);
if ( dx2 =
O.OeO ) dx2 = epsilon * ( xy[2][1] - xy[0][1] );
c[0] = c [2] / dxl - c[l]/ dx2;
dxl = xy[Nml][0] - xy[N-3][0];
if ( dxl = O.OeO) dxl = epsilon * (xy[Nml][l] - xy[N-3][l]);
dx2 = xy[Nm2] [0]
- xy[N-4] [0] ;
if ( dx2 == 0.OeO ) dx2 = epsilon * (xy[Nm2][l]
c[Nml] = c[Nm2] / dxl - c[N-3]/ dx2;
- xy[N-4][l]);
dxl = (xy[3] [0] -xy[0] [0]) ;
if ( dxl == 0.OeO ) dxl = epsilon * (xy[3][l] -xy[0][l]);
c[0] = c[0] * d[0] * d[0]/dxl;
dx2 =( xy[Nml][0] - xy[N-4][0] );
if ( dx2 == O.OeO) dx2 = epsilon * ( xy[Nml][l] - xy[N-4][l]
c[Nml] = -c[Nml] * d[Nm2] * d[Nm2] /dx2;
L15:
for ( i = 1; i < N; i++) {
if ( b[i-1] != O.OeO) t = d[i-l] / b[i-l];
b[i] -= t * d[i-l];
c[i] -= t * c[i-l];
);
}
c[Nml] = c[Nml] / b[Nml];
for ( ib = 2 ; ib <= N; ib++) {
i = N - ib;
if ( b[i] != 0.0) c[i] = ( c[i] - d[i] * c[i+l]) / b [i ];
}
b[Nml] =
2.0*c[Nml]);
for ( X = 0 ; i < N m l ; i++)
* (c[Nm2]
{
b[i] = ( xy[i+l][1] - x y [i][1]) /d[i] ~ d[i] * (c[i+l] + 2.0*
c[i]) ;
d[i] = ( c[ i+1] - c[i]) / d[i];
c[i] = 3 . 0 * c[i] ;
}
c[Nml] = 3.0*c[Nml];
d[Nml] = d[Nm2];
goto L6;
L5:
+
19
NỘI SUY, HÀM HỎA VÀ NURBS
b [0] = (xy[l] [1] - x y [0] [1]) / ( xy[l] [0] - xy[0][0]
);
c [0] = d[0] = c[l] = d [1] = 0.0;
b[l] = b[0];
L6:
i =0;
if ( i > N ) i =0;
i f ( u < x y [i ][0]) goto L10;
i f ( u < xy[±+l][0]) goto L30;
L10 :
i =0;
j = N;
L20:
k = ( i+j) / 2;
if ( u < x y [k ] [0]) j = k ;
if ( u >= xy[k][0] ) i = k;
if ( j > i+1) goto L20;
L30:
dx = u - xy[i][0];
t = xy[i][1] + dx*(b[i] + dx*(c[i] + dx * d[i]));
f ree( b );
f ree( c ) ;
f ree( d ) ;
return t;
}
Áp (lụng nội suy spline vẽ đường hình tàu
Dựng các đường nước thân tàu
Từ bản vẽ đường lý thuvết, tại đường nước số 3 tàu vận tải hàng lỏng đọc một số dữ liệu dạng sau:
Sườn
B/2 (m)
0
1/2
0 0,3355
1
1,4388
2
3,938
Waterline No 3
3
6,3855
4
8,4381
CHƯƠNG I
20
Kết quả tính nhờ phép nội suy Spline bậc 3 cho phép nhận các giá trị nửa chiều rộng tàu tại
các sườn thực. Những dữ liệu chép ra đây là giá trị nửa chiều rộng tàu, tính từ sườn thực số 20
trở về trước tàu, đến sườn 48.
1,3399 1,4586
1,5775
1,69651,8157 1,9351 2,0545
2,1741 2,2939
2,4137
2,53362,6537 2,7738 2,8940
3,0143 3,1346
3,2550
3,37553,4959 3,6165 3,7370
3.8576 3,9782
4,0988
4,21934,3397 4,4600 4,5801
Ví dụ tiếp sau đề cập đến các đường sườn lý thuyết tàu vận tải. Chiều rộng sườn thứ 2‘/ỉ tàu
vận tái đi biển sức chở 12000 dwt ghi nhận từ thiết kế ban đầu, tính theo vị trí đường nước:
T = 0 ,5 1
ĩ,5 2 2,5 3
4
5
6
8
9 (chiều cao đường nước, m)
1/2B = 4,6 7,9 8,64 9,2 9,6 9,93 10,16 10,45 10,65 10,81 10.98 11 (*/2 chiều rộng tàu, m)
Cần xác định '/2 B cho các đường nước ở độ cao sau:
0,7000 0,9000
1,1000
1,30001,5000 1,7000 1,9000
2,1000 2,3000
2,5000
2,70002,90003,1000 3,3000
3,5000 3,7000
3,9000
4,10004,30004,5000 4.7000
4,9000 5,1000
5,3000
5,50005,70005,9000 6,1000
6,3000 6,5000
6,7000
6,90007,10007,3000 7,5000
7,7000 7.9000
Ket quả nội suy spline như sau:
8,3341 8,5518 8,7414 8,9733 9,2000 9,3819 9,5305
9.6695 9,8059 9,9300 10,0341 10,1212 10,1965 10,2635
10,3234 10,3774 10,4267 10,4725 10,5156 10,5563 10,5950
10,6320 10,6677 10,7022 10,7353 10,7666 10,7961 10,8234
10,8484 10,8713 10,8920 10,9108 10,9275 10,9423 10,9553
10,9664 10,9759
Thể hiện kết quả tính bằng hình vẽ:
NỘỈSUY, HÀM HÓA VÀ NURBS
4
5
21
6
7
8
9
10
11
B/2 (m)
Hình 1.6
Spline vói hàm hai chiều
Các đường cong bất kỳ trong không gian 2D có thể biểu diễn dưới dạng hàm gần đúng theo
đường spline vừa nêu. Giả sử hàm f(x.y) với hai biến X, y xác định trong miền:
X) < X < xn
yi < y < ym
Trong bài toán hai chiều này chúng ta có thể hình dung các giá trị của hàm hai biến được xếp
trong ma trận yaa[j][k], theo cách viết trong ngôn ngữ c , trong đó j thay đổi từ 1 đến n còn k
thay đôi từ 1 đến m. Cách sắp xếp này tưcmg đồng với sắp hai vector xa độ lớn m, và ya độ
lớn n. Quan hệ giữa hàm yaa và f(x,y) có dạng sau:
yaa Ịj 1 [k] = f (xa íj ], y a [k] ) .
(a)
Giá trị cùa hàm f() tại điểm bất kỳ (x,y), nam trong tứ giác xác định bàng bốn cạnh, nối liền 4
nút bao điểm, thứ tự từ nút thấp bên trái, theo chiều quay ngược với chiều quay đồng hồ là 1,
2, 3, 4 được hiểu:
xa [j] < X < x a [j+l]
ya[j] < X < y a [j+ 1]
theo cách đó để xác định j và k, còn giá trị các điểm dược hiểu:
fi= yaa [j ] [k ];
¿
2=
yaa [j +1 ] [k ] /
Í 3- yaa [ j + l ] [k + 1] ;
f 4= y a a l j ] [ k+1] ;
CHƯƠNG 1
22
Đạo hàm của hàm f(x,y) được ký hiệu theo cách sau:
Nút 1
Nút 2
Nút 3
Nút 4
y
ổf/ổx
ổf/ổy
cPỉ/dxõy
Nếu sử dụng các ký hiệu sau:
t = ( X - x a [ j ]) / ( x a [j +1] - x a [ j ])
u = ( y- ỵ a [k] ) / (ỵa[k+l] - ya[k])
(b)
(c)
để t và u nằm giữa 0 và 1, hàm f(x,y) có thể viết lại dưới dạng:
f(x,ỵ) = (1-t) (l-u)yi + t(l-u)y2 +tuy3 + (l-t)uy„
(d)
Đạo hàm bậc một và bậc hai của hàm hai biến được tính theo công thức:
f ( x ,y )
ị
i
(e)
/=l 7=1
f A x , y ) = ỵ ỵ ự - ỉ ) c , / -2
(0
/=1 7=1
f . ì {x,ý) = Ỵ i Ỵ i U - ì ) c , /
<=1 7=1
(g)
f'ìĩ(x ,y ) = £ £ ( * ' " !X7 - l)
(h)
1=1 7=1
Các bước tiến hành tiếp theo không khác cách làm đã áp dụng cho hàm một biến. Hàm spline
áp dụng cho hàm hai biến, tiếng Anh gọi là bicubic spline được chương trình hóa trên cơ sở
các hàm một biến theo nghĩa cubic spline, như đã trình bày tại phần trước.
/* SPLIE2 - to splin2 */
void splie2(xa/ ya, yaa, m, n, y2a)
float xa[], ya [ ] , **yaa, **y2a;
int m , n ;
{
int j ;
void spline 0 ;
for (j=l; j< = m ; j++) ;
spline(ya, yaa[j], n, 1.0e30, 1.0e30, y2a[j]);
}
/* SPLIN2 - Bicubic Spline */
void splin2(xa, ya, yaa, y2a, m, n, X, y, f)
float x a [], ya[], **y2a, X, y, *f;
int m, n;
í
23
NOlStJY, HAM HOA VA NURBS
int j ;
float *ytmp, *yytmp, *vector() /
void spline(), splint () , free_vector();
ytmp=vector(1,n ) ;
yytmp=vector (1,n) ;
f o r (j=l; j<=m; j++)
splint(ya,yaa[j] , y2a[j], n, y, &yytmp[j]);
spline(xa, yytmp, m, 1.0e30,1.0e30, ytmp);
splint (xa, yytmp, ytmp, m, x, f) ;
fre^vector(yytmp, 1, n);
free_vector(ytmp, 1, n ) ;
}
void splint(xa, ya, y2a, n, x, y)
float xa[], ya[], y2a[], x, *y;
int n ;
{
int klo, khi,k;
float h, b, a;
void nerror();
klo=l;
khi=n;
while (khi - klo) > 1 {
k=(khi+klo) » 1;
if (xa[k] > x) khi=k;
else klo = k;
}
h=xa[khi] - xa[klo];
if ( h== 0.0) nerror(”Bad XA input”);
a=(xa[khi]-x) / h;
b=(x-xa[klo]) / h;
*y= a*ya[klo]+b*ya[khi] + yafkhi] + ((a*a*a -a) *y2a[klo] +
-b)*y2a[khi]) * (h*h) / 6.0;
}
void spline(x, y, n, y p l , ypn, y2)
float x[] , y [], ypl[], ypn[], y 2 [] ;
int n;
{
int i, k;
float p, qn, sig; un,
*vector();
void free_vector();
u=vector(i, n-1) ;
if (ypl > 0.99e30) y2[l] = u[l] = 0.0;
else {
y2[l]= -0.5;
u [1]=(3.0/(x[2] - x[l])) * ((y[2] - y [1]) / (x[l] -ypl);
}
for (i=2; i<=n-l; i++)
{
sig=(x[i] - x[i-l])/(x[i+l] -x[i-1]);
p=sig*y2[i-1]+2.0;
y2[i] = (sig -1.0) /p;
(b*b*b
CHƯƠNG 1
24
u.[i] = (y[i+1 ] -y[i]) /
/ (x[i] -x[i-
1]) ;
u[i] = ( 6.0*u[i]/ (x[i+l] -x[i-l]) -sig * u[i-l]) /p;
}
if (ypn > 0.99e30)
qn = un = 0.0;
else {
qn=0.5;
u n = (3.0/(x [n ] -X[n-1])/(qn*y2[n-1] + 1.0);
for (k=n-1; k>=l; k— )
y2[k]=y2[k]*y2[k+l]+ u[k];
free_vector(u, 1, n-1);
}
Ví dụ nội suy mặt cong
Áp dụng cách thức nội suy spline đã trình bày cho phần đường cong, chủng ta có thể tìm giá
trị của điểm bất kỳ trong mặt cong f(x,y) được các hàm spline dựng. Ví dụ sau đây trình bày
bước thực hành nội suy, đánh giá sai số phép nội suy.
Sai 8Ố (Error)
Hình 1.8
25
Nộ! SUY, HÀM HÓA VÀ NURBS
1.3 HÀM HÓA KÉT QUẢ ĐO TỪ THÍ NGHIỆM, TỪTHÓNG KÊ
Kết quả đo từ phòng thí nghiệm, từ đo thực tế hoặc dữ liệu thống kê thể hiện rất đa dạng.
Hình 1,9a giới thiệu kết quả đo từ thí nghiệm đóng cọc vào nền đất. Khi chiều sâu cọc lớn, áp
lực lên đầu cọc tăng. Hình 1.9b phía phải mô tả đon giá sản phẩm sản xuất hàng loạt, khi số
lượng sản xuất đang trong giai đoạn đơn chiếc, đơn giá cao, khi số lượng hàng sản xuất qui
mô lớn đơn giá giảm
Để có thể đưa tập họp kết quả đó phục tùng qui luật nhất định, miêu tả gần sát thực tế cân
thiết xây dựng hàm toán đủ khả năng diễn tả sự việc. Hình 1.10 phía trái cùng miêu tả quá
trình nội suy bậc 1, tức dựa vào hàm tuyến tính để xác định giá trị tại 1 điểm hoặc nhiều diêm
người dùng yêu cầu.
o
o
o
o o
o
°
o
o
o
o o
0
° oo
o o o
o° °
° o o
a)
b)
Hình 1.9
Hình 1.10 phía phải trình bày cách xây dựng hàm tuyến tính, trong tài liệu này đang dùng từ
đồng nghĩa là hàm hóa, bao quát kết quả đã công bố, trong hệ tọa độ Oxy. Khác với quá trình
nội suy, trong đó người ta yêu cầu đánh giá vấn đề tại những điểm cụ thể, còn hàm hóa là giải
quyết vấn đề trong toàn miền.
Tùy thuộc cách hàm hóa, hàm vừa xây dựng đi qua tất cả các điểm đo cho trước, nếu có cách
làm đúng yêu cầu, hình 1.1 la, sona cũng có thể đi qua miền tập họp dày các dữ liệu đo, hình
1.1 Ib. Trên hình này p chỉ hàm đa thức còn D chỉ điểm. Ket quả của hàm hóa chúng ta luôn
nhận được hàm giải tích miêu tả sự kiện, p có thể là đa thức song cũng có thể hàm mũ, hàm
e ...