Đại Học Quốc Gia TP.HCMTrường Đại Học Công Nghệ Thông Tin TIỂU LUẬN MÔN LẬP TRÌNH SYMBOLIC Đề tài: SỬ DỤNG MAPLE VÀ C# XÂY DỰNG ỨNG DỤNG GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH, HỆ PHƯƠNG TRÌNH B
Trang 1Đại Học Quốc Gia TP.HCM
Trường Đại Học Công Nghệ Thông Tin
TIỂU LUẬN MÔN LẬP TRÌNH SYMBOLIC
Đề tài:
SỬ DỤNG MAPLE VÀ C# XÂY DỰNG ỨNG DỤNG
GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH, HỆ
PHƯƠNG TRÌNH BẬC NHẤT
Lớp: Cao học khóa 6 Mã số: CH1101140
Trang 2Tp Hồ Chí Minh, tháng 1 năm 2013 NHẬN XÉT CỦA GIÁO VIÊN
HƯỚNG DẪN
Trang 3
LỜI CÁM ƠN
Chúng em xin chân thành cám ơn thầy, PGS TS Đỗ Văn Nhơn đã tận tình giảng dạy chúng em trong quá trình học tập để thực hiện bài tiểu luận này
Chúng em xin chân thành cám ơn Phòng Đào tạo sau Đại học, trường Đại Học Khoa Học Công nghệ Thông tin – Đại học Quốc Gia Tp.HCM đã tạo điều kiện thuận lợi cho em trong học tập và công tác
Chúng em xin chân thành cám ơn quý Thầy Cô trong Trường đã tận tình giảng dạy, trang bị cho chúng em những kiến thức quý báu trong suốt thời gian học Xin chân thành cám ơn người thân và bạn bè đã ủng hộ, giúp đỡ tôi trong thời gian học tập và nghiên cứu
Học viên thực hiện,
Đỗ Đình Thủ
Tháng 01/ 2013
Trang 4MỤC LỤC
Trang 5I GIỚI THIỆU
Maple là một phần mềm tính toán hình thức (formal computation) do Đại học Waterloo của Canada phát triển từ 1980 với mong muốn giúp máy tính có thể làm việc với được với các ký hiệu toán học truyền thống của con người (đạo hàm, tích phân, ma trận, định thức, …) Ngày nay, Maple còn làm được nhiều hơn rất nhiều: hỗ trợ các tính toán hình thức, tính toán số học với độ chính xác rất lớn, giải và biện luận các phương trình, hệ phương trình, vẽ đồ thị 2 chiều, 3 chiều, …Ngoài ra, Maple cũng hỗ trợ cho việc lập trình cấp cao Cùng với Matlap, Mathematica, Maple cho người dùng thêm một sự lựa chọn tốt trong lập trình tính toán hình thức
Trong phạm vi tiểu luận môn học, do thời gian eo hẹp không phát triển nhiều thủ tục nên chỉ có thể phát triển hoàn chỉnh 1 package hỗ trơ giải và biện luận phương trình
và hệ phương trình bậc nhất Ứng dụng này sẽ là cơ sở để phát triển những package khác trong nhiều lĩnh vực áp dụng khi muốn sử dụng Maple với Net mà ở đây sử dụng C#
Trang 6II GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH BẬC NHẤT
Cho phương trình (PT) bậc nhất có 1 ẩn, các hệ số có chứa 1 tham số m Hãy giải và biện luận PT đã cho theo tham số m Ví dụ với PT: (2m -1)x -2 = 4mx + m
Với bài toán trên ta có thể sử dụng Maple để giải quyết tuy nhiên trong quá trình xử lý cần lưu ý vài đặt điểm sau ngoài việc sử dụng thuật toán giải và biện luận PT bậc nhất đã biết:
- Kiểm tra chắc chắn PT nhập vào là PT bậc nhất theo x, có 1 tham số m
- Cần chuyển chương trình về dạng: ax + b = 0
- Các hệ số có thể có bậc bất kỳ
Vậy khi người dùng nhập vào PT bậc nhất 1 ẩn bất kỳ, đều có thể biện luận được
Cần tổ chức các cấu trúc dữ liệu như sau:
- pt: phương trình
- a,b: các hệ số a,b
- ma: kiểu tập hợp là nghiệm của PT a = 0, theo m
- mb: giá trị của hệ số b khi a =0
- bac: kiểm tra bậc của phương trình
Thuật giải: GiaiBienLuanPTBN(ptbn)
local variables: a,b,ma,mb,bac,mai,pt;
Begin:
Bước 0:
pt := lhs(ptbn) – rhs(ptbn) = 0
Bước 1:
bac : = bậc của PT theo ẩn x
if bac > 1 then
//PT không phải là PT bậc nhất
Trang 7Kết thúc.
end if
Bước 2:
a:= hệ số a của PT
b:= hệ số b của PT
ma:= tập nghiệm của PT a = 0 theo ẩn m
if card(ma) > 0 then
foreach mai in ma do
mb:= giá trị của b khi thay m = mai
if mb = 0 then
//với mai PT có vô số nghiệm else
//với mai PT vô nghiệm end if
end do
Với mai không thuộc tập ma, PT đã cho có nghiệm x = -b/a
end if
end
Thủ tục được cài đặt trong package CH1101140, tên thủ tục là GiaiBienLuanPTNB(ptbn)
Ví dụ: Cho PT (2m -1)x -2 = 4mx + m
pt : = -(2m + 1)x -2-m =0
bac := 1
a := -(2m +1)
b:= -2 –m
Trang 8ma := {-1/2}.
->mb := -3/2 Với m = -1/2 PT vô nghiệm
với m # -1/2 PT có nghiệm x =- (2 + m)/(2m +1)
Giải trong Maple
>
>
Khi tham so m la -1/2 thi phuong trinh da cho vo nghiem Khi tham so m khac -1/2 thi nghiem cua phuong trinh la x = -(-2-m)/(-2*m-1)
>
Trang 9III GIẢI VÀ BIỆN LUẬN HỆ PHƯƠNG TRÌNH BẬC NHẤT
Cho hệ phương trình (HPT) bậc nhất 2 ẩn có dạng: {a1x + b1y + c =0, a2x + b2y + c2 = 0} Các hệ số có chứa tham số m Hãy giải và biện luận HPT trên theo m
Cũng như PT bậc nhất ta phải quy định HPT nhập vào là HPT bậc nhất 2 ẩn số Ta cần chuyển HPT về dạng vế trái là đa thức vế phải bằng 0 Sau đó ta sẽ biện luận HPT theo các định thức D,Dx,Dy
Ta cần lưu trữ các biến sau:
- pt1, pt2: các phương trình của hệ phương trình
- a1,a2,b1,b2,c1,c2: các hệ số của HTP
- D,Dx,Dy các định thức D,Dx,Dy
- bacx, bacy: bậc của từng PT theo biến x,y
- nghiem: tập nghiệm của D = 0 theo m
- valueDx,valueDy giá trị Dx,Dy tương ứng khi D = 0
Thuật giải: GiaiBienLuanHPTBN(ptbn1, ptbn2)
local a1,b1,c1,a2,b2,c2,D, Dx, Dy, nghiem, no, valueDx, valueDy, bacx, bacy;
Begin:
Bước 0:
pt1 := lhs(ptbn1) - rhs(ptbn1) = 0;
pt2 := lhs(ptbn2) - rhs(ptbn2) = 0;
Bước 1:
foreach pt in hệ phương trình do
bacx := bậc của phương trình theo biến x
bacy := bậc của phương trình theo biến y
Trang 10if bacx > 1 or bacy > 1 then
//HPT không phải là bậc nhất theo biến x,y Kết thúc
end if
end do
Bước 2: Tính lần lượt các hệ số a1,b1,c1,a2,b2,c2 của PT pt1 và pt2
D := D := b1*a2 - a1*b2;
Dx := c1*b2 - b1*c2;
Dy :=a1*c2 - c1*a2;
nghiem := {nghiệm của PT D = 0 theo m}
if card (nghiem) > 0 then
foreach no in nghiem do
valueDx := thay m = no vào Dx valueDy := thay m = no vào Dy
if valueDx = valueDy =0 then
//HPT có vô số nghiệm else
//HPT vô nghiệm end if
if m <> no then
//HPT có nghiệm x = Dx/D, y = Dy/D
end if
end do end if
End
Thủ tục được cài đặt trong package CH1101140, tên thủ tục là
GiaiBienLuanHPTNB(ptbn1, ptbn2)
Trang 115 Chạy thử với dữ liệu mẫu
Ví dụ: Giải và biện luận HTP sau
>
Voi m = -I*2^(1/2) thi he phuong trinh vo nghiem Voi m =
I*2^(1/2) thi he phuong trinh vo nghiem Khi gia tri cua m khac: -I*2^(1/2), I*2^(1/2), nghiem cua he phuong trinh la x = 1/(2+m^2) va y = (m*(m-1)+2)/(2+m^2)
Trang 12IV XÂY DỰNG ỨNG DỤNG TRÊN C#
Để kết nối với Maple ta sử dụng lớp MapleEngine.cs
{
{
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,
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);
}
}
Trang 132 Cấu trúc dữ liệu
Ta sử dụng 2 textBox để nhận hai phương trình do người dùng nhập vào Mỗi textBox
là 1 phương trình
Để hiển thị kết quả từ maple ra giao diện trên C# ta dùng 1 richTextBox, cho phép hiển thị nhiều dòng
- Chương trình sẽ tạo liên kết tới maple ngay trước khi khởi tạo form Bước liên kết này sẽ nạp luôn package cần dùng vào chương trình
- {
-
- //Tạo liên kết tới Mpale ngay khi khởi tạo form
- MapleEngine MapleCallbacks cb;
- byte [] err = new byte [2048];
- IntPtr kv;
Trang 14- String [] argv = new String [2];
- argv[0] = "maple" ;
- argv[1] = "-A2" ;
- cb.textCallBack = cbText;
- cb.errorCallBack = cbError;
- cb.statusCallBack = cbStatus;
- cb.readlineCallBack = null ;
- cb.redirectCallBack = null ;
- cb.streamCallBack = null ;
- cb.queryInterrupt = null ;
- cb.callbackCallBack = null ;
try
- {
- kv = MapleEngine StartMaple(2, argv, ref cb, IntPtr Zero,
IntPtr Zero, err);
- }
- catch ( DllNotFoundException )
- {
- return ;
- }
- catch ( EntryPointNotFoundException )
- {
- return ;
- }
if (kv.ToInt64() == 0)
- {
- MessageBox Show( "Fatal Error, could not start Maple: "
- + System.Text Encoding ASCII.GetString(err, 0,
Array IndexOf(err, ( byte )0)), "Lỗi" , MessageBoxButtons OK);
- return ;
- }
- //Thực hiện load package cần dùng: CH1101140
- try
- {
- MapleEngine EvalMapleStatement(kv,
Encoding ASCII.GetBytes( "with(CH1101140):" ));
- }
- catch ( Exception )
- {
- }
- InitializeComponent();
- }
Trang 15- Nếu người dùng chỉ nhập 1 phương trình thì sẽ gọi thủ tục
GiaiBienLuanPTBN(pt) với phương trình lấy từ 1 trong 2 textBox có dữ liệu
- Nếu người dùng nhập vào cả hai phương trình trong 2 textBox thì lấy cả 2 phương trình làm tham số cho thủ tục GiaiBienLuanHPTBN(pt1,pt2)
String expr = "" ;
if (txtInput1.Text != "" && txtInput2.Text != "" )
{
expr = "GiaiBienLuanHPTBN(" ;
expr += txtInput1.Text;
expr += "," ;
expr += txtInput2.Text;
expr += ");" ;
}
else
{
if (txtInput1.Text != "" )
{
expr = "GiaiBienLuanPTBN(" ;
expr += txtInput1.Text;
expr += ");" ;
}
if (txtInput2.Text != "" )
{
expr = "GiaiBienLuanPTBN(" ;
expr += txtInput2.Text;
expr += ");" ;
}
5 Demo
Giải và biện luận PT (2-m)*x – 2m = 0
Trang 16Giải và biện luận HPT {m*x – m + y = 0, m*x – y + 8 = 0}
Trang 17V KẾT LUẬN
Việc sử dụng công cụ mạnh như Maple kết hơp tốt với môi trường net hứa hẹn sẽ giúp ích rất nhiều cho những ứng dụng trí tuệ nhân tạo Việc lập trình sẽ dễ hơn nếu chỉ dùng ngôn ngữ lập trình để giải quyết với số lớn (ví dụ về mã hóa) Ứng dụng này em sẽ
mở rộng cho bài giải tam giác hay giải toán hình học sắp tới vì thời gian hạn hẹp không cho phép em hoàn thành nhiều chức năng cho dù có nhiều tham vọng từ ban đầu
Xin chân thành cảm ơn Thầy đã giới thiệu và truyền đạt những kiến thức nền tảng, gợi cho chúng em những ý tưởng, những hướng phát triển lý thú, bổ ích giúp cho chúng
em có thể tạo ra những sản phẩm có ích phục vụ cho xã hội tốt hơn
TP.HCM, ngày 01 tháng 02 năm 2013
Học viên thực hiện
Đỗ Đình Thủ