ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINHTRƯỜNG ĐẠI HỌC BÁCH KHOA BÁO CÁO BÀI TẬP LỚN PHƯƠNG PHÁP TÍNH ĐỀ TÀI 5: ARCTIC SEA ICE GVHD: TRẦN THỊ NGỌC HUYỀN... LỜI MỞ ĐẦUChúng ta thấy rằn
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA
BÁO CÁO BÀI TẬP LỚN PHƯƠNG PHÁP TÍNH
ĐỀ TÀI 5: ARCTIC SEA ICE
GVHD: TRẦN THỊ NGỌC HUYỀN
Trang 2Mục Lục
LỜI MỞ ĐẦU 3
I Cơ sở lý thuyết 4
1 Đa thức nội suy Lagrange 4
2 Spline bậc ba 5
3 Tính gần đúng đạo hàm và tích phân 5
a) Tính gần đúng đạo hàm 5
b) Tính gần đúng tích phân 6
II Sơ đồ khối 8
III Đoạn Code 9
IV Ứng dụng chương trình vào dữ liệu thực tế 15
Trang 3LỜI MỞ ĐẦU
Chúng ta thấy rằng hầu hết các bài toán trong toán học như giải các phương trình đại số hay siêu việt, các hệ phương trình tuyến tính hay phi tuyến, các phương trình
vi phân thường hay đạo hàm riêng,tính các tích phân, thường khó giải đúng được, nghĩa là khó tìm kết quả dưới dạng các biểu thức Một số bài toán có thể giải đúng được nhưng biểu thức kết quả lại cồng kềnh, hức tạp khối lượng tính toán rất lớn Vì những lí do trên, việc giải gần đúng các bài toán là vô cùng cần thiết Các bài toán trong kĩ thuật thường dựa trên số liệu thực nghiệm và các giả thiết gần đúng Do vậy việc tìm ra kết quả gần đúng với sai số cho phép là hoàn toàn có ý ghĩa thực tế Từ lâu người ta đã nghiên cứu phương pháp tính và đạt nhiều kết quả đáng kể Tuy nhiên để lời giải đạt được độ chính xác cao, khối lượng tính toán thường rất lớn Với ác phương tiện tính toán thô sơ, nhiều phương pháp tính đã được đề xuất không thể thực hiện được vì khối lượng tính toán quá lớn Khó khăn trên đã làm phương pháp tính không phát triển được Ngày nay nhờ máy tính điện
tử người ta đã giải rất nhanh các bài toán khổng lồ, phức tạp, đã kiểm nghiệm được các phương pháp tính cũ và đề ra các phương pháp tính mới Phương pháp tính nhờ
đó phát triển rất mạnh mẽ Nó là cầu nối giữa toán học và thực tiễn Nó là môn học không thể thiếu đối với các kỹ sư Ngoài nhiệm vụ chính của phương pháp tính là tìm các phương pháp giải gần úng các bài toán,nó còn có nhiệm vụ khác như nghiên cứu tính chất nghiệm, nghiên cứu bài toán cực trị, xấp xỉ hàm v.v Trong phần này chúng ta sẽ nghiên cứu làm thế nào để ứng dụng phương pháp tính vào các bài toán thực tế
Trang 4I Cơ sở lý thuyết
1 Đa thức nội suy Lagrange
Xét hàm y =f (x ) được cho dưới dạng bảng số:
x x0x1x2x3… x n
y y0y1y2y3… y n
Trong đó n là các số nguyên dương Các giá trị x k, k = 0, 1, 2 , n được gọi là các điểm nút và được sắp xếp theo thứ tự tăng dần theo chỉ số k , các giá trị y k =f(x k)0,1 , , nlà các giá trị cho trước tương ứng tại x k
Bài toán đặt ra là hãy xây dựng một đa thức P (x ) thỏa điều kiện P (x )= y k , k =0 , 1 , … , n và được gọi là đa thức nội suy của hàm f (x)
Xét bảng số của hàm số f (x ) với n ≥ 1. Chúng ta sẽ tìm đa thức nội suy L n (x) của hàm f (x )
trên [x , x ] tn] có bac nhỏ hơn hay bằng n và thoả 0 n L n (x)= y k , k =0,1 , ,n Trước tiên, ta xây dựng các đa thức phụ p n
( k) (x) , k=0,1, , n tương ứng với điểm nút x k, có bậc bằng n và thoả điều kiện
p n ( k) (x)={1 ,
0 ,
j =k
j≠ k
Do các đa thức p n
( k) có n nghiệm x0, … , x k−1, x k+1, … , x n và có bậc nhỏ hơn hay bằng n nên
ta có thể viết chúng dưới dạng:
p n
( k)
(x)= C k (x −x0) (x−x k−1)(x −x k+1) (x−x n)
với C k là hằng số Từ điều kiện p n
( k)
=1, ta thu được:
(x k −x0) (x k −x k−1)(x k −x k+1) (xk −x n)
Khi đó ta có:
p ( k) n (x)= (x−x0)…(x −x k−1)(x−x k+1)…(x −x n)
(x k −x0)…(x k −x k−1)(x k−x k+1)…(x k −x n), k =0 , n
Ta gọi đa thức sau đây là đa thức nội suy Lagrange:
L n (x)=∑
k=0
n
p n (k) (x) y k
2 Spline bậc ba
Trang 5Việ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 và khó ứng dụng Một trong những cách 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 lại bởi các đường cong đơn giản như đoạn thẳng chẳng hạn Tuy nhiên, khi đó tại các điểm nút hàm sẽ mắt tính khả vi Do đó, người
ta cổ gắng xây dựng một đườ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ỏ thông thường là các đa thức và bậc caonhất của các đa thức đó là bậc của spline
Cho hàm 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<x 2<…<x n =b Đặt y k =f(x k), k =0,1 , … , n
Một spline bậc ba nội suy hàm f ( x ) trên [a, b] là hàm g ( x ) thoả các điều kiện sau: a) g ( x ) có đạo hàm đến cấp hai liên tục trên đoạn [a, b]
b) Trên [x k ;x k+1], k =0,1 , … , n−1 , g ( x)=g k ( x ) là một đa thức bậc
c) g(x k)=f(x k)= y k , ∀ k =0,1 , … , n
3 Tính gần đúng đạo hàm và tích phân
Dựa vào định nghĩa của đạo hàm hàm số f (x ) tại điểm x0 khi ∆ x đủ nhỏ ta thu được:
f ' (x0)= lim
∆ x → 0
f(x0+∆ x)−f (x0)
∆ x ≈
f(x0+ ∆ x)−f (x0)
∆ x
Nếu ∆ x =h>0 , ta có: f ' (x0)≈ f(x0+h)−f (x0)
h
Nếu ∆ x =−h<0 , ta có: f ' (x0)≈ f(x0)−f(x0−h)
h
Đây là các công thức xắp xi thô của đạo hàm cấp một và thường được áp dụng cho các điểm biên Đối với các điểm bên trong, phương pháp chung là xây dựng đa thức nội suy Lagrange L (x) xắp xỉ hàm f (x ) và sau đó f '
( x)≈ L ' ( x) và f (x )≈ L (x ) Xét trường hợp đơn giản với bảng số có ba điểm nút cách đều:
x x0−h x0 x0+h
y f(x0−h)f(x0)f(x0+h) Đây là trường hợp thường dùng để xấp xỉ các đạo hàm Đa thức Lagrange có dạng:
Trang 6L( x) =(x −x0+ h)(x−x0)
2 h2 f(x0+h)−(x −x0+h)(x−x0−h)
h2 f(x0)+(x −x0)(x −x0−h)
2h2 f (x0−h)
Khi đó
L'( x)= x −x h0+
2 h2 f(x0+h)−2 f(x0)+x −x0
2 h2 (f(x0+h)+f(x0−h))+x −x0−h
2 h2 (f(x0+ h)−2 f(x0))
L left (x right ) = {f left ({x} rsub {0} +h right ) -2f left ({x} rsub {0} right ) +f left ({x} rsub {0} -h right )}
Ta được:
{f '(x0−h)≈ L'
(x0−h)=−3 f(x0−h)+4 f(x0)−f(x0+h)
2 h
f '
(x0)≈ L '
(x0)=f(x0+h)−f(x0−h)
2h
f '(x0+h)≈ L '(x0+h)=f(x0−h)−4 f(x0)+3 f(x0+h)
2 h
Hàm số
I=∫
a
b
f (x)dx
với f (x)là hàm xác định và khả tích trên [a, b] Ý tưởng xuất phát từ việc xấp xỉ hàm f (x)
trên đoạn [a, b] bởi đa thức nội suy Lagrange L n (x) và
I=∫
a
b
f (x)dx ≈ I¿
=∫
a
b
L n (x)dx
Xét một phép phân hoạch đều của đoạn [a, b]:
h=b −a
h , x0=a , x k =x0+kh , k =0,1 , … ,n Ta xây dựng đa thức nội suy Lagrange L n (x) xấp xỉ
hàm f (x) trên đoạn [a,b] xác định theo công thức L n ( x)=∑
k=0
n
(−1 )n −k q( q −1 )…(q−n)
k ! ( n −k)! (q−k )! y ktrong
đó y k =f(x k), k =0,1 , … , n
Thay biểu thức L n ( x)=∑
k=0
n
(−1 )n −k q( q−1 )…(q−n)
k ! ( n k − )! (q−k )! y k vào công thức xấp xỉ
Trang 7a
f (x)dx ≈ I¿=∫
a
L n (x)dx và sử dụng phép đổi biến q=x −x0
h , ta thu được
I=∫
a
b
f ( x)dx ≈ I¿= (b−a)∑
k=0
n
H k y k ,
Công thức này được gọi là công thức Newton – Cotes với hệ số
H k= (−1)n −k
nk !(n−k ) !∫
0
n
q ( q −1)…(q n− )
q −k dq , k =0,1 , … ,n được gọi là hệ số Cotes
Trang 8II.Sơ đồ khối
Trang 9III Đoạn Code
# Nhập thư viện cần dùng
import pandas as pd
import sympy as sp
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import make_pipeline
from scipy.interpolate import CubicSpline
from scipy.optimize import fsolve
from sympy import symbols, diff
from sympy import symbols, integrate
# Đọc dữ liệu từ file Excel
data = pd.read_excel("Arctic_Ice.xlsx", sheet_name="Data",skiprows= 3) # CÂU 1
# Trích xuất dữ liệu của cột x và cột y
x = data["Month"]
y1 = data["1980 extent in million square km"]
y2 = data["2012 extent in million square km"]
y3 = data["2022 extent in million square km"]
# Vẽ đồ thị 2 chiều
plt.plot(x, y1,color="red", marker="o", label="1980")
plt.plot(x, y2,color="blue", marker="o", label="2012")
plt.plot(x, y3,color="yellow", marker="o", label="2022")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Đồ thị hàm y(x)")
plt.legend()
Trang 10# Hiển thị đồ thị
plt.show()
# CÂU 2
# Chọn cột dữ liệu x và y từ DataFrame
x = data['Month'].values.reshape(-1, 1)
y1 = data['1980 extent in million square km'].values
y2 = data['2012 extent in million square km'].values
y3 = data['2022 extent in million square km'].values
# Lựa chọn bậc của đa thức từ người dùng
bac = int(input("Nhập bậc của đa thức(1,2,3,or -1 cho hàm mũ):"))
# Tạo mô hình
if bac == -1:
# Hàm mũ
model = make_pipeline(PolynomialFeatures(1), LinearRegression()) else:
# Đa thức bậc degree
model = make_pipeline(PolynomialFeatures(bac), LinearRegression())
# Fit mô hình với dữ lệu
model.fit(x,y2)
# Dự đoán giá trị y cho dữ liệu đã cho
y_pred = model.predict(x)
# Vẽ đồ thị
plt.scatter(x, y1, color='blue', label='Dữ liệu thực tế năm 1980')
plt.scatter(x, y2, color='yellow', label='Dữ liệu thực tế năm 2012')
plt.scatter(x, y3, color='green', label='Dữ liệu thực tế năm 2022')
plt.plot(x, y_pred, color='red', label=f'Mô hình dự đoán (Đa thức bậc {bac})') plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
Trang 11# CÂU 3
# Chọn cột dữ liệu x và y từ DataFrame
x = data['Month']
y1 = data['1980 extent in million square km']
y2 = data['2012 extent in million square km']
y3 = data['2022 extent in million square km']
# Tạo hàm số nội suy cubic spline từ dữ liệu
f_1980 = CubicSpline(x, y1)
f_2012 = CubicSpline(x, y2)
f_2022 = CubicSpline(x, y3)
# Đạo hàm f'(x)
f_1980_prime = f_1980.derivative()
f_2012_prime = f_2012.derivative()
f_2022_prime = f_2022.derivative()
# Đạo hàm hai lần f''(x)
f_1980_double_prime = f_1980_prime.derivative()
f_2012_double_prime = f_2012_prime.derivative()
f_2022_double_prime = f_2022_prime.derivative()
# Tìm nghiệm của f(x) = 0
roots_f_1980_x = fsolve(f_1980, x.mean())
roots_f_2012_x = fsolve(f_2012, x.mean())
roots_f_2022_x = fsolve(f_2022, x.mean())
# Tìm nghiệm của f'(x) = 0
roots_f_1980_prime_x = fsolve(f_1980_prime, x.mean())
roots_f_2012_prime_x = fsolve(f_2012_prime, x.mean())
roots_f_2022_prime_x = fsolve(f_2022_prime, x.mean())
# Tìm nghiệm của f''(x) = 0
roots_f_1980_double_prime_x = fsolve(f_1980_double_prime, x.mean()) roots_f_2012_double_prime_x = fsolve(f_2012_double_prime, x.mean())
Trang 12roots_f_2022_double_prime_x = fsolve(f_2022_double_prime, x.mean())
# In kết quả
print("Nghiệm của f(x) năm 1980 = 0:", roots_f_1980_x)
print("Nghiệm của f'(x) năm 1980 = 0:", roots_f_1980_prime_x) print("Nghiệm của f''(x) năm 1980 = 0:", roots_f_1980_double_prime_x) print("Nghiệm của f(x) năm 2012 = 0:", roots_f_2012_x)
print("Nghiệm của f'(x) năm 2012 = 0:", roots_f_2012_prime_x) print("Nghiệm của f''(x) năm 2012 = 0:", roots_f_2012_double_prime_x) print("Nghiệm của f(x) năm 2022 = 0:", roots_f_2022_x)
print("Nghiệm của f'(x) năm 2022 = 0:", roots_f_2022_prime_x) print("Nghiệm của f''(x) năm 2022 = 0:", roots_f_2022_double_prime_x) # CÂU 4
# Xác định biến và dữ liệu
x_values = data['Month'].values.reshape(-1, 1)
y1_values = data['1980 extent in million square km'].values
y2_values = data['2012 extent in million square km'].values
y3_values = data['2022 extent in million square km'].values
# Sử dụng đa thức bậc 2
poly = PolynomialFeatures(degree=2)
x_values_poly = poly.fit_transform(x_values)
# Xây dựng mô hình hồi quy tuyến tính với đa thức bậc 2
model_1980 = LinearRegression().fit(x_values_poly, y1_values) model_2012 = LinearRegression().fit(x_values_poly, y2_values) model_2022 = LinearRegression().fit(x_values_poly, y3_values)
# Hàm dự đoán y(x)
def predict(model, x):
x_poly = poly.transform(np.array([[x]]))
return model.predict(x_poly)[0]
# Yêu cầu người dùng nhập giá trị x_value
x_value = float(input("Nhập giá trị x để ước tính đạo hàm: "))
Trang 13y_1980 = predict(model_1980, x_value)
y_2012 = predict(model_2012, x_value)
y_2022 = predict(model_2022, x_value)
# Đạo hàm cấp 1 tại điểm x_value
daoham1_1980 = model_1980.coef_[1] * 2 * x_value + model_1980.coef_[2] daoham1_2012 = model_2012.coef_[1] * 2 * x_value + model_2012.coef_[2] daoham1_2022 = model_2022.coef_[1] * 2 * x_value + model_2022.coef_[2]
# Tính đạo hàm cấp 2 cho mỗi năm
daoham2_1980 = 2 * model_1980.coef_[1]
daoham2_2012 = 2 * model_2012.coef_[1]
daoham2_2022 = 2 * model_2022.coef_[1]
# Hiển thị kết quả
print(f"y_1980({x_value}): {y_1980}")
print(f"y_2012({x_value}): {y_2012}")
print(f"y_2022({x_value}): {y_2022}")
print(f"Đạo hàm cấp 1 năm 1980 tại x = {x_value}: {daoham1_1980}") print(f"Đạo hàm cấp 2 năm 1980 tại x = {x_value}: {daoham2_1980}") print(f"Đạo hàm cấp 1 năm 2012 tại x = {x_value}: {daoham1_2012}") print(f"Đạo hàm cấp 2 năm 2012 tại x = {x_value}: {daoham2_2012}") print(f"Đạo hàm cấp 1 năm 2022 tại x = {x_value}: {daoham1_2022}") print(f"Đạo hàm cấp 2 năm 2022 tại x = {x_value}: {daoham2_2022}") # CÂU 5
# Xác định biến và hàm y(x)
x = symbols('x')
y1 = data['1980 extent in million square km']
y2 = data['2012 extent in million square km']
y3 = data['2022 extent in million square km']
# Xây dựng hàm y(x) từ dữ liệu
y_1980 = y1.values[0]
y_2012 = y2.values[0]
y_2022 = y3.values[0]
Trang 14# Yêu cầu người dùng nhập giá trị a và b
a = float(input("Nhập giá trị a (điểm bắt đầu của khoảng tích phân): "))
b = float(input("Nhập giá trị b (điểm kết thúc của khoảng tích phân): "))
# Ước tính tích phân của y(x) trên khoảng [a, b]
tichphan1980 = integrate(y_1980, (x, a, b))
tichphan2012 = integrate(y_2012, (x, a, b))
tichphan2022 = integrate(y_2022, (x, a, b))
# Hiển thị kết quả
print(f"Tích phân của y(x) từ {a} đến {b}: {tichphan1980}")
print(f"Tích phân của y(x) từ {a} đến {b}: {tichphan2012}")
print(f"Tích phân của y(x) từ {a} đến {b}: {tichphan2022}")
Trang 15IV Ứng dụng chương trình vào dữ liệu thực tế
ARCTIC SEA ICE
Câu 1: Model with output Sea Ice Extent and input month for the year 2022
Mô hình thực tế
Trang 16Mô hình dự đoán
Mô hình đa thức bậc 1
Trang 17Mô hình đa thức bậc 2
Trang 18Mô hình đa thức bậc 3
Mô hình dự đoán phù hợp với dữ liệu từ thực tế là một hàm đa thức bậc 3
Trang 19Câu 2: Estimate the rate of change of sea ice extent in a certain month (base
on the data set)
Tốc độ thay đổi của băng biển trong tháng 1:
Câu 3: Find out when sea ice extent reached the maximum and minimum, and estimate these values