Tải bản đầy đủ (.docx) (17 trang)

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

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 (268.81 KB, 17 trang )

Đạ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
GVHD: PGS.TS. ĐỖ VĂN NHƠN
Học viên: ĐỖ ĐÌNH THỦ
Lớp: Cao học khóa 6 Mã số: CH1101140
Tp Hồ Chí Minh, tháng 1 năm 2013 NHẬN XÉT CỦA GIÁO VIÊN
HƯỚNG DẪN



















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 Page 2



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
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 Page 3
MỤC LỤC
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 Page 4
I. 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#.
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 Page 5
II. GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH BẬC NHẤT
1. Phát biểu và phân tích bài toán
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.
2. Cấu trúc dữ liệu
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.
3. Thủ tục
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.
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 Page 6
Kế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
4. Cài đặt chương trình:
Thủ tục được cài đặt trong package CH1101140, tên thủ tục là GiaiBienLuanPTNB(ptbn)
5. Chạy thử với dữ liệu mẫu
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.
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 Page 7

ma := {-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).
>
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 Page 8
III. GIẢI VÀ BIỆN LUẬN HỆ PHƯƠNG TRÌNH BẬC NHẤT
1. Phát biểu và phân tích bài toán bài toán
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.
2. Cấu trúc dữ liệu
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
3. Thủ tục
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.
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 Page 9
if 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
4. Cài đặt chương trình:
Thủ tục được cài đặt trong package CH1101140, tên thủ tục là
GiaiBienLuanHPTNB(ptbn1, ptbn2)
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 Page 10
5. 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) .
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 Page 11
IV. XÂY DỰNG ỨNG DỤNG TRÊN C#
1. Kết nối với Maple
Để kết nối với Maple ta sử dụng lớp MapleEngine.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace DoDinhThu_LapTrinhSymbolic
{
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);
}


}
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 Page 12
2. 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.
3. Giao diện chương trình
4. Các bước thực thi của chương trình
- 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.
- public DoDinhThu()
- {
-
- //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;
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 Page 13
- 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();
- }
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 Page 14
- 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
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 Page 15
Giải và biện luận HPT {m*x – m + y = 0, m*x – y + 8 = 0}
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 Page 16
V.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ủ
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 Page 17

×