You are on page 1of 17

i

TỔNG LIÊN ĐOÀN LAO ĐỘNG VIỆT NAM


TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG
KHOA CÔNG NGHỆ THÔNG TIN

Hà Ngọc Nhi - MSSV:52300141

Nguyễn Anh Kiệt - MSSV: 52300123

BÁO CÁO GIỮA KỲ

GIẢI TÍCH ỨNG DỤNG


CHO CÔNG NGHỆ THÔNG TIN

Người hướng dẫn

ThS Phạm Quốc Duy

THÀNH PHỐ HỒ CHÍ MINH, NĂM 2023


i

LỜI CẢM ƠN
Chúng em xin chân thành cảm ơn thầy Phạm Quốc Duy đã hướng dẫn chúng em
làm bài tiểu luận giữa kỳ này từ đó giúp chúng em thấy được tầm quan trọng của
việc đưa những phép toán bình thường vào máy bằng ngôn ngữ Python để giúp cho
máy hiểu được và giúp ta xử lý được những bài tập khó. Cảm ơn các bạn cùng lớp
đã giúp chúng em hiểu được từng dòng code và giúp cho chương trình chạy một
cách ổn định và ít gặp lỗi hơn.
TP. Hồ Chí Minh, ngày 20 tháng 12 năm
2023
Tác giả
(Ký tên và ghi rõ họ tên)
ii

CÔNG TRÌNH ĐƯỢC HOÀN THÀNH

TẠI TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG

Tôi xin cam đoan đây là công trình nghiên cứu của riêng tôi và được sự hướng
dẫn khoa học của ThS. Phạm Quốc Duy. Các nội dung nghiên cứu, kết quả trong đề
tài này là trung thực và chưa công bố dưới bất kỳ hình thức nào trước đây. Những số
liệu trong các bảng biểu phục vụ cho việc phân tích, nhận xét, đánh giá được chính
tác giả thu thập từ các nguồn khác nhau có ghi rõ trong phần tài liệu tham khảo.

Ngoài ra, trong Dự án còn sử dụng một số nhận xét, đánh giá cũng như số liệu
của các tác giả khác, cơ quan tổ chức khác đều có trích dẫn và chú thích nguồn gốc.

Nếu phát hiện có bất kỳ sự gian lận nào tôi xin hoàn toàn chịu trách
nhiệm về nội dung Dự án của mình. Trường Đại học Tôn Đức Thắng không liên
quan đến những vi phạm tác quyền, bản quyền do tôi gây ra trong quá trình thực hiện
(nếu có).

TP. Hồ Chí Minh, ngày 20 tháng 12 năm 2023


Tác giả
(Ký tên và ghi rõ họ tên

1
iii

TÓM TẮT
Đây là bài tiểu luận được em và Hà Ngọc Nhi cùng làm để giải quyết các vấn đề được
đưa ra đó là dung ngôn ngữ lập trình Python để giải quyết các bài toán được giao.

2
iv

MỤC LỤC

LỜI CẢM ƠN..................................................................................i

LỜI CAM KẾT..............................................................................ii

TÓM TẮT.....................................................................................iii

MỤC LỤC.....................................................................................iv
I. CƠ SỞ LÝ THUYẾT.....................................................................5

1/ Sơ lược về Python..................................................................................5

2/ Các thư viện được sử dụng ....................................................................5

3/ Phương hướng thực hiện bài tập............................................................6

II. GIẢI THÍCH THUẬT TOÁN......................................................7

1/ Thực hiện mã nguồn...............................................................................7

2. Kết quả thực nghiệm............................................................................13

3
I. CƠ SỞ LÝ THUYẾT

1/Sơ lược về Python:

-Python là ngôn ngữ lập trình bậc cao.

-Ngôn ngữ này là ngôn ngữ có cấu trúc đơn giản, dễ học và dễ đọc rất
thích hợp cho người mới bắt đầu lập trình.

2/ Các thư viện được sử dụng:

-Thư viện math thư viện được tích hợp sẵn nhiều thuật toán phức tạp như sin,cos,tan,
căn bậc 2, lũy thừa, logarit. Thư viện này còn cung cấp cho các hằng số số học như PI
và Euler, có thể gọi cái hằng số này bằng cách sử dụng math.pi và math.e. Để khai
báo thư viện math ta nhập import math.

-Thư viện matplotlib.pyplot: là thư viện phổ biến trong Python được dùng để vẽ đồ thị
và biểu đồ. Nó cung cấp cho người dùng các công cụ để thể hiện đồ thị một cách trực
quan từ các dữ liệu đã được cung cấp. Để sử dụng được thư viện này ta phải cài đặt nó
vào máy tính để có thể sử dụng. Để khai báo thư viện này ta nhập import
matplotlib.pyplot as mp.

-Thư viện numpy: là một thư viện được sử dụng rộng rãi trong Python nó cung cấp
cho người dung các công cụ để sử dụng mảng và ma trận số học để thực hiện các phép
tính số học và và thống kê. Để khai báo thư viện này ta nhập import numpy as np.

-Thư viện sympy: là thư viện cung cấp cho người dung các công cụ để thực hiện các
phép toán như giải phương trình, đại số tuyến tính, có thể áp dụng được mảng. Để
khai báo thư viện này tư nhập import sympy as sp.
3/Phương hướng thực hiện bài tập:

1/ Câu a:

 Khai báo mảng.


 Sau đó thay x vào hàm f(x) và g(x).
 Đạo hàm 2 hàm số .
 Cuối cùng vẽ đồ thị các giao điểm trong cùng một hình.

4
2/ Câu b:

 Tính đạo hàm sau đó in ra phương trình tiếp tuyến như yêu cầu của đề bài.
 Đồ thị f(x) dời xuống bằng cách lấy f(x)-1
 Để tìm giao điểm thì ta phải dùng hàm hàm sp.solve
 Cuối cùng ta vẽ đồ thị in lên màn hình.

3/ Câu c:

 Ta đạo hàm bậc 2 để tìm ra k (k là hệ số gốc)


 Sau đó ta có phương trình tiếp tuyến y=k(x-x0)+y0
 Ta có f(x)=y và k=f(x)
 Lập hệ phương trình tìm ra 2 nghiệm
 Sau đó thế 2 nghiệm đó vào k ta có hai phương trình tiếp tuyến.
 Cuối cùng ta vẽ phương trình in đồ thị biểu diễn ra ra màn hình.

I. GIẢI THÍCH THUẬT TOÁN

1/ Thực hiện mã nguồn:

x=sp.symbols(‘x’) để khai báo biến x

A/

-x= np.arange(-1000,1000,0.01) để khai báo mảng của x sẽ có giới hạn từ -1000 đến
1000 và có bước nhảy là 0.01

f=lambda x: x**2 -2*A*x-A**2 gọi tên hàm số f với x là tham số và A đã được định
nghĩa trước đó.

g=lambda x :-x**2+4*A*x+A**3 gọi tên hàm số g với x là tham số và A đã được


định nghĩa trước đó.

5
y1=list(map(f,x)) sử dụng hàm map() để tạo một mảng y1 từ mảng x và hàm f(x)

y2=list(map(g,x)) sử dụng hàm map() để tạo một mảng y1 từ mảng x và hàm g(x)

mp.plot(x, y1, label='f(x)') sử dụng hàm plot() có trong thư viện matplotlib để vẽ 1 đồ
thị với trục hoành là mảng x và trục tung là mảng y1

mp.plot(x, y2, label='g(x)') ) sử dụng hàm plot() có trong thư viện matplotlib để vẽ 1
đồ thị với trục hoành là mảng x và trục tung là mảng y2

Dùng sp.solve(f – g, x) để tìm giao điểm của hai hàm số f(x) và g(x) bằng cách lấy
f(x)-g(x) sau đó giải nghiệm của phương trình vừa tính rồi kết quả sẽ được trả về là
một danh sách giá trị của x.

intersection_points_y=[f.subs(x,r) for r in intersection_points_x ] để tìm giá trị ủa


hàm số f(x) giao nhau của 2 hàm f(x) và g(x) tại các điểm giao nhau. Kết quả sẽ được
trả về là 1 danh sách chứa các giá trị của y tại các điểm giao nhau của hai hàm số. Với
hàm f.subs(x,r) thay tất cả các giá trị x trong hàm f(x) bằng giá trị r.

for i, root in enumerate(intersection_points_x):

root_evaluated = root.evalf()

y_value = f.subs(x, root_evaluated)

print(f" Point {i + 1}: ({root_evaluated}, {y_value})")

Với vòng lặp for ta dung để duyệt qua danh sách intersection_points_x và tìm giá trị
của hàm f(x) tại các giá điểm của f(x) và g(x).

Trong mỗi vòng lặp, biến i được sử dụng để đánh dấu số thứ tự mỗi giao điểm. “root”
chứa các giá trị của x tại điểm giao nhau hiện tại. Câu lệnh root,evalf() được sử dụng
để đánh giá giá trị của root. Biến y_value chứa giá trị hàm số f(x) tại điểm giao nhau
hiện tại, được tính bằng câu lệnh f.subs(x, root_evaluated). Cuối cùng in ra số thứ tự
và giá trị của tất cả giao điểm, bao gồm tọa độ (x,y) của giao điểm đó.

mp.plot(intersection_points_x ,intersection_points_y ,'ro')

mp.title ('Question 1a')

mp.grid (linestyle='--')

mp.legend()
6
mp.show()

Với hàm mp.plot dùng để vẽ đồ thị với hoành độ là giao điểm của f(x) và g(x), tung
độ là giá trị giao điểm của f(x) và g(x) và ‘ro’ là dấu chầm màu đỏ. mp.title để thể
hiện tên của đồ thị là Question 1a. mp.grid để giúp dễ nhìn và đọc đồ thị hơn.
mp.show để thể hiện đồ thị lên màn hình.

B/

x=sp.symbol(‘x’) dùng để khai báo biến x

f=x**2 -2*A*x-A**2 khai báo hàm f(x)

df=f.diff(x) tính đạo hàm của hàm f theo biến x và kết quả đạo hàm được lưu vào hàm df

k=df.subs(x,0) dùng để tìm k bằng cách thế tất cả biến x=0

ytt=k*(x-0)-A**2 dùng để tính y tiếp tuyến

x=np.arange(-1000,1000,0.01) để khai báo mảng của x sẽ có giới hạn từ -1000 đến


1000 và có bước nhảy là 0.01.

f=lambda x: x**2 -2*A*x-A**2 dùng để gọi tên hàm f với A đã được cho trước và
tham số là x

ytt=lambda x: k*(x-0)-A**2 dùng để gọi tên hàm ytt với A đã được cho trước và tham
số là x

f1=lambda x: (x**2 -2*A*x-A**2)-4*(A**3) dùng để gọi tên hàm f1 với A đã được


cho trước và tham số là x

y1=list(map(f,x))

y2=list(map(ytt,x))

y3=list(map(f1,x))

Sử dụng hàm map() để tạo các mảng y1,y2,y3 từ mảng x và lần lượt các hàm
f(x),ytt(x),f1(x).

mp.plot(x, y1, label='f(x)')

mp.plot(x, y2, label='tangent line to f(x)')


7
mp.plot(x, y3, label='shifted f(x)')

Sử dụng hàm plot() có trong thư viện matplotlib để vẽ 1 đồ thị với trục hoành là mảng
x và trục tung là mảng y1. Một đường thẳng với hoành độ x và tung độ là y2. Vẽ đồ
thị với hoành độ x và tung độ là y3.

Dùng sp.solve(f – ytt, x) để tìm giao điểm của hai hàm số f(x) và ytt(x) bằng cách lấy
f(x)-ytt(x) sau đó giải nghiệm của phương trình vừa tính rồi kết quả sẽ được trả về là một
danh sách giá trị của x.

intersection_points_y=[f.subs(x,r) for r in intersection_points_x ] để tìm giá trị ủa hàm


số f(x) giao nhau của 2 hàm f(x) và g(x) tại các điểm giao nhau. Kết quả sẽ được trả về là
1 danh sách chứa các giá trị của y tại các điểm giao nhau của hai hàm số. Với hàm
f.subs(x,r) thay tất cả các giá trị x trong hàm f(x) bằng giá trị r.

for i, root in enumerate(intersection_points_x):

root_evaluated = root.evalf()

y_value = f1.subs(x, root_evaluated)

print(f" Point {i + 1}: ({root_evaluated}, {y_value})")

Với vòng lặp for ta dung để duyệt qua danh sách intersection_points_x và tìm giá trị
của hàm f(x) tại các giá điểm của f(x) và g(x).

Trong mỗi vòng lặp, biến i được sử dụng để đánh dấu số thứ tự mỗi giao điểm. “root”
chứa các giá trị của x tại điểm giao nhau hiện tại. Câu lệnh root,evalf() được sử dụng
để đánh giá giá trị của root. Biến y_value chứa giá trị hàm số f(x) tại điểm giao nhau
hiện tại, được tính bằng câu lệnh f.subs(x, root_evaluated). Cuối cùng in ra số thứ tự
và giá trị của tất cả giao điểm, bao gồm tọa độ (x,y) của giao điểm đó.

mp.plot(x_root,y_root,'ro')

mp.plot(x_r,y_r,'ro')

mp.title ('question 1b')

mp.grid (linestyle='--')
8
mp.lend()

mp.show()

Với hàm mp.plot dùng để vẽ đồ thị với hoành độ là giao điểm của x_root và y_root,
tung độ là giá trị giao điểm của f(x) và g(x) và ‘ro’ là dấu chầm màu đỏ. Vẽ đồ thị của
x_r và y_r với màu đỏ mp.title để thể hiện tên của đồ thị là Question 1b. mp.grid để
giúp dễ nhìn và đọc đồ thị hơn. Mp,show để hiển thị đồ thị lên màn hình

C/

fx = x**2 - 2*A*x - A**2

Khai báo hàm f(x)

df=sp.diff(fx, x)

Dùng để tính đạo hàm theo x của f(x)

Fx=df*(0-x) + (4*A**3) + fx

Dùng để tìm k (hệ số góc)

n = sp.solve(Fx, x)

Dùng để tìm nghiệm x của hàm số F(x)

s = [float(sol) for sol in n]

Dùng để chuyển đổi cái giá trị thành giá trị số thực. Sau đó lưu tất cả giá trị đã được
chuyển đổi vào s.

x_vals = np.arange(-1000, 1000, 0.01) để khai báo mảng của x_vals sẽ có giới hạn từ
-1000 đến 1000 và có bước nhảy là 0.01.

ytt1= (s[0]**2 - 2*A*s[0] - A**2) + (2*s[0] - 2*A)*(x - s[0])

ytt2= (s[1]**2 - 2*A*s[1] - A**2) + (2*s[1] - 2*A)*(x - s[1])

Dùng để tính các hàm với s[0] và s[1] là phải tử thứ nhất và thứ hai của hàm ytt1 và
ytt2

fx = lambda x: x**2 - 2*A*x - A**2

9
Khai báo hàm fx

ytt1 = lambda x: (s[0]**2 - 2*A*s[0] - A**2) + (2*s[0] - 2*A)*(x - s[0])

Khai báo hàm ytt1

ytt2 = lambda x: (s[1]**2 - 2*A*s[1] - A**2) + (2*s[1] - 2*A)*(x - s[1])

Khai báo hàm ytt2

y1 = list(map(fx, x_vals))

y2 = list(map(ytt1, x_vals))

y3 = list(map(ytt2, x_vals))

Sử dụng hàm map() để tạo các mảng y1,y2,y3 từ mảng x và lần lượt các hàm
f(x_vals),ytt1(x_vals),ytt2(x_vals).

mp.plot(x_vals, y1, label='f(x)')

mp.plot(x_vals, y2, label='tangent line 1')

mp.plot(x_vals, y3, label='tangent line 2')

Sử dụng hàm plot() có trong thư viện matplotlib để vẽ 1 đồ thị với trục hoành là mảng x
và trục tung là mảng yq và đặt 1 nhãn là f(x). Một đường thẳng với hoành độ x và tung độ
là y2và đặt 1 nhãn là tangent line 1. Vẽ đồ thị với hoành độ x và tung độ là y3 và đặt 1
nhãn là tangent line 2.

intersection_points_x1 = np.roots(np.array([s[0] - s[1], 2*(s[0] - s[1]*A), A**2 -


s[1]*A**2]))

Dùng để tìm các nghiệm của hệ thức và truyền vào s với các phần tử số s[0] - s[1], đoạn
code được thực hiện theo 2*(s[0] - s[1]*A) - ), (A**2 - s[1]*A**2] các kết quả được đưa vào list
intersection_points_x1

intersection_points_y1 = [ytt1(point) for point in intersection_points_x1]

Ta dùng để tính giá trị của hàm số y tại list intersection_points_x1 và lưu kết quả tại
intersection_points_y1

10
intersection_points_x2 = np.roots(np.array([1, -2*A, -A**2 - (s[0]**2 - 2*A*s[0] -
A**2)]))

Dùng để tìm các nghiệm của hệ thức và truyền vào s với các phần tử số s[0] - s[1], đoạn
code được thực hiện theo -2*A), s[0]**2 - 2*A*s[0] - A**2)]))

các kết quả được đưa vào list intersection_points_x2

intersection_points_y2 = [fx(point) for point in intersection_points_x2]

Ta dùng để tính giá trị của hàm số y tại list intersection_points_x2 và lưu kết quả tại
intersection_points_y2

mp.plot(intersection_points_x1, intersection_points_y1, 'ro', )

mp.plot(intersection_points_x2, intersection_points_y2, 'ro', )

mp.title('question 1c')

mp.grid(linestyle='--')

mp.legend()

mp.show()

Với hàm mp.plot dùng để vẽ đồ thị với hoành độ là giao điểm của
intersection_points_x1và intersection_points_y1, tung độ là giá trị giao điểm của f(x)
và g(x) và ‘ro’ là dấu chầm màu đỏ. Vẽ đồ thị của intersection_points_x2và
intersection_points_y2 với màu đỏ mp.title để thể hiện tên của đồ thị là Question 1c.
mp.grid để giúp dễ nhìn và đọc đồ thị hơn. mp,show để hiển thị đồ thị lên màn hình.

11
2/Kết quả thực nghiệm

a/

b/

12
c/

13
TÀI LIỆU THAM KHẢO

1. Tài liệu môn thực hành giải tích ứng dụng cho cntt
2. Dạy nhau học
3. Vietjack
4. Chat GPT

5. Wikiped

14
15

You might also like