YOMEDIA
ADSENSE
Ứng dụng Maple trong thực hành tính toán: Phần 2
19
lượt xem 8
download
lượt xem 8
download
Download
Vui lòng tải xuống để xem tài liệu đầy đủ
Nối tiếp nội dung phần 1, phần 2 cuốn "Thực hành tính toán trong Maple" trình bày các nội dung: Lập trình trong Maple, Maple với phương trình vi phân, lời giải và gợi ý bài tập. Mời các bạn cùng tham khảo nội dung chi tiết.
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Ứng dụng Maple trong thực hành tính toán: Phần 2
- CHƯƠNG 6 LẬP TRÌNH TRONG MAPLE 6.1. Cơ sở dữ liệu của Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 6.2. Các câu lệnh có cấu trúc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 6.3. Toán tử break và next trong while - for . . . . . . . . . . . . . . . . . . 164 6.4. Tạo lập thủ tục hàm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 6.5. Tạo lập thủ tục đơn giản trong Maple . . . . . . . . . . . . . . . . . . . 167 6.6. Biến cục bộ, hàm return và hàm error . . . . . . . . . . . . . . . . . . . 168 6.7. Những toán tử tính toán trong Maple . . . . . . . . . . . . . . . . . . . . 175 6.8. trace và printlevel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 6.9. Xem mã thư viện nguồn của Maple . . . . . . . . . . . . . . . . . . . . . 181 6.10. Chuyển mã Maple ra C, fortran, latex . . . . . . . . . . . . . . . . . . 182 6.11. Một số thuật toán cổ điển. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 6.12. Phương pháp Newton trong giải tích số . . . . . . . . . . . . . . . . 192 6.13. Bài tập luyện tập . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 6.14. Bài tập tự giải . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Cho đến chương này chúng ta tiếp xúc với Maple qua từng câu lệnh, đó là các lệnh qua các biểu thức hoặc là lệnh gán dữ liệu. Chúng ta có thể tập hợp tất cả thao tác lại và soạn thảo thành một tệp chứa các lệnh ta cần để Maple thực hiện liên tục khi Maple đọc tệp này. Như vậy ta đã tạo ra tập nguồn của chương trình với ý đồ xây dựng của ta, lúc cần ta lại cho Maple thực hiện lại. Việc lập trình kiểu đơn giản như vậy ai cũng làm được. Để có thể làm tốt hơn việc sắp xếp các lệnh, chương này chúng ta thiết lập một số qui tắc xắp xếp các lệnh đơn giản và hiệu quả nhất. Ngày nay nếu Pascal, C là các ngôn ngữ chủ yếu để học cách lập trình thì Maple gắn bó với giới chuyên môn, ở đó họ tìm thấy đáp án cho các yêu cầu của mình, đó là tính hiệu quả , đơn giản và cô đọng khi viết, nhưng cũng cho phép truy nhập được vào nguồn tư liệu và chương trình hệ thống.
- 158 Chương 6. Lập trình trong Maple 6.1. Cơ sở dữ liệu của Maple Nhắc lại những dữ liệu mà Maple có ngay từ chương đầu tiên đó là: các loại số, số nguyên, số chấm động, các ký tự, mảng, bảng, ...; các loại biến, hằng và hàm; các phép toán thực hiện trên dữ liệu. Khi viết chương trình ta coi các dữ liệu trên là có sẵn, không khai báo hoặc định nghĩa lại mà cứ dùng tự nhiên như khi ta thực hiện tương tác với Maple. Vẫn chỉ bằng các lệnh gán hoặc các lệnh theo hàm thì việc tổ chức và điều khiển rất khó, thậm chí không thể sắp xếp theo ý đồ thực hiện công việc của ta được. Maple cung cấp một số câu lệnh cấu trúc điều khiển thực hiện của Maple cho hiệu quả, từ dưới đây chúng ta nghiên cứu các lệnh cấu trúc này. 6.2. Các câu lệnh có cấu trúc 6.2.1. Câu lệnh điều kiện if - then - else - fi Mẫu 1: Lựa chọn câu lệnh if then else fi; Maple xác định giá trị biểu thức : 1. Nếu giá trị của bằng true Maple thực hiện: Sau đó kết thúc câu lệnh điều kiện. 2. Nếu giá trị của bằng false Maple thực hiện: Sau đó kết thúc câu lệnh điều kiện. Ví dụ 6.1. Sử dụng câu lệnh if mẫu 1 A. Gán giá trị cho hai biến a và b. Sử dụng câu lệnh if mẫu 1 để xác định số lớn nhất trong hai số a và b. >a:=12: b:=37: >if a>= b then print(‘số lớn nhất có giá trị:‘, a); else print(‘số lớn nhất có giá trị:‘, b); fi; số lớn nhất có giá trị:37
- 6.2. Các câu lệnh có cấu trúc 159 B. Hàm isprime(n) cho giá trị true nếu n là số nguyên tố và false cho những số còn lại. >if isprime(b) then print(‘b là số nguyên tố‘); else print(‘b không là số nguyên tố‘); fi; b là số nguyên tố Mẫu 2: Một trong nhiều lựa chọn if then elif then ... elif then else fi; Maple xác định giá trị của (i = 1..n) theo thứ tự lần lượt. 1. Nếu giá trị của bằng true, Maple thực hiện: Sau đó kết thúc câu lệnh điều kiện. 2. Nếu giá trị của đều là false, Maple thực hiện: . Sau đó kết thúc câu lệnh điều kiện. Ví dụ 6.2. Sử dụng câu lệnh if mẫu 2 Gán giá trị cho hai biến c và d. Sử dụng câu lệnh if mẫu 2 để xác định số lớn nhất trong hai số c và d. >c:=2: d:=137: if c>d then print(’ c lớn hơn d’); elif c = d then print(’c bằng d’); else print(’ c nhỏ hơn d’); fi; c nhỏ hơn d
- 160 Chương 6. Lập trình trong Maple Ví dụ 6.3. Hãy viết một thủ tục đưa ra giá trị của hàm −2 x ≤ −3, 2 x x ≤ 2, f (x) = 2 x < 4, 1 còn lại và tính f (5). f:=proc (x) if x
- 6.2. Các câu lệnh có cấu trúc 161 >irem(5, 3); 2 >a:=35: b:=15: >while b 0 do d:=irem(a, b); a:=b; b:=d; od: >lprint(’Ước chung lớn nhất là: ’, a); Ước chung lớn nhất là: 5 6.2.3. Câu lệnh lặp for Mẫu 1: Dùng xây dựng chu trình lặp có số lần lặp xác định for i from by to do od; Bước 1: Biến điều khiển i nhận giá trị của biểu thức . Bước 2: Maple kiểm tra điều kiện: + i = 0 + i >= trường hợp A:=array(1..4, 1..4):
- 162 Chương 6. Lập trình trong Maple >for i to 4 do for j to 4 do if i >j then A[i, j]:=j elif i < j then A[i, j]:=i else A[i, j]:=1 fi od; od: >print (A); 1 1 1 1 1 1 2 2 1 2 1 3 1 2 3 1 n B. Sử dụng for tính đồng thời các tổng ∑ ji với i = 2, 4, 6. . j =1 >for i from 2 by 2 to 6 do lprint(Tổng, j^i, j = 1..n là:); print(expand(sum(j^i,j = 1..n))); od; Tổng j^2 j=1..n là: 1/3n3 + 1/2n2 + 1/6n Tổng j^4 j = 1..n là: 1/5n5 + 1/2n4 + 1/3n3 − 1/30n Tổng j^6 j = 1..n là: 1/42n − 1/6n3 + 1/2n5 + 1/2n6 + 1/7n7 Ví dụ 6.6. Viết thủ tục tính tổng 12 − 32 + 52 − 72 + · · · − 992 + 1012 . So sánh thủ tục với hàm có sẵn trong Maple: UMMM:=proc () local total, k; total:=0; for k by 2 to 101 do total:=total+(-1)^((1/2)*k-1/2)*k^2 od end: >SUMMM(); 5201 >sum((-1)^(k+1)*(2*k-1)^2, k = 1 .. 51); 5201 Trong mẫu 2 của câu lệnh for có sử dụng hai hàm rất quan trọng: >op(i, );
- 6.2. Các câu lệnh có cấu trúc 163 Lệnh op cho thành phần thứ i giữa các thành phần của biểu thức. Ví dụ: op(1,2*x*y); kết quả là 2. Còn op(2,2*x*y); kết quả là x. >nops(); Lệnh nops cho số lượng các thành phần giữa các toán tử trong . Ví dụ: >nops(2*x*y); là 3, >nops([3,4]); là 2. Mẫu 2 của for: Sử dụng giá trị của biến đếm vào biểu thức for i to nops() do câu lệnh (i,) od; Bước 1: Biến điều khiển i nhận giá trị đầu trong qua hàm nops(). Bước 2: Maple thực hiện câu lệnh có (i, ) Bước 3: Kiểm tra điều kiện biến i: a. Nếu i là phần tử cuối cùng của thì Maple ra khỏi chu trình. b. Nếu điều kiện trên sai, i nhận giá trị mới, là giá trị tiếp theo trong . c. Trở lại bước 2. Ví dụ 6.7. Sử dụng for mẫu 2. Ví dụ này sử dụng câu lệnh for dạng 2 để tính tổng bình phương các số chẵn trong danh sách aList. >aList:=[1,2,3,4,5]; >s:=0; >for i to nops (aList) do if irem(op(i, aList), 2) = 0 then s:=s + op(i, aList)^2 fi od: >s; 20 Ví dụ 6.8. Viết thủ tục MEMBER( D, w) tìm từ w có đúng nằm trong từ điển D hay là không? Giả sử có từ điển L := [ abacus, number, algorithm], kiểm tra từ algorithm và ossi f rage có nằm trong từ điển này không?.
- 164 Chương 6. Lập trình trong Maple >MEMBER:=proc (D, w) local k; for k to nops(D) do if w = D[k] then return(true) fi; od; false end: >L:=[abacus, number, algorithm]; L := [ abacus, number, algorithm] >MEMBER(L, algorithm); MEMBER(L, ossifrage); true f alse Mẫu 3 của for: Lặp lại lệnh theo giá trị của một biến trong biểu thức >for x in do od; Lặp lại theo dãy giá trị x lấy trong . Ví dụ 6.9. Sử dụng for mẫu 3. Ví dụ này sử dụng câu lệnh for mẫu 3 để tính tổng bình phương các số lẻ trong danh sách aList. >aList:=[1,2,3,4,5]: s:=0: >for n in aList do if irem(n, 2) = 1 then s:=s + n^2 fi od: >s; 35 6.3. Toán tử break và next trong while - for Trong chu trình lặp của câu lệnh while - for: - Khi gặp toán tử điều kiển break, ngay lập tức chu trình lặp kết thúc. - Khi gặp toán tử điều kiển next, ngay lập tức chuyển sang bước lặp tiếp theo. Ví dụ 6.10. Sử dụng toán tử điều khiển break. A. Tìm ba số nguyên tố đầu tiên trong tập hợp các số nguyên dương.
- 6.4. Tạo lập thủ tục hàm 165 >i:=2: j:=0: >while i>0 do if isprime(i) then print(i, ‘là số nguyên tố‘); j:=j + 1; if j =3 then break fi; fi; i:=i + 1; od: 2 là số nguyên tố 3 là số nguyên tố 5 là số nguyên tố B. Ví dụ dưới đây sử dụng for dạng 2 và toán tử điều khiển next để tính tổng bình phương các số chẵn không chia hết cho 3 trong danh sách sList. >aList:=[1,2,3,4,5,6,7,8,9]; >s:=0; >for i to nops (aList) do if ((irem(op(i, aList), 2) = 0) and (irem(op(i, aList), 2) 0)) then s:=s + op(i, aList)^2 else next fi; od: >s; 84 6.4. Tạo lập thủ tục hàm Mẫu 1: Dùng -> định nghĩa hàm :=(, ,...)-> ; là tên hàm được dùng sau này và không có ký tự trắng. ,... là các đối số của hàm sau này đưa vào. Ví dụ 6.11. Tạo hàm bằng ký hiệu ->. >f:=(x,y)->simplify(x^2+y^2): >f(sin(x),cos(x)); 1 Ví dụ 6.12. Viết một hàm Maple đầu vào là một danh sách các số và đầu ra là giá trị trung bình của các số trong danh sách. Cho L = [−1, 2, 3, 3, 4].
- 166 Chương 6. Lập trình trong Maple >AVERAGE:=X ->(sum(X[i], i = 1 .. nops(X)))/nops(X): >AVERAGE([-1, 2, 3, 3, 4]); 11 5 Ví dụ 6.13. Độ cao của một đa thức là giá trị lớn nhất của giá trị tuyệt đối các hệ số của đa thức p( x ). Hãy viết một hàm số đưa ra độ cao của đa thức được đưa vào. >HEIGHT:=(p, x)->max(map(abs, {coeffs(p, x)})): >f:=11*x^3+3*x^2-8; >HEIGHT(f, x); 11 Mẫu 2: Dùng ký hiệu < | > :=; vẫn như trên và các biến là đối số của hàm theo Biểu thức. Ví dụ 6.14. Ví dụ định nghĩa hàm kiểu mới. Hàm tính tổng hai số. >f:=: >f(-x,x); 0 Mẫu 3: Sử dụng hàm unapply :=unapply(, , ,...); Ý nghĩa ký hiệu trong mẫu trên như các mẫu trước. Mẫu 3 là viết tắt của mẫu 1. Ví dụ 6.15. Dùng hàm số định nghĩa. >f:=unapply(diff(z(x)^2-2x,x)); ∂ f := z → 2z( x )( z( x )) − 2 ∂x >f(sin); 2 sin( x ) cos( x ) − 2 Trong Maple còn một lệnh để định nghĩa hàm từng khúc. >f:=x->piecewise(,,,,...); là biểu thức đúng để có , i = 1, 2, 3, ....
- 6.5. Tạo lập thủ tục đơn giản trong Maple 167 Ví dụ 6.16. Hàm từng khúc. >f:=x->piecewise(x f:=proc(x, y) x + y; end; B. Sử dụng hàm f để tính tổng của hai số x = 27 và y = 46. >f(27, 46); 73 C. Kết quả của hàm với x = w và y = z + 1. >f(w, z+1); w+z+1 D. Xây dựng thủ tục tìm số lớn nhất trong ba số bất kỳ. >max3:=proc(a, b, c) print(So lon nhat trong ba so, a, b, c); if a < b then if b < c then c else b fi elif a < c then c else a fi; end;
- 168 Chương 6. Lập trình trong Maple E. Sử dụng thủ tục max3. >max3(3, 2, 1); 3 >max3(13, 24, 18); 24 6.6. Biến cục bộ, hàm return và hàm error Để định nghĩa một thủ tục trong Maple bao gồm việc khai báo các biến cục bộ, cùng với việc thiết lập một số tùy chọn khác cùng các câu lệnh. :=proc () local ; options ; ; . . . ; end; 6.6.1. Sử dụng biến cục bộ Biến cục bộ khai báo trong thủ tục sẽ được sử dụng chỉ khi thi hành thủ tục và bị loại bỏ khi thủ tục kết thúc. Ví dụ 6.18. Xây dựng thủ tục tính tổng lập phương của n số tự nhiên liên tiếp. >sum1:=proc(n) local result, i; result:=0; for i to n do result:=result + i^3; od; result; end; >sum1(3); 36 Với mỗi thủ tục, ta có thể kiểm tra để biết được số các đối số truyền cho nó bằng việc sử dụng từ khóa nargs. Từ khóa args chứa
- 6.6. Biến cục bộ, hàm return và hàm error 169 đựng giá trị các đối số khi ta truyền vào cho hàm số. Sử dụng biến chỉ số i theo mẫu args[i ], để truy nhập và xác định giá trị từng đối số của thủ tục. Ví dụ 6.19. Thủ tục dưới đây đưa ra số lớn nhất trong dãy số đưa vào như đối số của hàm MaxN bằng cách dùng biến cục bộ và từ khóa args cho phép ta đưa vào số lượng đối số bất kỳ. A. Định nghĩa thủ tục: Khai báo biến cục bộ, kiểm tra các thông số truyền cho thủ tục có kiểu số hay không (nguyên, thực, phân số) ? Sau đó so sánh các giá trị của đối số, số nào lớn hơn được được ghi vào result. Khi duyệt hết số lượng đối số nargs thì result là giá trị lớn nhất. >MaxN:=proc() local result, i; if not(type([args],list(numeric))) then print(’Error’); elif nargs >0 then result:=args[1]; for i from 2 to nargs do if args[i] >result then result:=args[i]; fi; od; result; fi; end: B. Sử dụng thủ tục MaxN. >MaxN(3, 8, 36, 13, 42, 9); 42 >MaxN(22/13, 6, 118/3); 118/3 >MaxN( a, 27, t); Error C. MaxN sẽ không cho giá trị gì nếu không truyền thông số cho nó. >MaxN(); D. Biến cục bộ result không có giá trị ở ngoài thủ tục. >result;
- 170 Chương 6. Lập trình trong Maple 6.6.2. Sử dụng hàm return return được sử dụng khi muốn nhận lại một giá trị được tạo ra trong thủ tục sau khi thủ tục đó kết thúc. Mẫu khai báo có dạng: > return(); Cho ra một giá trị trong thủ tục. Ví dụ 6.20. Sử dụng hàm return tính đa thức Chebyshev bậc n: pn ( x ). Đa thức Chebyshev được xác định bằng công thức truy hồi p0 ( x ) = 1, p1 ( x ) = x, pn+1 ( x ) = 2xpn ( x ) − pn−1 ( x ) với mọi n ≥ 1. A. Định nghĩa thủ tục tính đa thức Chebyshev từ bậc 0 đến n, cho ra dạng bảng. Khởi động kết quả bằng hai đa thức Chebyshev đầu. Những đa thức tiếp sau tính theo công thức truy hồi. >Chebyshev:=proc (n) local p, k; p[0]:=1; p[1]:=x; if n a:=Chebyshev(5): >seq(a[i], i = 0 .. 5); 1, x, 2x2 − 1, 4x3 − 3x, 8x4 − 8x2 + 1, 16x5 − 20x3 + 5x C. Đưa ra giá trị của 6 đa thức đầu Chebyshev với x = 1/4. >x:=1/4: >seq(a[i], i = 0 .. 5); 1, 1/4, −7/8, −11/16, 17/32, 61/64 Ví dụ 6.21. Viết một thủ tục khi đưa hai số vào theo thứ tự, đầu ra là thứ tự đảo ngược: Với lệnh SWAP(x,y); cho kết quả y, x.
- 6.6. Biến cục bộ, hàm return và hàm error 171 >SWAP:=proc (x, y) local x1, y1, temp; x1:=x; y1:=y; temp:=x1; x1:=y1; y1:=temp; return(x1, y1) end: >SWAP(5, 9); 9,5 >SWAP(x, y); y, x 6.6.3. Sử dụng hàm error Để đưa ra thông báo lỗi trong thủ tục, ta sử dụng hàm error: error(); error đưa ra thông báo có dạng: Error, (in ) Kết hợp hàm error cùng với câu lệnh điều kiện if - then - else - fi và một vài từ khóa của Maple có được một mẫu chuẩn để kiểm tra kiểu của những thông số truyền cho thủ tục. Mẫu đó được viết theo mẫu sau: >if not type (argument, typename) then error(wrong type argument to, procname,:, argument, should be of type, typename); fi; Ví dụ 6.22. Thủ tục tính dãy Fibonacci.Trong thủ tục này kiểm tra tham số n. >F:=proc (n) option remember; if nargs 1 or not type(n, integer) or n < 0 then error(wrong number or ‘in‘(type of parameters, F)) else if n < 2 then n else F(n-1)+F(n-2) fi fi end: >F(10); 55 Ví dụ 6.23. A. Sử dụng error để đưa ra thông báo trong quá trình kiểm tra kiểu đối số truyền vào cho thủ tục tìm số lớn nhất của một
- 172 Chương 6. Lập trình trong Maple dãy (sửa đổi Ví dụ 6.19). >maxN:=proc () local result, i; if nargs = 0 then error(‘Khong co doi so‘) fi; if not (type([args], list(numeric))) then return(procname(args)) fi; result:=args[1]; for i from 2 to nargs do if result < args[i] then result:=args[i] fi od; result; end: B. Sử dụng thủ tục maxN >maxN(25/7, 34/16, 9/2); 9/2 >maxN(); Error, (in maxN) Khong co doi so Hàm traperror cho phép ta tránh việc ngắt hoặc dừng máy khi chương trình mắc phải lỗi. Hàm traperror được sử dụng để bắt lỗi trong khi chạy chương trình. Kiểu bắt lỗi này được sử dụng khi ta cho rằng việc tính toán có thể mắc phải lỗi và ta muốn chương trình thông báo lỗi này nếu có. Biến lasterror là ghi nhận lỗi phát sinh cuối cùng của error từ đó ta có thể dùng điều khiển chương trình. Ví dụ 6.24. Hàm traperror và lasterror. A. Hiển thị lỗi thực tế mắc phải >(1/3) mod 12; Error, the modular inverse does not exist >lasterror; the modular inverse does not exist B. Chúng ta có thể bao phủ quá trình tính toán cùng với hàm trap- error. Trong trường hợp này nhiều khi đưa ra thông báo lỗi, hoặc tính một modul ngược. >u:=traperror((1/4) mod 12); u:=the modular inverse does not exist >v: = traperror((1/5) mod 12); v := 5
- 6.6. Biến cục bộ, hàm return và hàm error 173 Ví dụ 6.25. Đặt bẫy lỗi. Thủ tục dưới đây minh hoạ cách đặt bẫy lỗi cho hàm normal.Vì hàm normal không thực hiện với số dấu chấm động, nên ta tạo ra hàm mới mynormal tốt hơn dùng với cả phân thức. >mynormal:=proc (a) local result; result:=traperror(normal(a)); if result = lasterror then if not result = floats then result:=normal(convert(a, rational, exact)) else error(result) fi else result; fi end: > mynormal((2.1+5.6*x)/(2.8+8.4*x)); 0.7142857143 Hàm error và traperror có thể được sử dụng đồng thời để thoát khỏi việc đang tính toán. Ví dụ như, trong khi tính toán giai thừa số nguyên, khi các bước hồi qui quá sâu, tới một bước nào đấy muốn thoát ra ngay ngoài. Bằng việc đặt bẫy lỗi lựa chọn, ta có thể thoát khỏi quá trình đang tính toán bằng thông báo lỗi hợp pháp. Ví dụ 6.26. Sử dụng error / traperror A. Chúng ta định nghĩa một thủ tục có đưa ra thông báo lỗi nếu giá trị nhập vào là âm. Giá trị lỗi là âm. >List:=[7, 13, -8, 2, -4, -9, 5]; List := [7, 13, −8, 2, −4, −9, 5] >err_neg:=proc(x); if xfirst_neg:=proc(a) local r; r:=traperror(map(err_neg, a)); if r = lasterror then r else 0 fi end:
- 174 Chương 6. Lập trình trong Maple >first_neg(List); −8 6.6.4. Thủ tục lồng nhau Có thể định nghĩa các thủ tục bên trong một thủ tục khác. Ví dụ sau minh họa việc định nghĩa một thủ tục g() bên trong thủ tục f(). Như vậy các câu lệnh trong f() không thể tham chiếu tới bất kỳ một biến cục bộ nào của g(). Ví dụ 6.27. Hai thủ tục f() và g() đều có một biến cục bộ cùng mang tên y nhưng giá trị của chúngkhác nhau. >f:=proc(x) local g, y; y:=x + 1; g:=proc(a); a - y end; g(x); end: >f(5); 5−y Ví dụ 6.28. Thủ tục sau gọi thủ tục trước như một phần của chương trình. Các số 1, 2, 3, ..., 2003 được viết lên bảng với thứ tự tăng dần. Bắt đầu ta xóa số thứ nhất, số thứ ba, số thứ bảy,...còn lại số 2, 3, 5, 6, 8, 9, 11, 12, 14, ... Quá trình này lặp lại lần nữa và số còn lại 3, 5, 8, 9, .... Tiếp tục quá trình này cho đến chỉ còn một số trên bảng trước khi xóa hết. Vậy số cuối cùng để xóa là số mấy? A. Trước tiên ta viết thủ tục SHRI NKLIST ( L) thể hiện sau một bước lặp. Ví dụ lần đầu tiên có L := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], khi đó SHRI NKLIST ( L) đưa ra [2, 3, 5, 6, 8, 9], nghĩa là xóa đi các phần tử của L có vị trí chia hết cho 3. Sau đây là một phương án tạo ra thủ
- 6.7. Những toán tử tính toán trong Maple 175 tục SHRI NKLIST ( L), trong thủ tục có dùng hàm nops( A) là số phần tử trong danh sách A, op( L) dãy phần tử trong danh sách L. >SHRINKLIST:=proc (A) local L, newindex, k, C; L:=[]; newindex:=1; for k to nops(A) do if mod(k, 3) 1 then C[newindex]:=A[k]; L:=[op(L), C[newindex]]; newindex:=newindex+1 fi; od; eval(L) end: >L:=[1,2,3,4,5,6,7,8,9,10]; L := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >L:=SHRINKLIST(L); L := [2, 3, 5, 6, 8, 9] B. Chương trình chính: Dùng SHRI NKLIST () lặp lại trên mảng L cho đến khi L chỉ còn 1 phần tử. SHRI NKLIST () tạo ra danh sách mới L không còn phần tử để xóa. Phần tử cuối cùng là số ta cần tìm. >COMPUTELAST:=proc (X) local Y; Y:=X; while 1 < nops(Y) do Y:=SHRINKLIST(Y) od; return(Y[1]) end: >COMPUTELAST([seq(k, k = 1 .. 2003)]); 1598 6.7. Những toán tử tính toán trong Maple Trong Maple những hàm có thể được coi như những biến, chúng ta có thể thực hiện các phép toán trên chúng và tạo ra các biểu thức hoặc tạo ra lớp hàm mới từ các hàm đã có. Maple có phép toán trên hàm để xây dựng các hàm mới từ những hàm đã có, ta gọi phép toán như vậy là toán tử. Bảng 6.1. Một số toán tử trong Maple. Toán tử Chức năng @ Toán tử hợp f@g tạo ra một hàm bằng cách hợp f và g. Như (f@g)(x) là f ( g( x ))
- 176 Chương 6. Lập trình trong Maple D (Toán tử lấy Với hàm f thì biến D ( f ) lấy đạo hàm của hàm đạo hàm riêng) số f . Với hàm có một vài biến g, D [1]( g) là hàm số, do kết quả lấy đạo hàm của g ứng với đối số thứ nhất, D [2]( g) là hàm số, do lấy đạo hàm của g với đối số thứ hai, ... @@ (Toán tử kết f@@n (với n là số nguyên không âm) là hợp nhiều lần) hàm hợp n lần hàm f . Như (f@@3)(x) là f ( f ( f ( x ))). Ví dụ 6.29. Các toán tử. A. Sử dụng toán tử D. >f:=x ->x^2: >df:=D(f); d f := x − > 2x >df(3); 6 B. Nếu đạo hàm của một hàm số không tường minh thì kết quả đưa ra là công thức đó. Ví dụ dưới đây tính đạo hàm của hàm hợp g( g( x )). >D(g@@2); D ( g)@gD ( g) C. Lấy giá trị của hàm vừa tính tại x = 1. >h:=%(1); h := D ( g)( g(1))(1) D ( g)(1)(1) >g:=log@tan + x^2; g := log@tan + x2 >h; 4 ln(tan(1)) + 4 Ta có thể định nghĩa toán tử mới bằng việc thiết lập định nghĩa thủ tục với tuỳ chọn option operator. Ví dụ sau minh hoạ cách định nghĩa một toán tử hàm.
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn