Ở phương diện này , có thể xem Maple như là một ngôn ngữ lập trình trong đó chúng ta có thể tạo ra những chương trình và những gói package để tái sử dụng.. Một tính năng rất hay và cũng
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
CHƯƠNG TRÌNH ĐÀO TẠO THẠC SĨ CNTT QUA MẠNG
- -
TÌM HIỂU LẬP TRÌNH SYBOLIC XÂY DỰNG ỨNG DỤNG DEMO
Giải Và Biện Luận Phương Trình Bậc 2
Theo Tham Số m
Bộ môn : Lập trình Symbolic
GVHD : PGS-TS Đỗ Văn Nhơn Thực hiện : Nguyễn Khánh Ngọc
CH1001117
Thành phố Hồ Chí Minh - Tháng 1 Năm 2012
Trang 2NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Trang 3
MỤC LỤC
Phần I: Giới Thiệu Lập Trình Symbolic
I Đặt vấn đề 1
II Giới thiệu về Maple 2
III Lập trình trong Maple 4
Phần II: Giải Và Biện Luận Phương Trình Bậc 2 Theo Tham Số m I Giải phương trình bậc 2 6
II Biện luận phương trình bậc 2 theo m 9
III Kết nối C# với Maple 14
1 Kết nối với Maple 14
2 Giao diện thực hiện chương trình trên C# 16
Phần 3: Kết luận Tài liệu tham khảo 21
Trang 4Phần I: Giới Thiệu Lập Trình Symbolic
I Đặt vấn đề
Hiện nay các ngôn ngữ lập trình như C#, C++, java hay các ngôn ngữ lập trình
cấp cao khác là những ngôn ngữ đang rất thịnh hành và được lựa chọn là ngôn ngữ
phát triển cho nhiều phần mềm mới Chúng được coi là những ngôn ngữ có tính biểu
đạt cao, an toàn, thời gian phát triển nhanh, do đó làm giảm rất nhiều đi chi phí bảo trì,
phát triển phần mềm Ngôn ngữ cấp cao gần gũi hơn với ý niệm ngôn ngữ mà hầu hết
mọi người đều biết, nó bao gồm các danh từ, động từ, liên hệ và các thao tác luận lý
Các yếu tố này có thể được phối hợp, liên kết với nhau tạo thành một hình thức của
câu Các câu này được gọi là các mệnh đề của chương trình (program statement)
Chính vì những đặc điểm này, các lập trình viên dễ dàng đọc và dễ học ngôn ngữ cấp
cao hơn so với ngôn ngữ máy hoặc hợp ngữ
Nhưng hầu hết các ngôn ngữ lập trình này đều không hỗ trợ hoặc hỗ trợ rất hạn chế
lập trình tính toán hình thức, không hỗ trợ cấu trúc dữ liệu để diễn đạt các định lý,
công thức toán học, ngoài ra các ngôn ngữ lập trình này rất kém về việc tính toán chính
xác Vì vậy việc ra đời những công cụ lập trình như Maple,Matlab, Mathematica … đã
khắc phục được nhược điểm của các ngôn ngữ lập trình hiện nay
Trong đó Maple là phần mềm của hãng Waterloo Đây là một công cụ tuyệt vời hỗ
trợ cho việc học tập và nghiên cứu toán học
Không chỉ dừng lại ở việc hỗ trợ tính toán, bắt đầu từ Maple 10.0 trở đi, còn có khả
năng lập trình Ở phương diện này , có thể xem Maple như là một ngôn ngữ lập trình
trong đó chúng ta có thể tạo ra những chương trình và những gói (package) để tái sử
dụng
Một tính năng rất hay và cũng rất nổi bật là Maple có thể hợp tác với một ngôn ngữ
chủ (host language) như VB6.0,VB.Net, Java Khả năng đặc biệt này của Maple giúp
chúng ta thực hiện được những phần mềm (tính tóan , hỗ trợ dạy/học tóan ) đuợc viết
mã bằng ngôn ngữ chủ và liên kết với Maple để thực hiện các tác vụ tóan học phức tạp
mà đòi hỏi rất nhiều kĩ năng lập trình
Tuy nhiên các công cụ Maple,Matlab, Mathematica … mạnh về tính toán hình thức,
nhưng chúng lại có nhược điểm về xử lý giao diện Như vậy chúng ta có thể kết hợp
các ngôn ngữ lập trình cấp cao hiện nay như C#, VB.NET, Java để xử lý trên giao diện,
còn các xử lý về tính toán phức tạp, sẽ chuyển qua cho Maple xử lý, kết quả trả về sẽ
được C# tiếp nhận và xử lý hiển thị ra giao diện Đây cũng là mục tiêu nghiên cứu của
bài tiểu luận này
Bài tiểu luận sẽ minh họa quá trình kết nối và làm việc giữa C# và Maple để giải
quyết bài toán “Giải Và Biện Luận Phương Trình Bậc 2 Theo Tham Số m”
Trang 5II Giới thiệu về Maple
Maple là một ngôn ngữ hỗ trợ mô phỏng toán học Kiểu tính toán của Maple được
biết dưới nhiều tên khác nhau như : Algebraic manipulation, Symbolic computation,
Computer algebra … Đặc điểm cơ bản của một ngôn ngữ như thế là nó có khả năng,
một cách ẩn hoặc hiện, tiến hành các tính toán mà các phần tử không nhất thiết phải
được gán giá trị Một đặc điểm khác là nó có khả năng hình thành các phép đơn giản,
rút gọn các biểu thức, và các phép biến đổi khác, thực hiện trên các phần tử chưa được
Ai đã từng quen với các ngôn ngữ lập trình truyền thống như Fortran, Pascal, C …
sẽ thấy rằng các ký hiệu trong ví dụ trên được dùng cho hai mục đích khác nhau : ký
hiệu f được dùng như một biến, nó được gán một giá trị, các ký hiệu x, y được dùng
như các ẩn, chưa có giá trị
Trong Maple, các câu lệnh thường được gán giá trị càng về sau nếu có thể, chẳng
sẽ làm cho x có giá trị 0 , và giá trị 0 này sẽ được gán vào biểu thức của f (lưu ý rằng
sin(0) được tự động “rút gọn” là 0 ) Và nếu như tiếp theo ta lại thực hiện câu lệnh :
b:=0 ;
g:=sin(x) ;
khi đó giá trị x sẽ là 1 và sin(1) sẽ được gán cho g (Lưu ý rằng sin(1) được xem như
một ký hiệu (symbol) hình thức, và không tự động được tính giá trị, tuy vậy ta có thể
tính giá trị số của nó dể dàng bằng lệnh evalf)
1.1 Các tính năng cơ bản của Maple
Có thể nêu vắn tắt các chức năng cơ bản của Maple như sau:
Là một hệ thống tính toán trên các biểu thức đại số;
Trang 6 Có thể thực hiệc được hầu hết các phép toán cơ bản trong chương trình toán đại
học và phổ thông;
Cung cấp các công cụ minh họa hình học thuận tiện gồm: vẽ đồ thị tĩnh và động
của các đường và mặt được cho bởi các hàm tùy ý trong nhiều hệ tọa độ khác
nhau;
Một ngôn ngữ lập trình đơn giản và mạnh mẽ có khả năng tương tác với các
ngôn ngữ lập trình khác;
Cho phép trích xuất ra các định dạng khác nhau như LaTex, Word, HTML,
Một công cụ biên soạn giáo án và bài giảng điện tử, thích hợp với các lớp học
tương tác trực tiếp; một trợ giáo hữu ích cho học sinh và sinh viên trong việc tự
học
1.2 Cấu trúc và giao diện
Cấu trúc tài nguyên của Maple
Khi hởi động Maple , chương trình chỉ tự động kích hoạt nhân của Maple bao
gồm các phép toán và chức năng cơ bản nhất Phần nhân chiếm khoảng 10%
dung lượng của toàn chương trình
Các dữ liệu và chương trình còn lại của Maple được lưu giữ trong thư viện
Maple và được chia ra 2 nhóm: nhóm các lệnh cơ bản và nhóm các gói lệnh
Maple 9.0 có khoảng 85 gói lệnh Gói lệnh có thể nạp vào bằng:
> with(plots):
Lệnh của Maple
Lệnh được gõ vào trang làm việc ( worksheet) tại dấu nhắc lệnh " >" và theo
ngầm định được hiển thị bằng font Courier màu đỏ Một lệnh đựợc kết thúc bởi
dấu " :" hoặc dấu ";" và được ra lệnh thực hiện bằng việc nhấn Enter khi con trỏ
đang ở trên dòng lệnh
> factor(2*x^102+x^100 -2*x^3-x+60*x^2+30):
Kết quả của lệnh được hiển thị ngay bên dưới dòng lệnh nếu dùng dấu " ;" Có
thể dễ dàng dùng chuột và bàn phím để thực hiện các chức năng bôi đen, copy,
paste, cut, delete đối với dữ liệu trên dòng lệnh hay kết quả thực hiện
Sử dụng dịch vụ trợ giúp ( Help) trong Maple Maple có dịch vụ trợ giúp khá đầy đủ
và thuận lợi bao gồm cú pháp, giải thích cách dùng vàcác ví dụ đi kèm Để nhận được
trợ giúp, có thể:
Nếu đã biết tên lệnh thì từ dấu nhắc gõ vào
> ?factor
Trang 7 Nếu dùng một gói lệnh thì khi nạp gói lệnh, Maple sẽ hiển thị toàn bộ lệnh trong
gói đó
Một cách thông dụng nữa là dùng trình Help|Topic Search rồi gõ vào từ khóa
cần tìm
1.3 Lưu giữ và trích xuất dữ liệu
Trang làm việc của Maple sẽ được lưu giữ bằng file có đuôi ".mws" File được lưu
giữ bằng trình File|Save Một file đã có được mở bằng File|Open
Ngoài việc lưu giữ bằng định dạng của Maple như trên, dữ liệu có thể được trích
xuất thành các định dạng khác như Word, LaTex hay HTML Tr ích xuất bằng
File|Export
1.4 Các môi trường làm việc trong Maple
Maple có 2 môi trường làm việc là toán và văn bản Sau khi khởi động, Maple tự
động bật môi trường toán Muốn chuyển sang môi trường văn bản, kích chuột vào biểu
tượng T trên thanh công cụ hay vào trình Insert->Text Ngược lại, từ môi trường văn
bản, kích chuột vào dấu "[>" trên thanh công cụ hay vào Insert để chuyển sang môi
trường toán
> ifactor(58600);
III Lập trình trong Maple
Một vấn đề quan trọng nhất của hệ Maple là ngôn ngữ lập trình Maple, được dùng
để tạo ra các chương trình con, các hàm, thủ tục và các thư viện riêng (Packages)
Lưu ý:
Các chương trình viết bằng Maple có thể được soạn thảo bằng các trình soạn thảo
text khác hoặc Maple text, nhưng nếu được viết ngay trong Maple thì sau khi đánh
xong một dòng lệnh, hãy nhấn phím SHIFT+ENTER, khi đó máy sẽ không thực hiện
lệnh này mà chỉ đưa con trỏ xuống hành dưới và hiện dấu nhắc để ta viết lệnh tiếp theo
… Sau khi viết xong tất cả các lệnh cần thiết, ta nhấn ENTER, thì tất cả các lệnh trên
sẽ được thực hiện tuần tự từ trên xuống Nếu đoạn chương trình này là một thủ tục
(procedure) hay một hàm (function), thì ta có thể xử dụng liền tiếp theo Muốn lưu lại
đoạn chương trình này, ta dùnh lệnh save ngay sau khi kết thúc đoạn chương trình,
chẳng hạn muốn lưu dưới tên : vidu trong thư mục e:\maplev3\khoai ta dùng
save ` e:/maplev3/khoai/vidu `
hoặc save ` e:/maplev3/khoai/vidu.m `
và một khi muốn kêu đoạn chương trình (thủ tục, hàm) này vào xử dụng, ta dùng
lệnh :
read ` e:/maplev3/khoai/vidu `
Trang 8hoặc read ` e:/maplev3/khoai/vidu.m `
Chú ý rằng:
Tên tập tin dạng *.m sẽ tự động được lưu ở dạng mã riêng của Maple không thể
xem được bằng các trình soạn thảo thông thường, và khi được gọi lại, (bằng lệnh
read), nội dung sẽ không được hiện thị lại khi gọi , nhưng dĩ nhiên ta có thể xử dụng
chương trình (thủ tục, hàm) đó Với các tập tin đã lưu dạng không có phần mở rộng là
.m, khi gọi lại , nội dung sẽ được hiện thị lại
Trang 9Phần II: Giải Và Biện Luận Phương Trình Bậc 2 Theo Tham Số m
I Giải Phương Trình Bậc 2
Dạng tổng quát của phương trình bậc hai một ẩn là:
𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 trong đó a ≠ 0, các số a, b và c là các hằng số (thực hoặc phức) được gọi là các hệ số: a
là hệ số của x², b là hệ số của x và c là hằng số hay số hạng tự do
Khi xét trên trường số thực, nghĩa là chỉ tìm các giá trị thực thỏa mãn phương trình,
phương trình có thể có hai nghiệm khác nhau (còn nói là hai nghiệm phân biệt), hai
nghiệm bằng nhau (có nghiệm kép hoặc nghiệm bội hai) hoặc không có nghiệm (vô
nghiệm)
Ta sử dụng các hàm trong Maple để giải quyết vấn đề về giải phương trình
Thuật giải:
1 Nhận vào phương bậc 2
2 Phân tích phương trình bậc 2 để lấy ra các hệ số a, b, c
3 Nếu a = 0 không xét vì không còn là phương trình bậc 2
4 Ngược lại nếu a # 0
delta = b*b - 4*a*c
- Nếu delta < 0 thì phương trình vô nghiệm
- Ngược lại nếu delta = 0 thì Phương trình có nghiệm kép: x1 = x2 = -b/2a
- Ngược lại nếu delta > 0 thì phương trình có hai nghiệm phân biệt:
Trang 10c := simplify(tam - a*bien^2 - b*bien);
delta := b^2-4*a*c;
return a,b,c,delta;
end proc:
Hàm LayHeSo sẽ trả về hệ số a,b,c và delta
2 Xây dựng thủ tục giải phương trình bậc 2
print("Delta <0, Phuong trinh vo nghiem\n");
elif (delta =0) then
printf("Delta=0 Phuong trinh co nghiem kep:\n");
Trang 11Hình minh họa giải và tìm nghiệm của phương trình bậc 2
Trang 12II Biện luận phương trình bậc 2 theo m
Thuật giải tương tự như giải phương trình nhưng phức tạp hơn ở phần xét Delta, bởi vì
Delta cũng là một phương trình theo m, nên ta phải xét dấu Delta
Thuật giải:
1 Nhận vào phương bậc 2
2 Phân tích phương trình bậc 2 để lấy ra các hệ số a, b, c
3 Nếu a = 0 không xét vì không còn là phương trình bậc 2
4 Ngược lại nếu a # 0
delta = b*b - 4*a*c
Trường hợp đặc biệt : biểu thức delta = b*b - 4*a*c theo m vô nghiệm
- Xét delta > 0 với mọi m thì phương trình 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 luôn có 2
nghiệm phân biệt
- Xét delta < 0 với mọi m thì phương trình 𝑎𝑥2 + 𝑏𝑥 + 𝑐 = 0 vô nghiệm
Trường hợp bình thường: biểu thức delta = b*b - 4*a*c theo m có nghiệm
Trang 131 Xây dựng thủ tục TimNghiemThuc := proc(expr)
Với tham số expr là một phương trình theo biến m, đây là biểu thức của Delta
Bởi vì với expr là phương trình bậc 2 theo m thì hàm solve(expr) của Maple sẽ trả
về nghiệm của phương trình bậc 2 này, hàm solve(expr) sẽ trả về nghiệm ảo nếu
phương trình vô nghiệm Vì vậy thủ tục TimNgiemThuc sẽ có nhiệm vụ loại bỏ các
nghiệm ảo, thông qua hàm SearchText, nếu nghiệm đó có chứa “I” thì đó là nghiệm
ảo, chúng ta sẽ loại bỏ nghiệm ảo này
2 Biện luận phương trình bậc 2 theo m
Trang 14if(not type(a,'numeric')) then
# Neu bieu thuc theo delta vo nghiem -> delta > 0 voi moi m
# Hoac delta<0 voi moi m
if( nops(nghiemDelta)=0) then
#the so vao tinh xem delta dương hay âm
# The m = 0
giatriDelta := subs({m=0},delta);
if(giatriDelta < 0) then #delta >0 voi moi m
printf("Phuong trinh vo nghiem voi moi m \n");
else
print(Delta=simplify(delta));
printf("Delta >0 voi moi m \n");
printf("Phuong trinh co 2 nghiem voi moi m: \n");
printf("Voi m = %a thi Delta=0 => Phuong trinh co
nghiem kep\n", i);
# xet dau tam thuc bac 2
# neu truong hop nghiem cua delta la nghiệm đơn (nghiệm
Trang 15giatritamthucphai := subs({m=tempPhai},delta);
giatritamthuctrai := subs({m=tempTrai},delta);
if(giatritamthucphai >0 and giatritamthuctrai>0) then
printf("m != %a thi Delta>0 => phuong trinh co 2 nghiem phan biet\n",bienM);
delta = simplify(delta):
sqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
elif (giatritamthucphai<0 and giatritamthuctrai<0) then
printf("m != %a thi Delta < 0 => phuong trinh vo nghiem \n",m);
elif (giatritamthucphai >0 and giatritamthuctrai<0) then
printf("m < %a thi Delta < 0 => phuong trinh vo nghiem \n",m);
printf("m > %a thi Delta > 0 =>phuong trinh co 2 nghiem phan biệt\n",bienM);
delta = simplify(delta):
sqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
elif (giatritamthucphai <0 and giatritamthuctrai>0) then
printf("m > %a thi Delta<0 => phuong trinh vo nghiem \n",m);
printf("m < %a thi Delta>0=> phuong trinh co 2 nghiem phan biet\n",bienM);
delta = simplify(delta):
sqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
printf("m != %a thi Delta > 0 => phuong trinh co
2 nghiem phan biet\n",m1);
Trang 16
sqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
else
printf("Voi m < %a hoac m > %a phuong trinh co 2
nghiem phan biet\n",m1,m2);
sqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
print(Delta=simplify(delta),bien=(-b-printf("Voi %a < m < %a phuong trinh vo
Trang 17Ảnh minh họa chạy chương trình giải và biện luận pt bậc 2 tren Maple
III Kết nối C# với Maple
1 Kết nối với Maple
Trong C#, xây dựng lớp Maple và MapleEngine để kết nối đến Maple, và gọi các
hàm của Maple chạy
Để kết nối với Maple chúng ta cần sử dụng component của Maple là
maplec.dll
C# sẽ nhận kết quả trả về và hiển thị lên giao diện và sử dụng component
mintext.dll để đọc chuỗi Latex của công thức toán học, và hiển thị chúng trên
giao diện