Tải bản đầy đủ (.pdf) (24 trang)

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ạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.24 MB, 24 trang )

ĐẠ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


NHẬN XÉT CỦA GIẢNG VIÊN HƢỚNG DẪN

.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................


.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................
.......................................................................................................................


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


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117


Phầ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 1


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

II. 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
gán giá trị. Chẳng hạn,
> f:=x^3-y^3 ;
𝑓 ≔ 𝑥3 − 𝑦3
> factor(f) ;
𝑓 ≔ 𝑥 − 𝑦 (𝑥 2 + 𝑥𝑦 + 𝑦 2 )
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
hạn, câu lệnh :
a:=1 ;
gán giá trị 1 cho a . Nếu câu lệnh tiếp theo sau là :
x:= a + b ;
thì giá trị 1+b được gán cho tên x, và nếu tiếp theo là :
b:=-1 ;
f:= sin(x) ;
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 2


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

 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 3


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

 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 4


GVHD: PGS.Ts Đỗ Văn Nhơn

hoặc

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

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 5


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

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
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:

 𝑥1 =

−𝑏− ∆

 𝑥2 =

−𝑏+ ∆

2𝑎

2𝑎

Cài đặt:
1. Xây dựng thủ tục LayHeSo := proc(expr,bien) với 2 tham số:
 expr: tam thức bậc 2
 bien: tên biến của tam thức bậc 2
LayHeSo := proc(expr,bien)
local tam,a,b,c,delta;
tam := op(1,expr)-op(2,expr);
a := coeff(tam,bien^2);
b := coeff(tam,bien^1);
Trang 6



GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

c := 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
GiaiPtSo := proc(A,B,C,delta,bien)
if(A <> 0) then
printf("Tinh Delta:\n");
print(`b^2 - 4*a*c`=B^2 - 4*A*C);
if (delta < 0) then
print("Delta <0, Phuong trinh vo nghiem\n");
elif (delta =0) then
printf("Delta=0 Phuong trinh co nghiem kep:\n");
print(bien = -b/(2*a) );
else
printf("Delta>0 Phuong trinh co 2 nghiem\n");
print(bien=(-b + sqrt(Delta))/(2*a),bien=(-B +
sqrt(delta))/(2*A),bien =(-b- sqrt(Delta))/(2*a),
bien=(-B - sqrt(delta))/(2*A));
end if;
KhaoSatHamSo(A,B,C,bien);

else
printf("Day khong phai la phuong trinh bac 2");
end if;
end proc:

Trang 7


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

Hình minh họa giải và tìm nghiệm của phương trình bậc 2
3. Khảo sát hàm số bậc 2
KhaoSatHamSo := proc(a,b,c,bien)
local expr,dh1,nghiem;
expr := a*bien^2 + b*bien + c;
dh1 := diff(expr,bien);
nghiem := solve(dh1=0,bien);
if(a>0) then
printf("Ham so nghich bien tren khoang:\n"):
printf("(-infinity,%a)\n",nghiem);
printf("Ham so dong bien tren khoang:\n");
printf("(%a,infinity)\n",nghiem);
printf("Ham so dat cuc tieu tai:\n");
printf("%a(%a,%a)",bien,nghiem,(subs({bien=nghiem},expr)));

else
printf("Ham so đong bien tren khoang:\n");

Trang 8


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

printf("(%a,infinity)\n",nghiem);
printf("Ham so dong bien tren khoang:\n");
printf("(-infinity,%a)",nghiem);
printf("Ham so dat cuc dai tai:\n");
printf("%a(%a,%a)",bien,nghiem,(subs({bien=nghiem},expr)));

end if;
end proc:

Thủ tục KhaoSatHamSo thực hiện kiểm tra và tính toán các khoảng đồng biến và
nghịch biến của hàm số

II. 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
Xét dấu Delta
- Nếu delta < 0 thì phương trình vô nghiệm
Giải bất phương trình 𝑏2 − 4𝑎𝑐 < 0 𝑡ℎ𝑒𝑜 𝑏𝑖ế𝑛 𝑚
Kết luận với m thuộc khoảng nghiệm của bất phương trình trên thì pt
𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0 vô nghiệm
- Ngược lại nếu delta = 0 thì Phương trình có nghiệm kép:
Giải phương trình 𝑏2 − 4𝑎𝑐 = 0 𝑡ℎ𝑒𝑜 𝑏𝑖ế𝑛 𝑚
Sau khi tìm được m, thế m vào phương trình 𝑏2 − 4𝑎𝑐 để tính nghiệm
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 9


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

Giải bất phương trình 𝑏2 − 4𝑎𝑐 > 0 𝑡ℎ𝑒𝑜 𝑏𝑖ế𝑛 𝑚
Kết luận với m thuộc khoảng nghiệm của bất phương trình trên thì phương
trình
𝑎𝑥 2 + 𝑏𝑥 + 𝑐 = 0
Có 2 nghiệm phân biệt

 𝑥1 =


−𝑏− ∆

 𝑥2 =

−𝑏+ ∆

2𝑎

2𝑎

theo m
theo m

Cài đặt
1. 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.
TimNghiemThuc := proc(expr)
local Kq,Nghiem, temp,t;
Nghiem := {solve(expr)};
Kq := {};
for temp in Nghiem do
t := convert(temp, string);
if SearchText("I", t) = 0 and SearchText("RootOf", t) = 0
then
# them nghiem vao Kq
Kq := {temp, op(Kq)};
end if;
end do;
return Kq;
end proc:


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
BienLuanPt := proc(a,b,c,delta,bien)
Local nghiemDelta, i, giatriDelta, nghiemPtTheom,temp, bienM,
giatritamthuc;
Local m1,m2,tempPhai,tempTrai, giatritamthucphai, tapxacdinh,
giatritamthuctrai;
nghiemDelta := TimNghiemThuc(delta);
Trang 10


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

if(not type(a,'numeric')) then
# Tập xác định
printf("Dieu kien đe phuong trinh tren la phuong trinh bac
2:\n");
tapxacdinh := {solve(a=0,m)};
printf("%a != 0 => m != %a\n",a,op(1,tapxacdinh));
end if;
# 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");
print(bien=(-b-sqrt(delta))/(2*a),
bien=(-b+sqrt(delta))/(2*a));
end if;
else #delta co nghiem
# print(Delta=simplify(delta));
for i in nghiemDelta do
printf("Voi m = %a thi Delta=0 => Phuong trinh co
nghiem kep\n", i);
giatriDelta := subs({m=i},delta):
nghiemPtTheom := simplify((-b)/(2*a)):
print(bien=nghiemPtTheom);
printf("The m = %a vao\n",i);
print(bien =subs({m=i},nghiemPtTheom));
end do;
# xet dau tam thuc bac 2
# neu truong hop nghiem cua delta la nghiệm đơn (nghiệm
của pt bậc 1)
if(nops(nghiemDelta)=1) then
#co the la nghiem kép, hoac la 1 nghiem đơn, neu đay

la pt bac 1
bienM := op(1,nghiemDelta);
#dung de xet dau tam thuc ben phải nghiem M
tempPhai := bienM+1;
#dung de xet dau tam thuc ben trái nghiem M
tempTrai := bienM-1;
Trang 11


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

giatritamthucphai := 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):
print(Delta=simplify(delta),bien=(-bsqrt(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):

print(Delta=simplify(delta),bien=(-bsqrt(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):
print(Delta=simplify(delta),bien=(-bsqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
end if;
else #bieu thu delta la tam thuc bac 2, co 2 nghiem phan biet
# Sap xep cac nghiem theo thu tu nho den lon
nghiemDelta := sort(nghiemDelta);
m1 := op(1,nghiemDelta);
m2 := op(2,nghiemDelta);
if(nghiem1 = nghiem2) then #nghiem kep
temp := m1+1;
giatritamthuc := subs({m=temp},delta);
if(giatritamthuc>0) then
printf("m != %a thi Delta > 0 => phuong trinh co
2 nghiem phan biet\n",m1);

Trang 12


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

print(Delta=simplify(delta),bien=(-bsqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));

else
printf("m != %a thi Delta > 0 => phuong trinh vo
nghiem\n",m1);
end if;
else # 2nghiem phan biệt
temp := (m1+m2)/2;
giatritamthuc := subs({m=temp},delta);
if(giatritamthuc>0) then
printf("Voi m < %a hoac m > %a phuong trinh vo
nghiem\n",m1,m2);
printf("Voi %a < m < %a phuong trinh co 2 nghiem
phan biet\n",m1,m2);
print(Delta=simplify(delta),bien=(-bsqrt(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);
print(Delta=simplify(delta),bien=(-bsqrt(delta))/(2*a),bien=(-b+sqrt(delta))/(2*a));
printf("Voi %a < m < %a phuong trinh vo
nghiem\n",m1,m2);
end if;
end if;
end if;
end if;
end proc:

Trang 13


GVHD: PGS.Ts Đỗ Văn Nhơn


Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

Ả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

Trang 14


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

static class MapleEngine
{
public delegate void TextCallBack(IntPtr data, int tag, IntPtr output);
public delegate void ErrorCallBack(IntPtr data, IntPtr offset, IntPtr msg);
public delegate void StatusCallBack(IntPtr data, IntPtr used, IntPtr alloc,
double time);

public delegate IntPtr ReadLineCallBack(IntPtr data, IntPtr debug);
public delegate long RedirectCallBack(IntPtr data, IntPtr name, IntPtr mode);
public delegate IntPtr StreamCallBack(IntPtr data, IntPtr stream, int nargs,
IntPtr args);
public delegate long QueryInterrupt(IntPtr data);
public delegate IntPtr CallBackCallBack(IntPtr data, IntPtr output);
public struct MapleCallbacks
{
public TextCallBack textCallBack;
public ErrorCallBack errorCallBack;
public StatusCallBack statusCallBack;
public ReadLineCallBack readlineCallBack;
public RedirectCallBack redirectCallBack;
public StreamCallBack streamCallBack;
public QueryInterrupt queryInterrupt;
public CallBackCallBack callbackCallBack;
}
[DllImport(@"maplec.dll")]
public static extern IntPtr StartMaple(int argc, String[] argv, ref MapleCallbacks
cb, IntPtr data, IntPtr info, byte[] err);
[DllImport(@"maplec.dll")]
public static extern IntPtr EvalMapleStatement(IntPtr kv, byte[] statement);
[DllImport(@"maplec.dll")]
public static extern IntPtr IsMapleStop(IntPtr kv, IntPtr obj);
[DllImport(@"maplec.dll")]
public static extern void StopMaple(IntPtr kv);
}
public class Maple
{
IntPtr kv;

public Maple(IntPtr _kv)
{
kv = _kv;
}
public void EvalStatement(string expr)
{
expr = expr + ";";
MapleEngine.EvalMapleStatement(kv, Encoding.ASCII.GetBytes(expr));
}
public void Stop()
{
MapleEngine.StopMaple(kv);
}
}

[System.Security.SuppressUnmanagedCodeSecurity()]
internal class NativeMethods
{
private NativeMethods(){}
[System.Runtime.InteropServices.DllImport("MimeTex.dll")]
internal static extern int CreateGifFromEq(string expr, string fileName);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
internal extern static IntPtr GetModuleHandle(string lpModuleName);
[System.Runtime.InteropServices.DllImport("kernel32.dll")]
[return:
System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropSer
vices.UnmanagedType.Bool)]
internal extern static bool FreeLibrary(IntPtr hLibModule);
}


Trang 15


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

2. Giao diện thực hiện chƣơng trình trên C#
Các hàm giải và biện luận phương trình bậc 2 được đóng gói thành thư viện cho phép
C# gọi đến
savelib('LayHeSo', "D:/BienLuanPtBac2.mla");
savelib('GiaiPtSo', "D:/BienLuanPtBac2.mla");
savelib('KhaoSatHamSo', "D:/BienLuanPtBac2.mla");
savelib('TimNghiemThuc', "D:/BienLuanPtBac2.mla");
savelib('BienLuanPt', "D:/BienLuanPtBac2.mla");
savelib('GiaiPtBac2', "D:/BienLuanPtBac2.mla");

a. Trường hợp phương trình bậc 2 vô nghiệm

Trang 16


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

b. Trường hợp phương trình bậc 2 có nghiệm kép


Trang 17


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

c. Trường hợp phương trình bậc 2 có 2 nghiệm phân biệt

Trang 18


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

b. Trường hợp biện luận phương trình bậc 2 theo m

Trang 19


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

Phần III: Kết Luận
Maple thật sự là một công cụ hữu ích không chỉ với những người chuyên về toán

học, mà nó còn có ý nghĩa đối với những lập trình viên, nó làm giảm thiểu những phức
tạp trong việc tính toán, hỗ trợ các hàm tính toán hình thức hiện đang còn rất hạn chế
đối với các ngôn ngữ lập trình như C#, VB.NET, Java …
Không những thế, chúng ta còn có thể sử dụng Maple để lập trình trí tuệ nhân tạo.
Việc cài đặt các thủ tục trí tuệ nhân tạo trên Maple khá đơn giản, cài đặt dễ dàng hơn là
trên các ngôn ngữ lập trình hiện nay.
Chương trình demo “Giải và biện luận phương trình bậc 2 theo m” đã cho thấy sự
kết hợp giữa C# và Maple để giải bài toán. Chương trình thể hiện một số chức năng cơ
bản như sau:
o Kết nối ngôn ngữ lập trình C# và Maple trong việc tính toán hình thức
o Đóng gói các thủ tục thành “thư viện” để ngôn ngữ C# gọi đến.
o Sử dụng Minetex để xử lý chuỗi Latex thành các công thức toán học thể hiện
lên giao diện người dùng.

Trang 20


GVHD: PGS.Ts Đỗ Văn Nhơn

Họ và Tên: Nguyễn Khánh Ngọc
MSHV: CH1001117

Tài liệu tham khảo
Bài giảng Lập trình Symbolic và Trí tuệ nhân tạo – TS. Đỗ Văn Nhơn
Giáo trình Lập Trình Tính Toán Hình Thức – Nguyễn Chánh Tú – Khoa Toán, ĐHSP Huế


Trang 21




×