Chúng ta đã làm xấu vẻ đẹp của hàm số ở trường học thế nào?

(hay vẽ đồ thị hàm số với Matplotlib Python) by HVN at https://pymi.vn

Toán học vốn được dạy một cách khô khan ở hầu hết các lớp học toán, tất cả các cấp học từ phổ thông đến đại học. Không thể trách có những người ghét toán, sợ toán, trong khi ở phía khác, có những người khen toán học đẹp đẽ và tuyệt vời.

Với những người “hiểu” toán, đồ thị và hàm số là những công cụ tuyệt vời, đẹp đẽ. Đối với phần còn lại, đồ thị là một bài toán cần phải khảo sát và kiếm 1 điểm trong đề thi đại học (tôi thi đại học năm 2008 — giờ người ta còn khảo sát hàm số khi thi đại học không?).

Hàm số là gì? để làm gì?

Có lẽ với mỗi chúng ta, ai học qua lớp 6, lớp 7, cũng đã dùng hàm số rồi, có thể hiểu nó là cái gì rồi. Nhưng chẳng bao giờ mang nó ra dùng ở đâu ngoài lớp học, hoặc có khi dùng, thì lại không biết.

Tôi không còn nhớ sách giáo khoa phổ thông định nghĩa hàm số là gì, nhưng có thể mô tả nôm na là:

một cách biểu diễn mối quan hệ giữa một giá trị với một hoặc nhiều giá trị khác.

Ví dụ: y = 2x là một hàm số đơn giản. Khi ta đưa mỗi giá trị vào x, ta tính được y. Với x = 5, y = 2*5 = 10.

Bảng cửu chương

x với y nghe lại có vẻ toán học, khiến nhiều người thấy ngán, thì hãy xem trong ví dụ đời thường, ta đã dùng hàm số này mà không thèm để ý: một cái bánh rán giá 2000, mua 5 cái thì phải rút 10000 VND ra trả.

Mối quan hệ này thay vì dùng từ “hàm số”, đã được đưa vào “bảng cửu chương” và chạy cho trẻ con lớp 2 học vẹt cho đến thuộc cả đời. Nhưng đừng quên, mối quan hệ giữa kết quả 10 với đầu vào 5 nhân 2 trong bảng cửu chương 5 chỉ là một giá trị có thể biểu diễn bởi hàm số y = 5x.

Hàng ngày, ta vẫn dùng những hàm số đơn giản đó, tự chuyển hoá từ bưởi, cam, chanh, bánh bao, bánh rán thành x, tính ra y và gọi đó là tiền, một cách vô thức.

import pandas as pd
import numpy as np
rs = np.arange(1, 11)
rs = np.reshape(rs, (-1, 1))
cls = np.arange(2, 10)
data= rs * (cls + np.reshape(np.zeros(10), (-1, 1)))
df = pd.DataFrame(index=rs, columns=cls, data=data, dtype=np.int32)
bảng cửu chương

Vẽ đồ thị

Khi ở trường học, hàm số là một thứ chỉ để mang đi thi, có đôi khi mang ra dùng mà không biết, thì đồ thị, tuyệt đối chỉ để mang đi thi và chả bao giờ dùng. Những bài toán khảo sát hàm số, tìm cực đại cực tiểu của hàm số, tìm tiếp tuyến… tất cả chỉ để đi thi, lấy điểm 10.

Không, đó không phải lý do người ta nghĩ ra “đồ thị hàm số”. Đồ thị không phải là đồ chơi, khảo sát không phải để lấy điểm 10.

Đồ thị là một hình ảnh biểu diễn mối quan hệ, mà với con người, 1 hình ảnh đáng giá ngàn lời nói.

Vẽ đồ thị với matplotlib — Python

Khi vẽ bằng tay, vừa xấu, vừa khó, thì các ngôn ngữ lập trình, đặc biệt là Python với thư viện matplotlib, cho phép ta vẽ hình đẹp, nhanh, và chính xác.

import matplotlib.pyplot as plt
# khi dùng trên Jupyter, thêm dòng sau để vẽ ngay tại Jupyter thay vì ghi ra file ảnh.
%matplotlib inline
# thêm các dòng sau để hình vẽ có tiếng Việt
import matplotlib
matplotlib.rc('font', family='Arial')
# thêm dòng này để hình vẽ có màu đẹp hơn 
matplotlib.style.use('ggplot')
x = np.arange(11)
y = 5 * x
plt.plot(x, y, x, y, 'bx')
plt.title('Bảng cửu chương 5 biểu diễn trên đồ thị')
plt.xlabel('x')
plt.ylabel('y')

Tuyến tính (linear)

Hàm số y = 5x khi biểu diễn lên đồ thị, là một đường thẳng, trong toán học gọi hàm số y = 5x là một hàm số tuyến tính (tuyến - đường thẳng => hàm số có tính chất đường thẳng).

Dễ thấy bậc (số mũ) của x trong hàm số này là 1. Vì vậy nói hàm bậc 1 là hàm tuyến tính. Một hàm số bậc 1 có công thức tổng quát là y = ax + b.

Vậy y = 5x thì khác gì y = -5x và khác gì y = 5x + 6 ?

Một hình vẽ sẽ thay ngàn lời nói

x = np.arange(7)
f1 = 5 * x
f2 = -5 * x
f3 = 5 * x + 6
plt.plot(x, f1, x, f2, x, f3)
plt.legend(['y = 5x', 'y = -5x', 'y = 5x + 6'])

Phi tuyến — non-linear

Còn với những hàm số có đồ thị không thẳng, toán học gọi là phi tuyến (phi = không) trong tiếng anh gọi là non-linear.

Các đồ thị hàm số sau đây không có tính đường thẳng: y = sin(x), y=y=căn bậc 2(x) , y=log(x)

x = np.linspace(-2, 5, 100)
f1 = np.sin(x)
f2 = np.sqrt(x)
f3 = np.log(x)
plt.plot(x, f1, x, f2, x, f3)
plt.axhline()
plt.axvline()
plt.legend(['y = sin(x)', 'y = sqrt(2)', 'y = log(x)'])

Hay các hàm số mà x có bậc 2, 3, …

x1 = np.linspace(-35, 35, 100)
x2 = np.linspace(-10, 10, 100)
f1 = x1**2
f2 = x2**3
plt.plot(x1, f1, x2, f2)
plt.axhline()
plt.axvline()
plt.legend(['y = x^2', 'y = x^3'])

Vậy học về hàm số và vẽ đồ thị để làm gì?

Trên thực tế, chúng ta được đưa cho những công cụ toán học rất mạnh, nhưng không đưa cho bài toán THỰC TẾ để giải. Tất cả bài tập chỉ là các con số và luyện kỹ năng tính toán, áp dụng công thức, cố biến chúng ta thành những cỗ máy tính toán (công việc của máy tính) chứ không phải dạy ta giải quyết vấn đề.

Hãy đảo ngược bài toán

Giờ hãy cho một tập kết quả, và hãy tìm mối quan hệ giữa kết quả và dữ kiện.

Cho một tập số liệu giữa mức lương và số năm kinh nghiệm trong một công ty,

  • 7 năm — lương 59 triệu
  • 6 năm — lương 46 triệu
  • 15 năm — lương 235 triệu
  • 2 năm — lương 14 triệu.

Thật không đơn giản để trả lời ngay với 9 năm kinh nghiệm, lương của anh Tèo là bao nhiêu?

Một cách giải bài toán này là ta hãy bắt đầu bằng việc vẽ các dữ liệu này lên đồ thị:

x = np.array([2, 6, 7, 15])
y = np.array([14, 46, 59, 235])
plt.plot(x, y, 'r-', x, y, 'bx')
plt.xlabel('năm')
plt.ylabel('triệu')

Như ta quan sát, mối quan hệ giữa lương và năm kinh nghiệm không phải là một đường thẳng, nó có vẻ cong, và tăng dần theo số năm. Nếu có hiểu biết về đồ thị hàm số, ta có thể đoán đây là một hàm số bậc 2, tức `y = x² + b`. Hãy thử vẽ đồ thị với một vài giá trị của b: 0, 5, 10

x = np.array([2, 6, 7, 15])
y = np.array([14, 46, 59, 235])
f1 = x**2
f2 = x**2 + 5
f3 = x**2 + 10
plt.plot(x, f1, x, f2, x, f3, x, y, 'bx')
plt.legend(['y = x^2', 'y = x^2 + 5', 'y = x^2 + 10'])
plt.xlabel('năm')
plt.ylabel('triệu')

Có thể thấy đồ thị của y = x^2 + 10 đi qua cả 4 điểm, và nó có vẻ như là hàm số dùng để tính lương cho nhân viên. Khi có càng nhiều số liệu, ta càng chắc chắc hơn về tính chính xác của hàm số tìm được. Và lương của anh Tèo 9 năm kinh nghiệm có vẻ như là:

print(9 ** 2 + 10, "triệu")
91 triệu

Anh Tèo giàu quá, hãy yêu anh Tèo 😍

Giải tích

Giải tích là một nhánh của toán học, nghiên cứu về sự thay đổi (tốc độ — hay vẽ lên đồ thị, đó là độ dốc của các đường cong/thẳng), độ dài, diện tích và thể tích của vật thể. Và vì thế, nó nghiên cứu về các tính chất của một hàm số / đồ thị của nó.

http://mathworld.wolfram.com/Calculus.html

Ooohhh

Hãy tưởng tượng, với hiểu biết về các hàm số, ta có thể đi đoán giá nhà dựa trên mối quan hệ giữa diện tích của ngôi nhà với giá đã bán được, tính xem giá vàng ngày mai tăng hay giảm, phân biệt xem khối u nào là ác tính hay lành tính dựa trên kích thước của nó… Đó là những ứng dụng thực tế của ngành học Machine Learning mà hàm số và đồ thị của nó là những công cụ không thể thiếu để giải quyết các bài toán trong thực tế.

Còn với những ai không học “Machine Learning” (học máy/máy học trong tiếng Việt), hàm số là những gì đẹp đẽ, mà bạn đã vô tình dùng, khi tính tiền khi đi chợ mỗi ngày, chỉ là mình đã đạt trình “master” rồi nên không hề nhận ra mà thôi 😎

Hết.
HVN at http://www.familug.org/ and http://pymi.vn

Đăng ký học #Python 3 từ con số 0 tại #PyMI https://pymi.vn/ — lớp HN khai giảng đầu tháng 6, lớp HCM khai giảng đầu tháng 8.
Đăng ký học #Linux #Sysadmin lớp HN khai giảng 17/5 http://sysad101.pymi.vn/

Có chút liên quan https://mathoverflow.net/questions/13089/why-do-so-many-textbooks-have-so-much-technical-detail-and-so-little-enlightenmen

File gốc Jupyter Notebook xem tại https://github.com/pymivn/math-stats-ml/blob/master/plotting.ipynb

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.