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 (2.22 MB, 22 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
<b>VIỆN TOÁN NG D NG VÀ TIN H</b>Ứ Ụ <b>ỌC </b>
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3"><b>1. Đặt vấn đề </b>
Các phương pháp tính nội suy đa thức đã biết ở các chủ đề trước, công thức tính khá thuận lợi, nhưng khi số lượng mốc nội suy tăng thêm thì bậc của đa thức nội suy cũng tăng lên. Khi nội suy v i b d li u lớ ộ ữ ệ ớn thì đa thức thu được s có b c r t cao, khi n vi c tính tốn và s dẽ ậ ấ ế ệ ử ụng đa thức thu được trở nên phức tạp hơn. Và phương pháp nội suy bằng hàm ghép trơn đã khắc phục được như c điểm đó. ợ
<b>2. Ý tưởng phương pháp </b>
Từ n+1 m c n i suy, ta xây d ng các ố ộ ự đa thức b c thậ ấp hơn n trên từng khúc, nhưng khi nối chúng l i vạ ẫn đạt độ trơn cao (ghép trơn từng khúc). Các đa thức này có bậc như nhau và bậc chúng không đổi khi ta tăng số mốc nội suy
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4"><small>4 </small>
Trước hết ta cần biết định nghĩa hàm ghép trơn. Xét 1 phân hoạch chia đoạ [a,b] như sau:n
<b>1. Spline b c 1 </b>ậ
S(x) là đa thức bậc nhất nên có dạng:
S(x) là đa thức bậc 2 nên S’(x) là đa thức bậc nhất
Đăt S x'
<small>6 </small>
2<small>o</small>
</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">22
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9"><small>i i</small>
<small>i i</small>d<small>+</small>
− −−=
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">− −−=
− −
<b>4. Lưu ý khi chọn các điều kiện biên: </b>
Trong ph n lý thuy t trên, chúng ta ch n ầ ế ở ọ đượ điềc u ki n t i biên nh v y khi có hàm ệ ạ ư ậ đã
y=f x. Nh ng trong th c t , bài toán ư ự ế đặt ra th ng ch cho d ng d ng b ườ ỉ ướ ạ ộ điểm (x, y) mà không cho bi t hàm sế ố. Trong trường h p này, ta ch n o hàm c p 1 tợ ọ đạ ấ ại 2 biên như sau:
<b>a. Trong tính tốn: </b>
- Sử d ng hàm SPLINE ụ để tính g n ầ đúng giá tr hàm s ị ố- Sử d ng hàm SPLINE ụ để tính g n ầ đúng đạo hàm
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">- Sử d ng hàm SPLINE ụ để tính g n ầ đúng tích phân
<b>b. Trong khoa học, k thu t </b>ỹ ậ- Sử d ng hàm SPLINE ụ để v bàn tay ẽ
- Sử d ng hàm SPLINE ụ để nh n d ng ch vi t tay ậ ạ ữ ế- Sử d ng hàm SPLINE ụ để nh n d ng, x lý nh ậ ạ ử ả
<b>3. Ưu nhược điểm: a. Ưu điểm: </b>
- S dử ụng trong trường h p b d li u l n, nhi u mợ ộ ữ ệ ớ ề ốc nội suy. Khi tăng thêm các mốc ta v n ẫthu được đa các thức với bậc cố định
<b>b. Nhược điểm: </b>
- Nhược điểm l n nh t cớ ấ ủa phương pháp nằ ở ệm vi c ch n m c n i suy, n u ta ch n các m c ọ ố ộ ế ọ ốnội suy hợp lý thì đa thứ thu được c s chính xác, nẽ gượ ại thì đa thức thu được l c s có sai sẽ ố khá lớn
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">Output:
Các đa thức spline bậc 1, 2, 3 Đồ ị th các hàm spline bậc 1, 2, 3
Giá tr hàm spline b c 1, 2, 3 tị ậ ại các điểm c n tính ầBước 1:
- Nh p b giá tr x , y vào file input ậ ộ ị <small>ii</small>- Nh p a ậ
Bước 2:
- Xây d ng hàm spline bự ậc 3: + Xây d ng gói tính m : ự
Khởi t o dh0 và dhn ạ Tính m<sub>i</sub> i=1,n
+ S(x) trên mỗi đoạn <sub>x</sub><sub>i</sub><sub>−</sub><small>1</small>,<sub>x</sub><sub>i</sub> bằng:
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">Bước 4:
- Xây d ng hàm spline b c 2: ự ậ+ Kh i t o m ở ạ <small>0</small>
<b>2. Chương trình </b>
<small>importnumpyas npimportmatplotlib pyplot.asplt</small>
<small>defdata(): globalx y, ,n</small>
<small> = [] x</small>
<small> = [] y</small>
<small> withopen('test.txt' 'r+',) asf: forlineinf.readlines(): x.append(float(line.split( )[' '0])) y.append(float(line.split( )[' '1])) = xnp.asarray(x) </small>
<small> = ynp.asarray(y) = nlen( )-x1</small>
<small> returnx y, ,nx y n, , =data() </small>
<small>defspline3( ,k x0): , , = x y ndata() = hnp.diff(x) </small>
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14"><small>14 </small>
<small> # Duoi day la ham tính m deftinhM( , ,x y n): m=np.empty(n1) dnp.empty(n1) anpha= .npempty( +n1) beta=np.empty( +n1) muy= .npempty(n1) lamda= .npempty( +n1) hnp.diff(x) </small>
<small> dh0 y=( [ ]-1y[ ])/(0x[ ]- [1x]) dhn y n y=( [ ]- [ - ])/( [ ]-nx n x[n-]) d[ ]= /0 6h[ ]*(( [ ]-0yy[ ])/ [ ]-0hdh0) d n[ ]= /6h n[ -1]*(dhn y n-([ ]-y[ - ])/ [ -n1h n1]) anpha[ ]= /(-1 1 2) </small>
<small> beta[1]= [d0 2]/ for iinrange( ,1): </small>
<small> d[ ]=i6*(( [ + ]- [ ])/ [ ]-(y i1y i h i y[i y]-[ - ])/i1h[-1])/( [ ]+ [h i h i-1]) for iinrange( ,1): </small>
<small> muy i[ ]=h i[ - ]/( [ - ]+ [1h i1h i]) lamda i[ ]= [ ]/(h i h[ - ]+ [i1h i]) for iinrange( ,1): </small>
<small> anpha i[ + ]=1lamda i[ ]/(- -2anpha i muy i[ ]*[ ]) beta i[ +1]=(muy i[]*beta i d i[ ]- [])/(- -2anpha[]*muy[]) m n[ ]=( *1beta n d[ ]- [n])/(-2 1anpha[n]) </small>
<small> for iinrange( - ,- ,-n1 1 1): </small>
<small> m[ ]=i anpha i[ + ]*1m i[ +1]+beta i[+ ] 1</small>
<small> return m</small>
<small> m=tinhM( , ,x y n) ifk==1: </small>
<small> for jinrange( , +11): </small>
<small> print('S3' '[' + + str( [ - ])+ +x j1','str( [ ])+ +x j']' '= ' + str(round(m j[ - ] / 1</small>
<small>(6 * h[j - 1 3]),)) + + '('str( []) + '- x)^3' + </small>
<small> '+ ' + str(round( [m j] / (h j[ - 1] * 6), )) + 3'(x-' + str( [ - 1]) + ')^3' + </small>
<small> '+ ' + str(round((1 / h[ - 1]) * (y j[ - 1] - [ - ] / * m j16h j[ - 1</small>
<small>** 2),3)) + '(' + str( []) + '-x)' + </small>
<small> '+ ' + str(round(( [y j] - (m j[] / ) * 6h j[ - 1] ** ) / 2h[j - 1 3],)) + '(x-' + str( [ - 1]) + ')') </small>
<small> for ini range(1,n+1): ifx[- ]<=1x0andx0<= [x i]: </small>
<small> s3 m i= [ -1 6]/( * [h i- ])*( [ ]-1x i x0)** + [3m i]/( [ - ]* )*( - [h i1 6x0 x i- ])** +( /13 1h[ -i</small>
<small>1])*(y[ - ]- [ - ]/i1m i1 6*h i[ - ]**12)*( [ ]-x i x0) +(y i[ ]-(m i[ ]/ )*6h i[ - ]** )*(12x0 x- [i1])/ [ -h i1] returns3</small>
<small>defspline1( ,k x0): , , = x y ndata() = hnp.diff(x) ifk==1: </small>
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15"><small> for iinrange( , +11): </small>
<small> print('S1' '['+ +str( [ - ])+x i1', '+ (strx i[ ])+']='+str(round( [ -y i1]/ [ -h i</small>
<small>1 3], ))+ + ( [ ])+'('strx i'-x)' '+'++ (strround(y[ ]/ [ - ],i h i1 3))+'(x-'+str( [ - ])+x i1')') for ini range(1,n+1): </small>
<small> ifx[- ]<=1x0andx0<= [x i]: </small>
<small> s1 y i= [ -1]/ [ -h i1]*( [ ]- )+ [x i x0 y i]/ [ - ]*(h i1x0 x i- [ -1]) returns1</small>
<small>defspline2( ,k x0): , , = x y ndata() = hnp.diff(x) m=np.empty( +n1) m[0]=( [y]- [y0])/ [h] for ini range(1,n+1): </small>
<small> m i[ ]= /2h i[ -1]*( [ ]-y i y i[ - ])-1m i[ -1] ifk==1: </small>
<small> for iinrange( , +11): </small>
<small> print('S2' '['+ +str( [ - ])+x i1', '+ (strx i[ ])+']='+str(round(- [m i- ]/ / [ -1 2h i</small>
<small>1 3], ))+ + ( [ ])+'('strx i'-x)^2+'+str(round(m i[ ]/ /2h i[ -1], ))+3'(x-'+str( [ -x i</small>
<small>1])+')^2' '+'+ + (strround( [ ]- [ ]/ * [ -y i m i2h i1],3))) for ini range(1,n+1): </small>
<small> ifx[- ]<=1x0andx0<= [x i]: </small>
<small> s2 m i=- [ - ]/ /1 2h[ - ]*( [ ]- )** +i1x i x02m[ ]/ / [ - ]*(i2h i1x0-x i[ - ])** +12y[</small>
<small>]-m i[ ]/2* [ -h i1] returns2</small>
<small>print("Các đa thức spline bậc 3") </small>
<small>spline3( , [10]) </small>
<small>print("========================================================================================") </small>
<small>print("Các đa thức spline bậc 1:") </small>
<small>spline1( , [10]) </small>
<small>print("========================================================================================") </small>
<small>print("Các đa thức spline bậc 2") </small>
<small>spline2( , [10]) </small>
<small>print("========================================================================================") </small>
<small>a=float(input("Nhập giá trị cần tính: ")) </small>
<small>print('Giá trị xấp xỉ đa thức theo spline bậc 3 tại '+ (stra)+ ' là: '+ (strspline3( ,0a))) </small>
<small>print('Giá trị xấp xỉ đa thức theo spline bậc 2 tại '+ (stra)+ ' là: '+str(spline2(0,a))) </small>
<small>print('Giá trị xấp xỉ đa thức theo spline bậc 1 tại '+ (stra)+ ' là: '+str(spline1(0,a))) </small>
<small>x0= .nplinspace( [x], x n[], 1000) </small>
<small>y3=[] </small>
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16"><small>plt.figure(figsize=( ,20 10)) </small>
<small>plt.title("Spline Curve") </small>
<small>plt.plot( , ,x0 y1 color='blue',label='Spline bậc 1') </small>
<small>plt.plot( , ,x0 y2 color='green',label='Spline bậc 2') </small>
<small>plt.plot( , ,x0 y3 color='red',label='Spline bậc 3') </small>
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">=============================================================== Các đa thức spline bậc 1:
S1[0.0, 0.52] =0.0(0.52-x) +0.962(x-0.0) S1[0.52, 1.05] =0.943(1.05-x) +1.642(x-0.52) S1[1.05, 1.57] =1.673(1.57-x) +1.923(x-1.05) S1[1.57, 2.09] =1.923(2.09-x) +1.673(x-1.57) S1[2.09, 2.62] =1.642(2.62-x) +0.943(x-2.09) S1[2.62, 3.14] =0.962(3.14-x) +0.0(x-2.62) S1[3.14, 3.66] =0.0(3.66-x) +-0.962(x-3.14) S1[3.66, 4.19] =-0.943(4.19-x) +-1.642(x-3.66) S1[4.19, 4.71] =-1.673(4.71-x) +-1.923(x-4.19) S1[4.71, 5.23] =-1.923(5.23-x) +-1.673(x-4.71) S1[5.23, 5.76] =-1.642(5.76-x) +-0.943(x-5.23) S1[5.76, 6.28] =-0.962(6.28-x) +0.0(x-5.76) Các đa thức spline bậc 2
S2[0.0, 0.52] =-0.925(0.52-x) ^2+0.925(x-0.0) ^2+0.25 S2[0.52, 1.05] =-0.907(1.05-x) ^2+0.41(x-0.52) ^2+0.755 S2[1.05, 1.57] =-0.418(1.57-x) ^2+0.063(x-1.05) ^2+0.983 S2[1.57, 2.09] =-0.063(2.09-x) ^2+-0.544(x-1.57) ^2+1.017 S2[2.09, 2.62] =0.533(2.62-x) ^2+-0.784(x-2.09) ^2+0.72 S2[2.62, 3.14] =0.799(3.14-x) ^2+-1.05(x-2.62) ^2+0.284 S2[3.14, 3.66] =1.05(3.66-x) ^2+-0.799(x-3.14) ^2+-0.284 S2[3.66, 4.19] =0.784(4.19-x) ^2+-0.533(x-3.66) ^2+-0.72 S2[4.19, 4.71] =0.544(4.71-x) ^2+0.063(x-4.19) ^2+-1.017 S2[4.71, 5.23] =-0.063(5.23-x) ^2+0.418(x-4.71) ^2+-0.983 S2[5.23, 5.76] =-0.41(5.76-x) ^2+0.907(x-5.23) ^2+-0.755 S2[5.76, 6.28] =-0.925(6.28-x) ^2+0.925(x-5.76) ^2+-0.25
</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18"><small>18 </small>• So sánh hàm Spline bậc 3 so với hàm gốc y=sin
VD2: Ta có bảng giá trị mực nước biển trung bình theo nhiệt độ trung bình của trái đất và bảng giá trị đo nhiệt độ trung bình của trái đất theo thời gian:
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">Bảng 1: Nhiệt độ trung bình của trái đất theo thời gian
</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">• Ta sẽ tính dự đốn mực nước biển tại năm 1933
Đầu tiên, ta sẽ có giá trị nhiệt độ trung bình được dự đốn từ Bảng 1
</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">Giá trị xấp xỉ đa thức theo spline bậc 3 tại 1933.0 là: -0.21402750614459728 Giá trị xấp xỉ đa thức theo spline bậc 2 tại 1933.0 là: -0.323
Giá trị xấp xỉ đa thức theo spline bậc 1 tại 1933.0 là: -0.1826 Ta lấy nhiệt độ trung bình tại năm 1933 được dự đoán −0.214
Từ đây, ta sẽ dự đốn được mực nước biển trung bình năm 1933 theo Bảng 2
</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22"><small>22 </small>
Giá trị xấp xỉ đa thức theo spline bậc 3 tại -0.214 là: -123.99956009027183 Giá trị xấp xỉ đa thức theo spline bậc 2 tại -0.214 là: -214.01167726064983 Giá trị xấp xỉ đa thức theo spline bậc 1 tại -0.214 là: -130.0996946551724
Vậy ta đã có được dự đốn mực nước biển trung bình tại năm 1933
</div>