MỤC LỤC
Trang
MỞ ĐẦU 1
1. Lý do chọn đề tài nghiên cứu 1
2. Mục đích nghiên cứu 5
3. Khách thể, đối tượng và phạm vi nghiên cứu 5
4. Giả thuyết khoa học của luận án 5
5. Nhiệm vụ nghiên cứu 6
6. Phương pháp nghiên cứu 6
7. Đóng góp mới của luận án 7
8. Cấu trúc luận án 7
Chương 1. CƠ SỞ LÝ LUẬN VÀ THỰC TIỄN VỀ PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN TRONG DẠY HỌC 8
1.1 TỔNG QUAN NGHIÊN CỨU VỀ PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN TRONG DẠY HỌC 8
1.1.1 Nghiên cứu về phát triển tư duy trong dạy học 9
1.1.2 Nghiên cứu về phát triển tư duy điện toán trong dạy học 15
1.2 MỘT SỐ KHÁI NIỆM CƠ BẢN 23
1.2.1 Tư duy 23
1.2.2 Điện toán 27
1.2.3 Tư duy điện toán 27
1.2.4 Phát triển tư duy điện toán 30
1.2.5 Một số khái niệm khác 31
1.3 PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN TRONG DẠY HỌC 34
1.3.1 Đặc điểm của tư duy điện toán 34
1.3.2 Các thành tố của tư duy điện toán 37
1.3.3 Bản chất dạy học phát triển tư duy điện toán trong dạy học lập trình cho sinh viên 41
1.3.4 Đánh giá mức độ phát triển tư duy điện toán của sinh viên 50
1.3.5 Một số định hướng phát triển tư duy điện toán cho sinh viên 55
1.4 THỰC TRẠNG PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN KTĐT-VT TẠI CÁC TRƯỜNG ĐẠI HỌC KHU VỰC MIỀN TRUNG VÀ TÂY NGUYÊN 58
1.4.1 Mục đích, đối tượng, nội dung và phương pháp khảo sát 58
1.4.2 Kết quả khảo sát 60
KẾT LUẬN CHƯƠNG 1 69
Chương 2. PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN TRONG DẠY HỌC MÔN KĨ THUẬT LẬP TRÌNH 70
2.1 PHÂN TÍCH CHƯƠNG TRÌNH MÔN KĨ THUẬT LẬP TRÌNH 70
2.1.1 Khái lược cấu trúc chương trình đào tạo ngành KTĐT - VT 70
2.1.2 Đặc điểm nội dung môn học Kĩ thuật lập trình 71
2.2 MỘT SỐ BIỆN PHÁP DẠY HỌC PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN KTĐT-VT 75
2.2.1 Biện pháp 1: Lựa chọn nội dung chứa đựng cơ hội để hình thành và phát triển tư duy điện toán cho SV. 75
2.2.2 Biện pháp 2: Hướng dẫn SV phân rã hoạt động lập trình thành những hoạt động thành phần, phân chia vấn đề phức tạp thành đơn giản hơn theo trình tự xác định. 96
2.2.3 Biện pháp 3: Hình thành thói quen khái quát hóa bài toán, kiểm tra, đánh giá các chương trình kết quả và xây dựng chương trình với nhiều thuật toán khác nhau sao cho chương trình hiệu quả hơn 104
2.3 TỔ CHỨC HOẠT ĐỘNG DẠY HỌC MÔN KĨ THUẬT LẬP TRÌNH PHÁT TRIỂN TƯ DUY ĐIỆN TOÁN CHO SINH VIÊN KTĐT, VT 109
2.3.1 Tiến trình tổ chức dạy học môn Kĩ thuật lập trình nhằm phát triển tư duy điện toán cho sinh viên KTĐT-VT 109
2.3.2 Một số giáo án minh họa trong dạy học môn Kĩ thuật lập trình 118
KẾT LUẬN CHƯƠNG 2 127
Chương 3. KIỂM NGHIỆM VÀ ĐÁNH GIÁ 129
3.1. MỤC ĐÍCH, ĐỐI TƯỢNG VÀ PHƯƠNG PHÁP KIỂM NGHIỆM 129
3.1.1. Mục đích 129
3.1.2. Phương pháp kiểm nghiệm 129
3.1.3. Đối tượng kiểm nghiệm 129
3.2. NỘI DUNG VÀ KẾT QUẢ KIỂM NGHIỆM BẰNG PHƯƠNG PHÁP CHUYÊN GIA 130
3.2.1. Nội dung và tiến trình thực hiện 130
3.2.2. Đánh giá kết quả 131
3.3. NỘI DUNG VÀ KẾT QUẢ THỰC NGHIỆM SƯ PHẠM 134
3.3.1. Nội dung và tiến trình thực nghiệm 134
3.3.2. Tiến hành thực nghiệm 135
226 trang |
Chia sẻ: quyettran2 | Ngày: 28/12/2022 | Lượt xem: 456 | Lượt tải: 4
Bạn đang xem trước 20 trang tài liệu Luận án Dạy học kĩ thuật lập trình cho sinh viên ngành kĩ thuật điện tử - viễn thông theo hướng phát triển tư duy điện toán, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
a đôi để phát triển được những thuật toán mới, phù hợp với những vấn đề thực tiễn khác nhau. Chẳng hạn, thuật toán sai vị sau:
Với thuật toán này, nếu f là hàm lồi (hoặc lõm) tại lân cận của thì
Ta đặt a0 = a, b0 = b và I0 = [a0, b0], xây dựng dãy xnn∈N theo từng bước thuật toán như sau:
Bước 1: Tìm đoạn con chứa nghiệm I1 Ì I0 , ta xây dựng đa thức nội của f với hai mốc nội suy là a0 và b4, tức là đường thẳng đi qua hai điểm (a0, f(a0)) và (b0, f(b0)). Lấy giao điểm x0 của đường thẳng này với trục hoành, ta được:
a0=a0-a0-b0f(a0)-f(b0)f(a0)=b0-b0-a0f(b0)-f(a0)f(b0)=f(a0)b0-f(b0)a0f(a0)-f(b0)
Nếu f(a). f(x0) < 0 thì nghiệm x* Î (a, x0) nên ta loại bỏ đoạn còn lại và đặt [a1, b1] = [a, x0]. Ngược lại, nếu f(a). f(x0) < 0 thì nghiệm x* Î (x0, b) nên ta loại bỏ đoạn còn lại và đặt [a1, b1] = [x0, b].
Bước 2: Lặp lại quy trình tìm các đoạn con chứa nghiệm của đoạn In = [an , bn] với n ³ 1 như ở Bước 1.
* Ngoài ra, còn một số thuật toán Newton – Raphson, thuật toán dây cung, GV có thể sử dụng để phát triển tư duy điện toán trong quá trình dạy học lập trình.
c2. Thuật toán giải hệ đại số tuyến tính
Đại số tuyến tính là trung tâm của hầu hết các lĩnh vực toán học. Ví dụ, đại số tuyến tính là cơ bản trong các bài thuyết trình hiện đại về hình học, bao gồm cả việc xác định các đối tượng cơ bản như đường thẳng, mặt phẳng và phép quay. Đại số tuyến tính được sử dụng nhiều trong toán học, như trong đại số đại cương, giải tích hàm, hình học giải tích... để giải các bài toán như phép quay trong không gian, nội suy bình phương nhỏ nhất, nghiệm của hệ phương trình vi phân, tìm đường tròn qua ba điểm...
Đại số tuyến tính cũng được sử dụng trong hầu hết các ngành khoa học và lĩnh vực kĩ thuật, vì nó cho phép mô hình hóa nhiều hiện tượng tự nhiên và tính toán hiệu quả với các mô hình như vậy. Với ứng dụng trong khoa học tự nhiên (vật lý, công nghệ...) và khoa học xã hội (kinh tế...), vì các mô hình phi tuyến tính hay gặp trong tự nhiên và xã hội thường có thể xấp xỉ bằng mô hình tuyến tính [33].
Sử dụng đại số tuyến tính có thể giải chính xác hoặc gần đúng rất nhiều bài toán, bao gồm cả các bài toán không tuyến tính. Lý do là ta luôn có thể sử dụng vi giải tích để biến các hàm không tuyến tính thành gần đúng tuyến tính ở gần những điểm quan tâm. Phương pháp này là một trong những phương pháp phổ biến nhất trong toán học ứng dụng vào khoa học và kĩ thuật.
Nhiều vấn đề kĩ thuật phức tạp trong cuộc sống, khoa học đều đưa về giải hệ này. Có thể nêu ra một số các ứng dụng của đại số tuyến tính như trong hóa học (việc cân bằng các phương trình phản ứng hóa học), ứng dụng trong tin học (lý thuyết mã hóa thông tin, mật mã, nén ảnh, lý thuyết đồ thị,), ứng dụng trong di truyền học, ứng dụng trong, phân bố nhiệt độ, ứng dụng trong xã hội học,
Một ví dụ minh họa trong quá trình mã hóa thông tin. Các thông điệp được truyền đi (như dữ liệu từ vệ tinh) thường là những thông tin đã bị gây nhiễu. Điều cần thiết là khả năng mã hóa một tin nhắn theo cách mà sau khi tiếng ồn đã gây nhiều nó, thông tin có thể được giải mã về dạng thông tin chính thống ban đầu. Trong ứng dụng của đại số tuyến tính, có thể xem xét cách thức giải mã một thông điệp sau khi nó bị bóp méo bởi một loại tiếng ồn. Đó là quá trình mã hóa thông tin. Một mã phát hiện lỗi trong một tin nhắn bị nhiễu gọi là phát hiện lỗi. Nếu có thể sửa lỗi thì được gọi là sửa lỗi. Trong tin học, có nhiều kĩ thuật mã hóa từ cơ bản đến nâng cao, cũng như thuật toán sửa lỗi sẽ quy về giải đại số tuyến tính [33].
Một ứng dụng đại số tuyến tính quan trọng nữa trong thế giới kĩ thuật số ngày nay đó là phát triển thuật toán song song thực hiện trên GPU (Graphic Processing Unit). Đó là xu hướng nghiên cứi mới bên cạnh các mô hình quen thuộc như MPI (Message Passing Interface), OpenMP,... Sự bùng nổ của Internet, sự bùng nổ của xu thế mọi thiết bị đều kết nối (Internet of thing - IOT), sự bùng nổ về nhu cầu thưởng các sẩn phầm âm thanh đồ họa độ phân giải cao và chất lượng cao, sự bùng nổ của các dịch vụ lưu trữ đám mây, dịch vụ trực tuyến, đã khiến cho khối lượng dữ liệu mà vi xử lý (CPU) phải tính toán ngày càng lớn và thực sự đã vượt quá nhanh so với sự phát triển tốc độ của CPU. Không những thế con người mặc dù muốn có nhiều thông tin hơn, thông tin phải tốt hơn lại còn muốn tốc độ xử lý phải nhanh hơn, điều này càng làm cho nhu cầu tính toán trong lĩnh vực khoa học, công nghệ đã và đang trở thành một thách thức lớn. Từ đó các giải pháp nhằm tăng tốc độ tính toán đã được ra đời. Hệ thống tính toán GPU là một giải pháp mới khắc phục tốt các hạn chế về chi phí rất lớn cho một hệ thống tính toán hiệu năng cao [43].
Với lợi ích của việc phát triển thuật toán song song hóa trên GPU nên việc cung cấp cho sinh viên các thuật toán của phương pháp số để xấp xỉ bài toán và đánh giá độ phức tạp của thuật toán khi thực hiện mô phỏng với dữ liệu lớn là rất cần thiết, đồng thời vận dụng việc phát triển tư duy điện toán cho SV trong quá trình phân tích và mô phỏng hệ thống bằng máy tính [73] [33].
Trong đại số tuyến tính để hướng dẫn SV vận dụng tư duy điện toán để thiết lập thuật toán từ kiến thức toán học được học trước đó, có thể viết minh họa một thuật toán Partial Pivoting của phương pháp khử Gauss [11] như sau:
Bước 1: Tại dòng thứ k, ta tìm phần tử có giá trị lớn nhất của vector cột thứ k:
apk=maxj=k,,najk (tức là giá trị lớn nhất nằm ở dòng thứ p).
Bước 2: Đổi hai dòng thứ k và thứ p của ma trận A’ cho nhau, ta được ma trận A”.
Bước 3: Thực hiện thuật toán Gauss1 cho ma trận A”:
aij(k+1)=aij(k)-aik(k)akk(k)akj(k)bi(k+1)= bi(k)-aik(k)akk(k)bk(k) với k=1, 2,,n-1;i=k+1,,n;j=k,,n
Đoạn chương trình mô phỏng thuật toán Partial Pivoting của phương pháp khử Gauss như sau:
import numpy as np
def Gauss2(A,b):
n = len(b)
for k in range(n-1):
# Tim dong p co abs(A(j,k)) lon nhat
p = k
for j in range(k+1,n):
if abs(A[j,k]) > abs(A[p,k]):
p = j
# Thuc hien doi dong p va k
A[[k,p]] = A[[p,k]]
b[k],b[p] = b[p],b[k]
for i in range(k+1,n):
m = A[i,k]/A[k,k]
for j in range(k,n):
A[i,j] = A[i,j] - m * A[k,j]
b[i] = b[i] - m * b[k]
return A, b
c3. Thuật toán nội suy và ứng dụng
Nội suy là phương pháp ước tính giá trị của các điểm dữ liệu chưa biết trong phạm vi của một tập hợp rời rạc chứa một số điểm dữ liệu đã biết. Trong khoa học kĩ thuật, người ta thường có một số điểm dữ liệu đã biết giá trị bằng cách lấy mẫu thực nghiệm. Những điểm này là giá trị đại diện của một hàm số của một biến số độc lập có một lượng giới hạn các giá trị. Thường chúng ta phải nội suy (hoặc ước tính) giá trị của hàm số này cho một giá trị trung gian của một biến độc lập. Điều này có thể thực hiện bằng phương pháp đường cong phù hợp hoặc phân tích hồi quy.
Bài toán nội suy [11] [44] là bài toán tìm giá trị gần đúng của y tại các điểm nằm giữa các giá trị x không có trong bảng trên. Nếu cần tìm các giá trị gần đúng của y tại các điểm x nằm ngoài khoảng [x0, xn] thì bài toán được gọi là bài toán ngoại suy. Một bộ n+1 cặp các giá trị đã biết của x và y: (x0,y0), (x1,y1), . . . , (xn,yn) được gọi là một mẫu quan sát, còn x0, x1, ... , xn được gọi là các điểm quan sát và y0, y1, ..., yn là các kết quả quan sát.
Một số đoạn chương trình mô phỏng các thuật toán nội suy đa thức như sau:
/*Tra ve gia tri da thuc noi suy tai x; anew[i] la cac he so da thuc noi suy Newton, xqs[i] la cac diem quan sat*/
double polinew(double x)
{ int i ; double mx, s;
s=anew[0 ];
mx=1;
for(i=0 ; i<nqs ; i++)
{ mx*=(x-xqs[i]) ;
s+= anew[i+1]*mx ;
}
return s ;
}
/*Tra ve gia tri da thuc noi suy tai x; alag[i] la cac he so cua da thuc noi suy Lagrange , xqs[i] la cac diem quan sat*/
double polilag(double x)
{ int i, j; double mx, s;
s=0 ;
for( i=0 ; i<=nqs ; i++ )
{ mx=1;
for(j=0 ; j<=nqs ; j++)
if (j!=i) mx*=(x-xqs[j]) ;
s+=alag[i]*mx;
}
return s;
}
/*Noi suy Newton voi khoang chia khong can deu */
void nsnewton(double *a)
{ int h, i, j, k ; double tmp ; kvecto sp ;
a[0]=yqs[0] ;
for(i=0 ; i<=nqs-1 ; i++) //Tinh sai phan bac 1;
sp[i]=(yqs[i+1]-yqs[i])/(xqs[i+1]-xqs[i]) ;
a[1]=sp[0] ;
for(k=2;k<=nqs;k++) //Tinh cac sai phan bac k va cac he so a[i]
{ for(i=0 ; i<=nqs-k ; i++)
sp[i]=(sp[i+1]-sp[i])/(xqs[i+k]-xqs[i]);
a[k]=sp[0];
}
}
/*Noi suy Lagrange voi khoang chia khong can deu – Tinh cac he so*/
a[i] = 1/((x[i]-x[0])(x[i]-x[1])...(x[i]-x[i-1])(x[i]-x[i+1])...x[m])*/
void nslagrange(double *a)
{ int h, i, j, k ; double tmp ;
for(i=0;i<=nqs;i++) //Tinh cac he so a[i];
{ tmp=1;
for(j=0; j<=nqs; j++)
if(j!=i) tmp=tmp*(xqs[i]-xqs[j]);
a[i]=yqs[i]/tmp;
}
}
SV sẽ thường được học phương pháp giải bài toán nội suy bằng đa thức [44]. Các đa thức nội suy thường có bậc là n, trong đó n+1 là số điểm quan sát. Có thể tiến hành nội suy bằng đa thức bậc m nhỏ hơn n, nhưng như vậy thì ta cũng chỉ dùng đến mẫu quan sát dựa trên m+1 điểm là (x0,y0), (x1,y1), ..., (xm,ym) và như thế chỉ nội suy được giá trị của hàm tại các điểm x ∈ [x0,xm]. Điều này chứng tỏ ra không được phù hợp với thực tế cho lắm. Thật vậy, giả sử trong thực tế hàm f(x) là một đa thức bậc 3 nhưng vì ta không biết điều này nên phải dùng đa thức nội suy. Theo một cách tự nhiên, nếu có càng nhiều thông tin thì ta càng giải quyết bài toán tốt hơn. Nghĩa là nếu có càng nhiều điểm quan sát thì kết quả càng gần với thực tế hơn. Tuy nhiên, nếu dùng đa thức nội suy như kiểu vừa khảo sát thì không có được như điều mong đợi. Phép nội suy đa thức còn có một nhược điểm nữa là số lượng phép tính cần thực hiện phụ thuộc rất nhiều vào cỡ của mẫu quan sát. Trong kĩ thuật truyền thông chẳng hạn, việc chuyển đổi một tín hiệu số có hàng ngàn điểm quan sát sang dạng tương tự là vấn đề thường gặp. Thế nhưng chỉ cần nội suy đa thức cho 101 điểm quan sát ta đã phải dùng đến đa thức bậc 100, và việc dùng đa thức bậc 100 để tính toán cho các điểm còn lại là một việc tiêu tốn tài nguyên máy một cách quá lãng phí. Vì vậy có thể nói rằng phép nội suy đa thức chỉ có ý nghĩa lý thuyết mà thôi, trong thực tế hầu như người ta không dùng đến. Để tìm kiếm một cách nội suy gần với thực tế hơn, GV cho SV tư duy sử dụng kiến thức về dạng nội suy đường cong (spline) [44]. Chẳng hạn, để tìm kiếm nội suy thực tế hơn, SV muốn vẽ đồ thị hàm số nào đó, hãy bắt đầu bằng một thao tác đơn giản là vẽ các điểm rời rạc, và vẽ được càng nhiều điểm càng tốt. Sau đó, dùng bút nối các điểm đó với nhau, nhưng không nối bằng thước kẻ, mà nối bằng bút và sự quan sát bằng mắt sao cho các đoạn nối các điểm thành một đường mịn, không bị gãy khúc.
Đoạn chương trình mô phỏng thuật toán nội suy spline như sau:
import numpy as np
from matplotlib import pyplot as plt
def myspline(x,y,bcond = {"btype":1,"bleft":0,"bright":0}):
if bcond["btype"] == 1:
# Dieu kien bien type 2: s''(a) = f''(a), s''(b) = f''(b)
if "bleft" in bcond:
d2f0 = bcond["bleft"]
else:
d2f0 = 0
if "bright" in bcond:
d2fn = bcond["bright"]
else:
d2fn = 0
elif bcond["btype"] == 2:
# Dieu kien bien type 1: s'(a) = f'(a), s'(b) = f'(b)
if "bleft" in bcond:
df0 = bcond["bleft"]
else:
df0 = 0
if "bright" in bcond:
dfn = bcond["bright"]
else:
dfn = 0
n = len(x)
h = x[1:] - x[0:-1]
a0 = h/6
a1 = np.zeros(n)
a1[1:-1] = (h[0:-1]+h[1:])/3
if bcond["btype"] == 1:
a1[0] = 1
a1[-1] = 1
a0[0] = 0
a0[-1] = 0
elif bcond["btype"] == 2:
a1[0] = h[0]/3
a1[-1] = h[-1]/3
elif bcond["btype"] == 3:
n = n-1
a1[0] = (h[0]+h[-1])/3
a1 = a1[:-1]
a0 = a0[:-1]
A0 = np.diag(a0,-1)
A1 = np.diag(a1)
A2 = np.diag(a0,1)
A = A0 + A1 + A2
if bcond["btype"] == 3:
A[0,-1] = h[-1]/6
A[-1,0] = h[-1]/6
z = (y[1:]-y[0:-1])/h
d = z[1:]-z[0:-1]
if bcond["btype"] == 1:
d = np.insert(d,0,d2f0)
d = np.append(d,d2fn)
elif bcond["btype"] == 2:
d = np.insert(d,0,z[0] - df0)
d = np.append(d,dfn-z[-1])
elif bcond["btype"] == 3:
d = np.insert(d,0,z[0]-z[-1])
m = np.linalg.solve(A,d)
if bcond["btype"] == 3:
m = np.append(m,m[0])
# print(A,d)
return h,m
Đây là kiến thức cơ bản SV được học trong chương trình, nhằm giúp SV có thể dựng lại dữ liệu, khôi phục dữ liệu, giảm ước tính toán để xác định được quy luật, xác định được hàm số.
Minh họa cho bài toán nội suy được ứng dụng trong thực tế như việc phóng to, thu nhỏ ảnh, các ứng dụng về chương trình thời tiết, hoặc ứng dụng trong sinh học về việc phân tích quần thể về các trường hợp mắc bệnh truyền nhiễm bệnh trong xã hội, xây dựng bản đồ hiện trạng chất lượng không khí,
c4. Thuật toán xấp xỉ tích phân
Các phương pháp Monte Carlo [10] là một lớp các thuật toán để giải quyết nhiều bài toán trên máy tính theo kiểu không tất định, thường bằng cách sử dụng các số ngẫu nhiên (thường là các số giả ngẫu nhiên), ngược lại với các thuật toán tất định. Một ứng dụng cổ điển của phương pháp này là việc tính tích phân xác định, đặc biệt là các tích phân nhiều chiều với các điều kiện biên phức tạp.
Các phương pháp này đặc biệt hiệu quả khi giải quyết các phương trình vi-tích phân; ví dụ như trong mô tả trường bức xạ hay trường ánh sáng trong mô phỏng hình ảnh ba chiều trên máy tính, có ứng dụng trong trò chơi điện tử, kiến trúc, thiết kế, phim tạo từ máy tính, các hiệu ứng đặc biệt trong điện ảnh, hay trong nghiên cứu khí quyển, và các ứng dụng nghiên cứu vật liệu bằng laser...
Trong toán học, thuật toán Monte Carlo là phương pháp tính bằng số hiệu quả cho nhiều bài toán liên quan đến nhiều biến số mà không dễ dàng giải được bằng các thuật toán khác, chẳng hạn bằng tính tích phân. Hiệu của của phương pháp này, so với các phương pháp khác, tăng lên khi số chiều của bài toán tăng. Monte-Carlo cũng được ứng dụng cho nhiều lớp bài toán tối ưu hóa.
Trong các hệ thống truyền thông số phức tạp, tốc độ lỗi bit (BER) là thông số quan trọng nhất trong việc đánh giá hiệu suất của hệ thống. Thuật toán Monte Carlo trở thành công cụ mô phỏng hiệu quả các thông số này. Các hệ thống ngày nay hoạt động trong các môi trường được đặc trưng bởi nhiễu, sự không tuyến tính, tính đa đường và hàng loạt ảnh hưởng khác. Do vậy, mô phỏng Monte Carlo trở thành một phương pháp khả thi [10] [11].
Một số đoạn chương trình mô phỏng thuật toán Monte Carlo như:
# Tinh gan dung tich phan tren [a,b] x [c,d] - Ve hinh tron
import numpy as np
import matplotlib.pyplot as plt
import time
def hamf(x,y):
f = (1+(1-x)**2 + 10*(y-x**2)**2)
return f
a,b = 0,1
c,d = 0,1
# Start time
Start = time.time()
N = 5000
X = np.random.uniform(a,b,N)
Y = np.random.uniform(c,d,N)
Xc = [ ]
Yc = [ ]
for i in range(N):
r2 = (X[i]-0.5)**2 + (Y[i]-0.5)**2
if r2 <= 0.25:
Xc = np.append(Xc,X[i])
Yc = np.append(Yc,Y[i])
fX = hamf(Xc,Yc)
N2 = Xc.shape[0]
Imc = np.pi*0.25**2*np.sum(fX)/N2
# End time
End = time.time()
Total = End - Start
print("Approximated Value is : ", Imc)
print("Elapsed wall-clock time is : ", Total)
plt.plot(Xc,Yc,'b.')
plt.xlabel('X-direction')
plt.ylabel('Y-direction')
plt.show()
# Tinh gan dung tich phan tren [a,b] x [c,d] – Ve HCN
import numpy as np
import matplotlib.pyplot as plt
def hamf(x,y):
f = (1+(1-x)**2 + 10*(y-x**2)**2)
return f
a,b = 1,2
c,d = 0,1
N = 5000
X = np.random.uniform(a,b,N)
Y = np.random.uniform(c,d,N)
fXY = hamf(X,Y)
Imc = (b-a)*(d-c)*np.sum(fXY)/N
print("Gia tri tich phan gan dung la : ", Imc)
Bên cạnh đó, GV cần cho SV sử dụng tư duy điện toán để phân tích thuật toán Monte Carlo khi ứng dụng trong thực tế ngày nay. Phương pháp Monte Carlo có thể áp dụng cho tất cả các hệ thống mà không cần quan tâm tới kiến trúc hay độ phức tạp, nhưng có một trở ngại quan trọng. Vấn đề cơ bản với phương pháp Monte Carlo đó là thời gian cần để thực hiện một mô phỏng và đạt được một ước lượng đáng tin cậy về hiệu suất của hệ thống thường rất dài. Đặc biệt, trong hầu hết các hệ thống truyền thông số phức tạp trong thực tế với nhiễu ngẫu nhiên và sự không tuyến tính, không thể tính được chính xác xác suất lỗi bằng cách phân tích. Việc ước lượng các sự kiện có xác suất lỗi thấp, hay các sự kiện hiếm bằng cách sử dụng trực tiếp các kĩ thuật mô phỏng Monte Carlo cổ điển thường đòi hỏi số lần thực hiện rất lớn. Từ những hạn chế của kĩ thuật Monte Carlo cổ điển, cần tìm ra một phương pháp để có thể mô phỏng những hệ thống có xác suất lỗi thấp, đồng thời đảm bảo thời gian thực hiện ngắn. Một phương pháp dựa trên kĩ thuật Monte Carlo đã chỉnh sửa, gọi là kĩ thuật lấy mẫu theo trọng số (IS) được nghiên cứu và sử dụng. IS là kĩ thuật có khả năng cải thiện thời gian chạy mô phỏng trên máy tính, và cung cấp một ước lượng BER thu được có phương sai nhỏ hơn ước lượng theo kĩ thuật Monte Carlo có thời gian mô phỏng tương đương. Kĩ thuật IS đã được áp dụng trong rất nhiều lĩnh vực, như truyền thông sợi quang, vệ tinh, các kênh không tuyến tính và không có dạng Gauss, ước lượng hiệu suất của các hệ thống tính toán có độ tin cậy cao, lý thuyết xếp hàng, thuật toán dò,
c5. Mô hình hoá và mô phỏng
Mô hình hóa là một quá trình thay thế hệ thống thực bằng một mô hình để nhằm thu nhận các thông tin của hệ thống bằng cách tiến hành các thực nghiệm, tính toán trên mô hình .
Mặc dù chỉ có thể xây dựng được mô hình gần đúng với hệ thống thực, mô hình hóa luôn luôn là một phương pháp hữu hiệu để con người nghiên cứu hệ thống, nhận biết các quá trình, các quy luật tự nhiên. Đặc biệt, ngày nay nhờ có sự trợ giúp đắc lực của máy tính, có thể phát triển các phương pháp mô hình hóa cho phép xây dựng các mô hình ngày càng gần với hệ thống nghiên cứu, đồng thời việc thu nhận lựa chọn, xử lý các thông tin về mô hình rất thuận tiện, nhanh chóng và chính xác. Chính vì vậy, mô hình hóa là một phương pháp nghiên cứu khoa học giúp cho SV luyện tập tư duy điện toán, phân tích bài toán và có thể ứng dụng vào thực tiễn.
Mô phỏng là phương pháp mô hình hóa dựa trên việc xây dựng mô hình số và dùng phương pháp số để tìm các lời giải. Chính vì vậy, máy tính số là công cụ duy nhất và hữu hiệu để thực hiện việc mô phỏng hệ thống. Mô hình số được xây dựng dựa trên phương pháp số tức là bằng các chương trình chạy trên máy tính số. Mô phỏng bằng máy tính: Xây dựng và thử nghiệm các mô hình thực tế của một hệ thống trên một máy tính [2].
Mô hình hóa toán học là quá trình chuyển đổi từ vấn đề thực tế sang vấn đề toán học bằng cách thiết lập và giải quyết các mô hình toán học. Cụ thể, mô hình hóa toán học là toàn bộ quá trình chuyển đổi từ vấn đề thực tiễn sang vấn đề toán học và ngược lại, cùng với các yếu tố liên quan đến quá trình đó như: từ bước xây dựng lại tình huống thực tiễn, lựa chọn mô hình toán học phù hợp, làm việc trong một môi trường toán học, giải thích, đánh giá kết quả liên quan đến tình huống thực tiễn và điều chỉnh mô hình cho đến khi có được kết quả hợp lí [9].
Về mặt nhận thức, mô hình là sản phẩm của quá trình tư duy, ra đời nhờ quá trình trừu tượng hóa các đối tượng cụ thể. Trong quá trình trừu tượng hóa, cần loại bỏ dấu hiệu không bản chất, chỉ giữ lại những thuộc tính bản chất.
Mô hình hóa trong dạy học Toán là quá trình giúp SV tìm hiểu, khám phá các tình huống nảy sinh từ thực tiễn bằng công cụ và ngôn ngữ Toán học với sự hỗ trợ của công nghệ thông tin. Quá trình này đòi hỏi SV cần có các kĩ năng và thao tác tư duy Toán học như phân tích, tổng hợp, so sánh, khái quát hóa, trừu tượng hóa. Điều này SV cần phải có quá trình rèn luyện tư duy điện toán để hình thành kỹ năng xử lý. GV tiến hành dạy cho SV mô hình hóa gắn chặt với tư duy điện toán [10].
Chẳng hạn có một ứng dụng trong sinh học mô phỏng cách tư duy mô hình hóa một bài toán trong thực tế [44]. Đó là muốn đo sự thay đổi dân số trong quần thể (Hình 2.1) theo thời điểm t.
Bài toán được phát biểu tóm lược như sau:
Ta gọi N(t) là tổng số dân tại thời điểm t, trong đó:
- Số người khoẻ mạnh (chưa bị nhiễm bệnh) là S(t);
- Số người bắt đầu nhiễm bệnh nhưng chưa truyền nhiễm cho người khác là E(t);
- Số người bị nhiễm bệnh và truyền nhiễm cho người khác là I(t);
- Số người đã khỏi bệnh và miễn dịch với bệnh là R(t).
Như vậy, N(t) = S(t) + E(t) + I(t) + R(t)
Hãy mô hình hoá và nghiên cứu mô phỏng về sự truyền nhiễm bệnh giữa các nhóm đối tượng nêu trên trong quần thể.
GV hướng dẫn SV cách tư duy về bài toán sao cho tìm ra thuật toán đưa về công thức tính toán cụ thể, tức là muốn đo dân số tại thời điểm t bằng cách lấy dân số thời gian sau – dân số thời gian trước.
- Hàm S(t): tăng do dân số sinh tự nhiên và nhập cư với tỉ lệ B theo t; giảm do bị lây nhiễm với I(t) theo tỉ lệ β và giảm so chết tự nhiên với tỉ lệ µ:
- Hàm E(t): tăng do bị lây nhiễm mới với I(t) theo tỉ lệ β; giảm so chết tự nhiên với tỉ lệ µ; giảm do bệnh nặng lên có thể truyền nhiễm cho người khác với tỉ lệ α và giảm do có khỏi bệnh với tỉ lệ σ:
- Hàm I(t) và R(t): Tương tự như trên.
Hình 2.1. Mô hình minh họa quần thể
Ta có hệ phương trình vi phân thường sau đây:
Khi đó, hệ phương trình trên có thể được viết dưới dạng thu gọn như sau: Y’(t) = F(t, Y(t)) .
Đến giai đoạn này, GV đã dẫn dắt SV đi đến hoạt động tiếp theo, đó là sử dụng các phương pháp số trong toán học để giải quyết bài toán hệ phương trình vi phân thường. Áp dụng một số phương pháp giải gần đúng phương trình vi phân thường [43] như phương pháp Euler, phương pháp Euler cải tiến, phương pháp Heun, hoặc phương pháp Runge – Kutta.
Một số đoạn mã chương trình mô phỏng cho các thuật toán trên như sau:
- Phương pháp Euler:
- Phương pháp Euler cải tiến:
- Phương pháp Heun:
- Phương pháp Rungle – Kutta:
Tóm lại, để giải quyết các bài toán trên một cách đơn giản đòi hỏi có sự hỗ trợ của kĩ thuật tin học, bởi lẽ việc sắp xếp dữ liệu, tính toán hiệu quả là vấn đề quan trọng. Cho nên, việc phân tích lập trình để ra quyết định ngôn ngữ, cấu trúc ngữ pháp, câu lệnh, phụ thuộc nhiều vào việc vận dụng tư duy để ra quyết định. Việc đánh giá chương trình, đánh giá thuật toán, phụ thuộc vào tình huống. Từ đó, máy tính muốn làm việc hiệu quả thì giải pháp chọn lựa nội dung kiến thức dạy học, việc phân tích nội dung, phân tích kĩ thuật ngôn ngữ lập trình rất quan trọng, cũng như góp phần quan trọng trong việc rèn tư duy điện toán cho SV và tăng hiệu quả rất nhiều cho các giải pháp tiếp theo.
2.2.2 Biện pháp 2: Hướng dẫn SV phân rã hoạt động lập trình thành những hoạt động thành phần, phân chia vấn đề phức tạp thành đơn giản hơn theo trình tự xác định.
a. Cơ sở đề xuất biện pháp 2:
Trên cơ sở hệ thống các nguyên tắc dạy học theo hướng phát triển tư duy điện toán được nêu ra ở trên và đặc điểm của môn Kĩ thuật lập trình, và với quan điểm dạy học phát triển tư duy chính là việc rèn luyện cho SV thực hiện tốt các hoạt động tư duy thành phần.
Để kích thích tư duy cho SV phát triển tư duy điện toán trong quá trình dạy học kĩ thuật lập trình thì thường diễn ra những hoạt động dạy học chiếm lĩnh tri thức lập trình và rèn luyện kỹ năng sử dụng thành thạo các cấu trúc câu lệnh trong ngôn ngữ lập trình bất kỳ. Những hoạt động cụ thể như GV giúp học sinh kích thích nhu cầu nhận thức tri thức lập trình khi chuẩn bị học cấu trúc của ngôn ngữ lập trình; hoặc hoạt động nhận dạng bài toán và nhận dạng thuật toán sử dụng cấu trúc lệnh nào khi chuẩn bị lập trình, Trong quá trình hoạt động, GV tách biệt hóa các hoạt động cụ thể trong từng tình huống khác nhau.
Khi lập trình, công đoạn quan trọng là xây dựng thuật toán, từ đó mã hóa thành chương trình theo một ngôn ngữ lập trình cụ thể nào đó. Trong quá trình dạy học, GV cần đặc biệt quan tâm truyền thụ cho SV những tri thức phương pháp về tư duy thiết kế thuật toán trong khi tổ chức, điều khiển tập luyện hoạt động thông qua dạy học cấu trúc trong ngôn ngữ lập trình. Quá trình xây dựng một thuật toán cũng là quá trình giải một bài toán (một vấn đề) chưa có thuật toán. Vì vậy, biện pháp hướng dẫn SV phân chia vấn đề phức tạp thành đơn giản hơn theo trình tự xác định sẽ giúp cho GV hướng dẫn cho SV giải quyết bài toán (vấn đề) theo một các bước xác định.
b. Mục đích của biện pháp 2:
Biện pháp này giúp cho SV ngành KTĐT-VT hình thành thói quen tư duy phân rã hoạt động của câu lệnh, chương trình. Từ đó, mới hiểu được bản chất và từng bước hoạt động của câu lệnh để viết chương trình hiệu quả hơn, giúp phát hiện lỗi và kiểm soát lỗi lập trình nhanh hơn.
Biện pháp này giúp cho SV ngành KTĐT-VT biết phân chia một bài toán (hoặc một vấn đề) thành nhiều bài toán nhỏ đơn giản hơn (hoặc những việc đơn giản hơn), từ đó giải quyết các bài toán đơn giản (công việc đơn giản) theo từng bước và tuân theo một trình tự nhất định để hoàn thiện nó.
Biện pháp này nhằm hình thành và phát triển yếu tố đầu tiên của tư duy điện toán: “Phân rã vấn đề”; yếu tố thứ hai của tư duy điện toán: “Nhận dạng mẫu” và yếu tố thứ ba của tư duy điện toán: “Thiết kế thuật toán”, đồng thời phát triển kỹ năng “Sử dụng ngôn ngữ để mô tả các quy tắc gồm một số hữu hạn bước sắp xếp theo một thứ tự nhất định” của tư duy thuật toán.
c. Cách thức thực hiện biện pháp 2:
Trong khi giải quyết vấn đề sẽ có nhiều hoạt động khác nhau thường liên quan mật thiết với nhau, hoặc xuất hiện xen kẽ nhau, lồng vào nhau. Mỗi hoạt động này tương ứng như một thành phần củ