Một biến đã được gán đại diện cho gần như bất kỳ thứ gì: một con số cụ thể, một biểu thức, một hàm, một phương trình, một đồ thị, một lời giải, một biến khác v.v…Một biến đã được gán thỉ
Trang 1Các loại biến
& Việc lượng giá biểu thức trong Maple
Trang 2Nội dung chính
1.1 Các khái niệm 3
1.2 Phân loại biến 3
2 Việc lượng giá biểu thức 5 2.1 Giới thiệu chung 5
2.2 Luật Lượng giá đầy đủ 5
2.3 Cấp bậc của việc lượng giá 10
2.4 Sự trì hoãn việc lượng giá 13
3 Phụ lục 17 3.1 Giới thiệu thành viên nhóm biên soạn 17
3.2 Tài liệu tham khảo 17
3.3 Danh sách tập tin đính kèm 17
Trang 31 Các loại biến
1.1 Các khái niệm:
Tên biến : là một xâu ký tự, gồm chữ cái, chữ số, ký tự gạch dưới _
o Độ dài của tên phụ thuộc vào nền của hệ điều hành, hệ điều hành 32-bit là 524,271 ký tự, 64-bit là 34,359,738,335 ký tự
o Tên biến chỉ có thể bắt đầu bằng chữ cái hoặc ký tự _ (Lưu ý: biến có tên bắt đầu bằng ký tự _ được Maple xem là biến toàn cục)
o Có 2 loại tên biến là ký hiệu (x , y , x_y_z , hello_there…), và tên theo chỉ số (x[1] , x[2] , x[3]…)
o Maple phân biệt chữ hoa và chữ thường nên Hello khác hello
o Không được đặt tên trùng với 47 từ khóa sau đây:
Trạng thái của biến : mỗi biến trong Maple có một trong hai trạng thái:
o Đã được gán (assigned variables): mỗi biến là một cái tên đại diện cho
một giá trị nào đó Một biến đã được gán đại diện cho gần như bất kỳ thứ gì: một con số cụ thể, một biểu thức, một hàm, một phương trình, một đồ thị, một lời giải, một biến khác v.v…Một biến đã được gán thỉnh thoảng được
gọi là một biến lập trình vì cách chúng thể hiện ít nhiều gì cũng giống với
một biến lập trình truyền thống trong các ngôn ngữ lập trình Biến đã được gán cũng thỉnh thoảng được gọi là "nhãn của một kết quả" hay đơn giản là
"nhãn"
o Chưa được gán (unassigned variables): mỗi biến là một cái tên chưa đại
diện cho một giá trị đặc biệt nào Biến chưa được gán thỉnh thoảng được gọi
là "biến tự do" (free variables) chúng sẽ được tự do làm đại diện cho bất kỳ giá trị nào Hay thỉnh thoảng chúng cũng được gọi "ẩn" (unknowns) vì chúng chưa có một giá trị cụ thể Những cách gọi khác nữa là xem biến chưa được
gán như một biến toán học, một ký hiệu toán học, một ẩn toán học, một ẩn
đại số, biến vô định
Trang 4Biến trong Maple chia làm hai loại: biến toán học và biến lập trình
Biến toán học: đại diện cho một ẩn số trong toán học.
Biến lập trình: là những biến có thể gán giá trị nào đó và giá trị được lưu trữ
cho tận đến lúc nó bị thay đổi
Cách đơn giản nhất:
o Biến lập trình: biến đã được gán
o Biến toán học: biến có giá trị bằng tên biến
Sự định giá:
o Một tên được gán giá trị khác tên nó sẽ trở thành biến lập trình còn nếu chưa từng được gán giá trị thì nó sẽ nhận chính tên nó làm giá trị và được
xem như kí hiệu biểu thị ẩn số trong toán học
o Việc phân biệt một biến là biến toán học (ẩn số) hay biến lập trình là rất
quan trọng trong Maple
Ví dụ:
[> restart;
[> z := y;
y := t;
t := x^2 + 5*x - 12;
:=
z y
:=
y t
:=
t x2 5 x 12
[z, y, t là biến lập trình, x là biến toán học
[> z;
x2 5 x 12
[> y;
x2 5 x 12
[> t;
x2 5 x 12
[> x;
x
[thay x = 10, tính lại giá trị t
[> x := 10; # x trở thành biến lập trình
:=
x 10 [> t;
138 [> z;
138 [> y;
138
Trang 52 Việc lượng giá biểu thức
2.1 Giới thiệu chung
Trong phần này ta sẽ tìm hiểu một số chi tiết về quá trình xử lý bên trong của Maple Chúng ta sẽ xem xét các quy luật lượng giá đối với biến, biểu thức và hàm
2.2 Luật Lượng giá đầy đủ
Định nghĩa : Luật lượng giá là cách thức mà Maple quyết định “điều trả về".
("điều trả về" là giá trị cụ thể hoặc biến toán học)
Ví dụ, nếu p đại diện cho biểu thức x^2+2*x+1 và x đại diện cho số 3 thì chúng
ta sẽ không biết chắc Maple sẽ lượng giá p như thế nào Nếu ta hỏi ý nghĩa của p
thì Maple sẽ trả về biểu thức x^2+2*x+1 hay 3^2+2*3+1 hay 16?
Thông thường trong hầu hết các trường hợp, Maple sử dụng một luật lượng giá
gọi là Luật lượng giá đầy đủ (full evaluation)
Điều đó có nghĩa là khi Maple gặp một tên biến, nó sẽ truy ra giá trị của biến
đó (nếu có) Nếu giá trị của biến đó chứa một biến khác thì giá trị của biến khác
đó cũng sẽ được truy ra Maple sẽ tiếp tục quá trình lượng giá như thế cho đến khi tìm đến được hoặc những giá trị số cụ thể hoặc những biến toán học và gán trở lại cho biến tương ứng
Ví dụ 1:
[Trong ví dụ này, x là một biến toán học
[> x := 'x';
[Lập biểu thức y chứa biến x
[> y := 1+x;
[Gán x một giá trị số cụ thể
[> x := 5;
[Ta xem xét quá trình Maple lượng giá biểu thức [1+x^2+y [> 1+x^2+y;
32
[Đầu tiên x trong biểu thức mang giá trị là 5 vì thế biểu [thức 1+x^2+y thành 1+5^2+y y mang giá trị 1+x, vì thế [1+5^2+y thành 1+5^2+1+x, nhưng x có giá trị bằng 5 nên kết [quả cuối cùng 1+5^2+1+5=32 là kết quả của biểu thức [1+x^2+y
Trang 6Ví dụ 2:
[> x := 'x': y := 'y': z := 'z':
[Lần lượt thực hiện các phép gán trong cụm xử lý (*) sau: [> x := y;
y := z;
z := 3;
x :=
y :=
z := 3
[> x;
3
[> z := 5;
z := 5
[> x;
5
[Trong ví dụ này, x trỏ đến y, y trỏ đến z, và lúc đầu thì z
[trỏ đến 3, vì thế x (và y) mang giá trị là 3 Do đó lúc [sau z được trỏ tới 5 nên x (và y) được lượng giá là 5 (đây
[là Luật lượng giá đầy đủ) Maple truy theo hướng này cho
[tới khi nó gặp “điểm kết thúc” nghĩa là nó đến được một [trong hai trường hợp hoặc một số cụ thể hoặc một biến chưa [được khởi trị
Trang 7Ví dụ 3:
[Ta xét một ví dụ với các dòng lệnh tương tự ví dụ 2 nhưng [kết quả rất khác biệt
[> x:='x'; y:='y'; z:='z';
x := x
y :=
z :=
[Ta sẽ thay đổi trật tự của 3 dòng lệnh trong ví dụ trên ta [được 3 dòng lệnh (**):
[> z := 3;
y := z;
x := y;
z := 3
y := 3
x := 3
[> x;
3
[> z := 5;
z := 5
[> x;
3
[Trong ví dụ này, đầu tiên z gán giá trị bằng 3 Sau đó, y
[được gán bằng z, và ban đầu z được gán giá trị bằng 3 [Chính vì thế, y được gán giá trị bằng 3, không phải z (đây
[là Luật lượng giá đầy đủ) Tương tự, x được gán bằng 3, [không phải y Và vì thế trong ví dụ này, giá trị của z bị [thay đổi, giá trị của x và y không bị thay đổi
Trang 8Giải thích:
Một lý giải khá đơn giản cho sự khác biệt kết quả giữa 2 ví dụ trên là trong ví
dụ đầu thì quá trình lượng giá của Maple đã kết thúc và trong ví dụ sau thì quá trình lượng giá của Maple chưa kết thúc
Ta xét ví dụ 3 quá trình lượng giá kết thúc nghĩa là khi cụm xử lý (*) được thi hành z, y, x cùng được gián giá trị là 3 (gặp “điểm kết thúc”), vì vậy khi thay đổi giá trị của z thì chỉ đơn giản giá trị z bị thay đổi
Trong ví dụ 2, khi cụm xử lý được thi hành do thứ tự của các dòng lệnh
x:=y, y:=z, z:=3 nên khi thực hiện dòng lệnh đầu tiên Maple chỉ lượng x
giá đến được biến chưa được gán giá trị y, tương tự y chỉ được lượng giá tới z, và
z được lượng giá tới 3; tiếp tục xét, khi thực hiện lệnh x; vì x, y, z đã trở thành biến lập trình nên x được lượng giá bằng y, y được lượng giá bằng z, z được lượng giá bằng giá trị mới là 5, nên x = y = z = 5
Ghi chú: Từ 2 ví dụ trên ta thấy, trật tự của các dòng lệnh cũng ảnh hưởng đến việc
chúng được thi hành Hay nói một cách khác thì phương thức mà Maple thi hành một dòng lệnh thường không giống như cách bạn nhìn chúng độc lập nhau Chúng ta cần xem
xét qua tất cả các dòng lệnh được thi hành trước để quyết định được ý nghĩa của dòng
lệnh hiện tại
Ví dụ 4:
Ghi chú: Thông thường (không phải là luôn luôn), Maple dùng Luật lượng giá đầy đủ
cho tất cả đầu vào kể cả hàm và lệnh trong Maple
[Và đây cũng là sự lượng giá đầy đủ, ta xét hàm f
[> f := x -> x^2-1;
[Gán giá trị cho z
[> z := 3;
[Khi ta nhập dòng lệnh f(z); Maple cần lượng giá cả f và z [Đầu tiên Maple lượng giá f là một hàm, sau đó giá trị của z
[là 3, và sau đó thế giá trị của z vào hàm, tính giá trị [của hàm tại 3, và cho ra kết là 8
[> f(z);
8
Trang 9Ví dụ 5:
Bạn có thể dựa vào các ví dụ đã nêu ở trên rút ra kinh nghiệm cho mình Nếu
bạn gặp một thông báo lỗi lạ, trước tiên hãy kiểm tra tên biến bạn dùng có thật sự chưa được sử dụng và không mang giá trị nào hay không.
Ngoài ra, Maple còn có một vài quy luật lượng giá khác và tất nhiên cũng có một số ngoại lệ Trong phần còn lại, chúng ta sẽ xem xét các quy luật và các ngoại
lệ quan trọng nhất
[Một số thông báo lỗi thường gặp:
[> solve(x^2 = 4, x);
Warning, solving for expressions other than names or
functions is not recommended
Error, (in solve) a constant is invalid as a variable, 3 [Maple trước tiên lượng giá các giá trị đưa vào của câu lệnh [solve cho nên x^2=4 được lượng giá thành 9=4 (đây không [phải là lỗi sai mà chỉ là một phương trình không có nghiệm) [và x cuối được lượng giá bằng 3 Đây chính là điều mà Maple [báo lỗi (lệnh solve chỉ có thể giải phương trình tìm biến [chứ không tìm hằng số)
[> plot(x^2, x = 0 4);
Error, (in plot) invalid arguments
[Maple lượng giá các giá trị đưa vào của câu lệnh plot cho [nên x^2 được lượng giá bằng 9 (đây không phải là lỗi sai) [và x=0 4 được lượng giá thành 3=0 4 Đây là điểm vô lý và [dẫn đến thông báo lỗi
[Maple không phải lúc nào cũng dùng quy luật lượng giá đầy [đủ Câu lệnh sau đây không khác gì so với câu lệnh trước [nhưng câu lệnh này không dẫn tới thông báo lỗi dù x vẫn [mang giá trị 3
[> seq(x^2, x = 0 4);
, , , ,
0 1 4 9 16 [Cần lưu ý là x vẫn mang giá trị cụ thể
[> x;
3 [Vì Maple không dùng quy luật lượng giá đầy đủ đối với các [giá trị đưa vào trong lệnh seq
Trang 102.3 Cấp bậc của việc lượng giá
Để tìm được kết quả cuối cùng thì Maple có thể phải tìm thông qua nhiều giá trị trung gian Chúng ta có thể kiểm soát quá trình lượng giá này bằng một dạng
đặc biệt của hàm eval là eval(tên biến hoặc biểu thức, bậc lượng giá);
Xét ví dụ 1:
[> x := 'x': y := 'y': z := 'z':
[> x := y;
[> y := z;
[> z := 3;
[Nếu chúng ta lượng giá x, Maple sẽ dùng sự lượng giá đầy đủ [và trả về giá trị là 3
[> x;
3
[Nhưng để Maple đi từ x đến 3 phải trải qua các giá trị [trung gian là y và z Ở đây chúng ta xem xét các giá trị [trung giá trị trung gian và cách thức để đến được chúng
[Tên của những giá trị trung gian này là những Bậc của sự [lượng giá (levels of evaluation) và chúng ta có thể quan
[sát cụ thể từng bậc của sự lượng giá thông qua lệnh eval
[nêu trên
[> eval( x, 1 );
[> eval( x, 2 );
[> eval( x, 3 );
3 [> eval( x, 4 );
3
[Trong ví dụ này ta cần quan tâm ta có thể gọi hàm eval trả [về bậc 4 của sự lượng giá, nhưng bậc cao nhất là bậc 3 nên [giá trị trả về cũng chỉ là 3
Trang 11Ví dụ 2:
[> unassign('x','y','z'); # lúc này x,y,z là biến toán học
[Ta thực hiện khối lệnh (*) sau:
[> f := a*x+b*y;
[> x := y;
[> y := z;
[> z := 2;
[> b := c;
[> c := a;
[> a := d;
f := d x C d
x :=
y :=
z := 2
b :=
c :=
a :=
[Điều đáng quan tâm ở đây là khi thực hiện cụm xử lý
[thì f := d x C d , vì trong cụm xử lý thì chỉ có d là biến [toán học, trước khi thực hiện dòng lệnh gán x := y, y := z,
[z := 2; x , y , z là biến toán học nhưng sau đó là biến lập [trình (điều này giải thích tại sao khi thực hiện lại khối [lệnh (*) mà không thực hiện lại unassign('x','y','z') thì [
f := 4 ),các biến còn lại là biến lập trình Nên Maple
[lượng giá đầy đủ f và kết quả như đã thấy Như vậy, các [phép lấy bậc của sự lượng giá sẽ cho kết quả:
[> eval( f, 1 );
d x C d
[> eval( f, 2 );
[> eval( f, 3 );
Trang 12Những bậc của sự lượng giá không hoạt động đối với một số hàm
Ví dụ 3:
[> g := u*sin(u+v);
[> u := s;
[> v := t;
[> s := t;
[> t := Pi/4;
g := u sin(u C v )
u := s
v := t
s := t
t := 1
4 p [Bây giờ ta lượng giá g
[> eval( g, 1 );
u sin(u C v )
[> eval( g, 2 );
s sin(u C v )
[> eval( g, 3 );
t sin(u C v )
[> eval( g, 4 );
1
4 p sin(u C v ) [> eval( g, 5 );
1
4 p sin(u C v ) [Như vậy, luật lượng giá không ảnh hưởng trong hàm sin Tuy [nhiên, nếu ta dùng hàm eval mà không cho tham số bậc thì g
[vẫn bị lượng giá đầy đủ
[> eval( g );
1
4 p
Trang 132.4 Sự trì hoãn việc lượng giá
Trong một vài trường hợp chúng ta cần trì hoãn sự lượng giá một biểu thức
hoặc một biến trong Maple
Ta có thể trì hoãn sự lượng giá bằng cách đặt các biến hoặc biểu thức trong cặp
dấu nháy đơn ''
Luật lượng giá cho biểu thức có dấu nháy đơn: Theo nguyên tắc, bất cứ khi nào Maple duyệt qua biến hoặc biểu thức đặt trong dấu nháy đơn, Maple sẽ loại bỏ cặp dấu nháy đơn và không lượng giá biến hoặc biểu thức đặt trong dấu nháy đơn
đó
Ví dụ 1:
Ghi chú: Một cặp dấu nháy đơn chỉ ngăn cản lượng giá x trong một câu lệnh
Vì vậy, mà chúng ta cần xem xét kỹ dòng lệnh mà Maple xuất ra sau khi nhấn enter Ở trường hợp này, trong dòng lệnh (*)x không bị bao bọc bởi dấu nháy Vì vậy, trong các dòng lệnh tiếp theo, khi đề cập đến y, Maple sẽ thực hiện sự lượng giá đầy đủ và xuất ra giá trị y bằng 6 Như vậy, sự lượng giá x chỉ bị ngăn cản trong câu lệnh định nghĩa y
[> x := 3; # x mang một giá trị cụ thể
[Trong dòng lệnh tiếp theo, Maple sẽ lượng giá x, và theo [luật lượng giá đầy đủ thì sau dòng lệnh bên dưới y mang giá [trị là 6
[> y := x + 3;
y := 6
[Nhưng chúng ta muốn rằng giá trị của y đơn thuần là x+3 [Chúng ta có thể làm điều này thông qua cặp dấu nháy đơn bọc [quanh x để ngăn cản sự lượng giá lên biến x, ví dụ như [trong dòng lệnh dưới đây thì x không được lượng giá
[> y := 'x' + 3;
y := x C 3
(*)
[> y;
6
[Lượng giá bậc một y thì y mang giá trị là x+3(theo dòng
Trang 14Ví dụ 2:
Ví dụ 3:
[> x := 3;
:=
x 3 [> 'x' = x;
x 3
[> %;
3 3
[> y := 3;
y := 3
[> x := '''y''';
x := ' 'y ' '
[> eval( x, 1 );
' 'y ' '
[> eval( x, 2 );
'y '
[> eval( x, 3 );
[> eval( x, 4 );
3
[> x;
'y '
[> eval( x );
Trang 15 Ghi chú:
Trong ví dụ trên thì đáng quan tâm là dòng lệnh biểu thức x và eval(x)
Khi Maple được yêu cầu lượng giá x, nó bắt đầu gán x bằng ''y'' Theo luật lượng giá cho biểu thức có dấu nháy đơn, Maple sẽ tự động loại bỏ một cặp dấu nháy đơn và thoát ra khỏi sự lượng giá, và kết quả cuối cùng là 'y'
Khi Maple được yêu cầu lượng giá biểu thức eval(x).Đầu tiên, Maple cần lượng giá đối số của lệnh eval Maple lượng giá x là 'y' Sau đó, giá trị của đối số được đưa tới eval, Maple gọi eval đối số này, vì thế Maple gọi
eval('y') Nhưng eval lại áp dụng luật lượng giá cho biểu thức có dấu nháy đơn ở bên trên và vì thế nó loại bỏ cặp dấu nháy đơn của'y' đưa ra kết quả cuối cùng là y
Dấu nháy đơn không ngăn chặn việc tự động thu gọn biểu thức của Maple.
Ví dụ 4:
Sau đây trình bày cách sử dụng dấu nháy đơn để định nghĩa y dưới dạng một phương trình bình thường mà không phải lo lắng về các tên biến a,b,c,x có mang giá trị nào không
Ví dụ 5:
Tiếp theo là các ví dụ khác để giúp ta hình dung rõ hơn về tác dụng của dấu nháy đơn
[> y := 'a'*'x'^2+'b'*'x'+'c'=0;
y := a x2C b x C c = 0
[Cách khác
[> y:='a*x^2+b*x+c=0';
y := a x2C b x C c = 0
[> u := 5:
[> 'u + u';
2 u
[> %;
10
Trang 16Ví dụ 6:
[> x := 5;
[> plot(x^2, x=-5 5);
:=
x 5 Error, (in plot) invalid arguments
[Trong câu lệnh trên x với vai trò là tham số của lệnh plot
[được lượng giá thành plot(5^2, 5=-5 5) Chính điểm vô lý [5=-5 5 đã gây ra thông báo lỗi trên
[> plot(x^2, 'x'=-5 5);
[Lần này thì x trong tham số đầu được lượng giá thành [5^2=25, x trong tham số sau sẽ được lượng giá theo quy luật [lượng giá biểu thức chứa dấu nháy đơn thành x=-5 5 Vì [vậy, đồ thị là một đường thẳng
[> plot('x'^2, 'x'=-5 5);
[Tương tự như trên các tham số trong lệnh plot được lượng [giá thành plot(x^2,x=-5 5) nên đồ thị là một parpbol
[> plot('x'^2, x=-5 5);
Error, (in plot) invalid arguments
[Chính điểm vô lý trong biểu thức 5=-5 5 sau khi lượng giá