1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo bài tập lớn phương pháp tính Đề tài 5 arctic sea ice

19 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 1,69 MB

Nội dung

ĐẠ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 2

Mụ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 3

LỜ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 4

I 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)= (xx0)(x −x k−1)(xx k+1)(x −x n)

(x k −x0)(x k −x k−1)(x kx 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 5

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 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)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 6

L( x) =(x −x0+ h)(x−x0)

2 h2 f(x0+h)−(x −x0+h)(xx0−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)

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 7

a

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 8

II.Sơ đồ khối

Trang 9

III Đ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 12

roots_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 13

y_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 15

IV Ứ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 16

Mô hình dự đoán

Mô hình đa thức bậc 1

Trang 17

Mô hình đa thức bậc 2

Trang 18

Mô 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 19

Câ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

Ngày đăng: 19/12/2024, 15:43

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN