Chính vì lý do trên nên sau khi học xong môn “Lập trình Symbolic cho trí tuệ nhân tạo”, em đã chọn đề tài “Ứng dụng lập trình Symbolic để giải và biện luận phương trình và hệ phương trìn
Trang 1LỜI MỞ ĐẦU Trong thời đại ngày nay, toán học đã đóng góp một phần quan trọng trong cuộc sống của chúng ta Trước đây, khi giải một bài toán thì cần phải tốn rất nhiều thời gian và công sức Tuy nhiên, gần đây do sự phát triển mạnh mẽ của công nghệ thông tin thì việc giải một bài toán trở nên khá đơn giản Đó là nhờ sự ra đời phần mềm Maple do một nhóm các nhà khoa học của Canada thuộc trường đại học Waterloo xây dựng Maple 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, có thể thực hiện được mọi điều từ những phép toán đơn giản nhất, sơ cấp nhất cho đến những tính toán phức tạp nhất
Chính vì lý do trên nên sau khi học xong môn “Lập trình Symbolic cho trí tuệ nhân tạo”, em đã chọn đề tài “Ứng dụng lập trình Symbolic để giải và biện luận phương trình và hệ phương trình theo tham số m” Trong phạm vi bài thu hoạch này, em sẽ phân tích cấu trúc dữ liệu, giải thuật để giải và biện luận phương trình
và hệ phương trình theo tham số m, đồng thời viết một chương trình để giải và biện luận phương trình và hệ phương trình theo tham số m bằng phần mềm Maple 16
Qua đây, em xin chân thành cảm ơn PGS.TS Đỗ Văn Nhơn đã tận tình hướng dẫn em môn học bổ ích và đầy ý nghĩa này Em xin cảm ơn các bạn cùng khoá và các anh chị khoá trước đã giúp đỡ em tìm tài liệu và góp ý cho em hoàn thành tốt bài thu hoạch này!
Trang 2NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Trang 3
MỤC LỤC
LỜI MỞ ĐẦU 1
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN 2
MỤC LỤC 3
NỘI DUNG 5
CHƯƠNG I: GIỚI THIỆU VỀ MAPLE VÀ MỘT SỐ LỆNH ĐƯỢC SỬ DỤNG TRONG CHƯƠNG TRÌNH 5
I.1 Giới thiệu về Maple 5
I.2 Một số lệnh được sử dụng trong chương trình 5
II.2.1 Lệnh lhs(expr) và rhs(expr) 5
II.2.2 Lệnh coeff(p,x) 6
II.2.3 Lệnh expand(expr) 6
II.2.4 Lệnh solve(equations, variables) và lệnh linsolve(matrix, vector) 6
II.2.5 Lệnh nops(e) 6
II.2.6 Lệnh convert(expr,form) 6
II.2.7 Lệnh subs(x=a,expr) 6
II.2.8 Lệnh parse(string) 6
II.2.9 Cách lệnh về chuỗi 6
II.2.10 Các lệnh về ma trận 6
CHƯƠNG II: GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH VÀ HỆ PHƯƠNG TRÌNH THEO THAM SỐ M 7
II.1 Giải và biện luận phương trình bậc nhất 1 ẩn số theo tham số m 7
II.1.1 Phân tích yêu cầu 7
II.1.2 Cấu trúc dữ liệu 7
II.1.3 Thuật giải 7
II.1.4 Thủ tục 8
Trang 4II.1.5 Dữ liệu thử nghiệm 8
II.2 Giải và biện luận phương trình bậc hai 1 ẩn số theo tham số m 9
II.2.1 Phân tích yêu cầu 9
II.2.2 Cấu trúc dữ liệu 9
II.2.3 Thuật giải 9
II.2.4 Thủ tục 10
II.2.5 Dữ liệu thử nghiệm 11
II.3 Giải và biện luận hệ phương trình bậc nhất có 2 hoặc 3 ẩn số theo tham số m 11
II.3.1 Phân tích yêu cầu 11
II.3.2 Cấu trúc dữ liệu 11
II.3.3 Thuật giải 12
II.3.4 Thủ tục 13
II.3.5 Dữ liệu thử nghiệm 15
KẾT LUẬN 16
TÀI LIỆU THAM KHẢO 17
Trang 5NỘI DUNG
CHƯƠNG I: GIỚI THIỆU VỀ MAPLE VÀ MỘT SỐ LỆNH
ĐƯỢC SỬ DỤNG TRONG CHƯƠNG TRÌNH
I.1 Giới thiệu về Maple
Maple là một hệ thống tính toán trên các biểu thức đại số Cho đến nay, Maple đã được phát triển qua nhiều phiên bản khác nhau và ngày càng hoàn thiện Phần mềm Maple có thể thực hiện các công việc sau:
Thực hiện các tính toán với khối lượng lớn, với thời gian nhanh và độ chính xác cao
Sử dụng các gói chuyên dụng của Maple để giải quyết các bài toán cụ thể như vẽ đồ thị, hình học giải tích, đại số tuyến tính
Thiết kế các đối tượng 3 chiều
Không chỉ dừng lại ở việc hỗ trợ tính toán, Maple còn có khả năng lập trình, 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 toán, 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ụ toán học phức tạp mà đòi hỏi rất nhiều kỹ năng lập trình
I.2 Một số lệnh được sử dụng trong chương trình
II.2.1 Lệnh lhs(expr) và rhs(expr)
Dùng lấy vế trái và vế phải của biểu thức expr
Trang 6II.2.2 Lệnh coeff(p,x)
Dùng lấy hệ số của biến x trong biểu thức p
II.2.3 Lệnh expand(expr)
Dùng để khai triển biểu thức đại số expr
II.2.4 Lệnh solve(equations, variables) và lệnh linsolve(matrix, vector)
Lệnh solve dùng để tìm nghiệm của phương trình, bất phương trình Lệnh linsolve dùng để giải hệ phương trình đại số tuyến tính với vector xác định vế phải
II.2.5 Lệnh nops(e)
Dùng để chỉ số lượng phần tử trong danh sách e
II.2.6 Lệnh convert(expr,form)
Dùng để chuyển biểu thức sang kiểu dữ liệu bất kỳ
II.2.7 Lệnh subs(x=a,expr)
Dùng để giải biểu thức expr với biến x có giá trị là a
II.2.8 Lệnh parse(string)
Dùng chuyển chuỗi sang biểu thức
II.2.9 Cách lệnh về chuỗi
- Lệnh searchtext (pattern, string): Dùng tìm chuỗi con pattern trong chuỗi string
- Lệnh substring (string, range):Dùng copy chuỗi string theo giới hạn range
II.2.10.Các lệnh về ma trận
- Lệnh Matrix(m, n, L): Dùng tạo ma trận cấp m x n từ bảng liệt kê các phần tử của ma trận L theo thứ tự từ trái sang phải và từ trên xuống dưới
- Lệnh Determinant(A): Tính định thức của ma trận A
- Lệnh DeleteColumn(A,L): xóa cột của ma trận A theo giới hạn L
Trang 7CHƯƠNG II: GIẢI VÀ BIỆN LUẬN PHƯƠNG TRÌNH VÀ HỆ
PHƯƠNG TRÌNH THEO THAM SỐ M
II.1 Giải và biện luận phương trình bậc nhất 1 ẩn số theo tham số m
II.1.1 Phân tích yêu cầu
Cho phương trình bậc nhất 1 ẩn số có dạng ax + b =0 theo tham số m
Yêu cầu: Giải và biện luận phương trình bậc nhất trên
II.1.2 Cấu trúc dữ liệu
- Phương trình bậc nhất được lưu trữ dưới dạng hàm số f:=ax+b
- Dùng cấu trúc rẽ nhánh if, cấu trúc lặp for để giải và biện luận phương trình
- Dùng danh sách tập hợp để lưu trữ danh sách nghiệm
II.1.3 Thuật giải
Input: phương trình bậc nhất 1 ẩn số theo tham số m
Output: giải và biện luận phương trình
Bước 1: Đưa phương trình về dạng ax + b=0
Bước 2: Biện luận phương trình theo a và b:
- Trường hợp 1: phương trình không có tham số m:
+ Nếu a <>0 thì phương trình có nghiệm x:=-b/a, Ngược lại, nếu b=0 thì phương trình vô số nghiệm,
Ngược lại phương trình vô nghiệm
- Trường hợp 2: phương trình có tham số m:
+ Nếu a <>0: tính giá trị m ứng với trường hợp a<>0,
khi đó phương trình có nghiệm x:=-b/a
+ Nếu a=0: tính giá trị m ứng với trường hợp a=0 (m có thể có 1 hoặc nhiều giá trị)
Trang 8Xét từng giá trị của m, tính b dựa vào m.
Nếu b=0 thì phương trình vô số nghiệm, Ngược lại phương trình vô nghiệm
Bước 3: Kết luận nghiệm của phương trình
II.1.4 Thủ tục
giaiptbac1:=proc(pt)
local f,a,b,listm,i,t;
#B1: đưa pt về dạng ax +b =0
f:=lhs(pt)- rhs(pt); a:=coeff(f,x); b:=expand(f-a*x);
#B2: Biện luận pt theo a và b
#TH 1:phương trình không có tham số m
if type(a,'numeric') then
if a<> 0 then printf("%s %s" , "phương trình có nghiệm x=",convert(-b/a,string));
else
if b=0 then printf("phương trình vô số nghiệm");
else printf("phương trình vô nghiệm") ; end if
end if
#TH 2: phương trình có tham số m else
listm:={solve(a)}; #danh sách chứa nghiệm của m #TH a<>0
printf("%s %s %s %s" , "Nếu m <>",convert(listm,string),"thì phương trình có nghiệm x=",convert(-b/a,string));
#TH a=0 for i from 1 to nops(listm)do t:=subs(m = listm[i], b);
printf("%s %s %s %s","Nếu m=",convert(listm[i],string),", thế b=",convert(t,string));
if t = 0 then printf(" thì phương trình vô số nghiệm");
else printf(" thì phương trình vô nghiệm") ; end if
end do;
end if;
end proc:
Trang 9II.1.5 Dữ liệu thử nghiệm
> giaiptbac1(m*(x-4)=5*x-2);
Nếu m <> {5} thì phương trình có nghiệm x= -(-4*m+2)/(m-5)
Nếu m= 5 , thế b= -18 thì phương trình vô nghiệm
> giaiptbac1(m^2 *x +2=x+2*m);
Nếu m <> {-1, 1} thì phương trình có nghiệm x= -(2-2*m)/(m^2-1)
Nếu m= -1 , thế b= 4 thì phương trình vô nghiệm
Nếu m= 1 , thế b= 0 thì phương trình vô số nghiệm
II.2 Giải và biện luận phương trình bậc hai 1 ẩn số theo tham số m
II.2.1 Phân tích yêu cầu
Cho phương trình bậc hai 1 ẩn số có dạng ax2 + bx + c =0 theo tham số m Yêu cầu: Giải và biện luận phương trình bậc hai trên
II.2.2 Cấu trúc dữ liệu
- Phương trình bậc hai được lưu trữ dưới dạng hàm số f:= ax2 + bx + c
- Dùng cấu trúc rẽ nhánh if, cấu trúc lặp for để giải và biện luận phương trình
- Dùng danh sách tập hợp để lưu trữ danh sách nghiệm
II.2.3 Thuật giải
Input: phương trình bậc hai 1 ẩn số theo tham số m
Output: giải và biện luận phương trình
Bước 1: Đưa phương trình về dạng ax2 + bx + c=0
Bước 2: Biện luận phương trình theo a, b và c:
- Trường hợp 1: phương trình không có tham số m theo a:
- Nếu a =0 thì trở về phương trình bậc 1
- Ngược lại (tức a <>0) thì:
+ Tính delta:=b2 -4ac + Trường hợp 1a: Nếu delta không có tham số m thì xét dấu delta:
Nếu delta>0 thì x1,2=−b±√delta
2a ,
Trang 10Ngược lại (delta<0) thì phương trình vô nghiệm
+ Trường hợp 1b: delta có tham số m thì biện luận delta theo m: Tính giá trị m theo delta (m có thể có nhiều giá trị)
Xét từng giá trị của m:
Nếu m<0: phương trình vô nghiệm
Nếu m=0: tính nghiệm kép x1=x2=−b 2 a
Nếu m>0: tính 2 nghiệm phân biệt: x1,2=−b±√delta
2a
- Trường hợp 2: phương trình có tham số m theo a:
- Nếu a=0:
Tính giá trị m theo a (m có thể có nhiều giá trị)
Thế từng giá trị của m vào phương trình, trở về phương trình bậc 1
- Nếu a <>0 thì biện luận delta theo tham số m (giống trường hợp 1b) Bước 3: Kết luận nghiệm của phương trình
II.2.4 Thủ tục
giaiptbac2:=proc(pt)
local f,a,b,c,d,x1,x2,t,listm,i,f1;
#B1: đưa pt về dạng ax^2 +bx +c =0
f:=lhs(pt)- rhs(pt); a:=coeff(f,x^2); b:=coeff(f,x); c:=expand(f-a*x^2 - b*x); #B2: Biện luận pt theo a, b và c
if type(a,'numeric') then #TH 1 phương trình không có tham số m ở a
if a=0 then
giaiptbac1(pt); #trở về pt bậc 1
else
d:=b*b - 4*a*c;
if type(d,'numeric') then #xét TH delta có tham số m không?
#TH 1a: phương trình không có tham số m ở delta=>pt không có tham số m
if d>0 then
Trang 11printf("%s %s %s %s","Phương trình có 2 nghiệm phân biệt là",convert(x1,string),",",convert(x2,string));
else
if d=0 then x1:=-b/(2*a);
printf("%s %s","Phương trình có nghiệm kép là",convert(x1,string)); else
printf("Phương trình vô nghiệm");
end if;
end if;
else #TH 1b: phương trình có tham số m ở delta =>biện luận pt theo delta
xetdelta(d,a,b,c); # thủ tục tính từng giá trị nghiệm m của delta else #TH2: phương trình có tham số m ở a
#TH a=0 listm:={solve(a)};
for i from 1 to nops(listm)do f1:=subs(m = listm[i],pt); #thế giá trị m vào phương trình printf("%s %s %s %s %s","Khi ",convert(a,string),"=0 =>
m=",convert(listm[i],string),": ");
giaiptbac1(f1);
end do;
#TH a<>0: tính delta, xét dấu delta xetdelta(d,a,b,c); # thủ tục tính từng giá trị nghiệm m của delta end if;
end proc:
II.2.5 Dữ liệu thử nghiệm
> giaiptbac2(x^2-1=2*m*x-2*m);
Khi m< 1 : phương trình vô nghiệm
Khi m= 1 : phương trình có nghiệm kép x= 1
Khi m> 1 : phương trình có 2 nghiệm phân biệt
> giaiptbac2((m-2)*x^2-2*(m+1)*x=5-m);
Khi m-2 =0 => m= 2 : phương trình có nghiệm x= -1/2
Khi m< 1 : phương trình vô nghiệm
Khi m= 1 : phương trình có nghiệm kép x= -2
Khi m> 1 : phương trình có 2 nghiệm phân biệt
Trang 12số m
II.3.1 Phân tích yêu cầu
Cho hệ phương trình bậc nhất có 2 hoặc 3 ẩn số theo tham số m
Yêu cầu: Giải và biện luận phương trình bậc nhất trên
II.3.2 Cấu trúc dữ liệu
- Hệ phương trình bậc nhất được lưu trữ dưới dạng chuỗi
- Sử dụng mảng 2 chiều để lưu trữ các ma trận hệ số
- Dùng cấu trúc rẽ nhánh if, cấu trúc lặp for để giải và biện luận phương trình
- Dùng danh sách tập hợp để lưu trữ danh sách nghiệm
II.3.3 Thuật giải
Dùng phương pháp Cramer để giải và biện luận hệ phương trình
Input: hệ phương trình bậc nhất có 2 hoặc 3 ẩn số theo tham số m
Output: giải và biện luận hệ phương trình
Bước 1: Đưa hệ phương trình về dạng
{a1x+b1y=d1
a2x+b2y=d2
hoặc
{a1x+b1y+c1z=d1
a2x+b2y+c2z=d2
a3x+b3y+c3z=d3
Bước 2: Biện luận hệ phương trình:
- Tính ma trận hệ số A, tính định thức detA, nếu det A>0 thì dùng phương pháp Cramer để giải và biện luận phương trình, ngược lại thì dừng chương trình
Trang 13- Tính ma trận Aj (A1, A2, A3) bằng cách thay cột thứ j bởi cột các hệ
số tự do, tính định thức detA1, detA2, detA3 (trường hợp hệ phương trình 2 ẩn số thì không tính detA3)
- Tính giá trị m theo detA (m có thể có nhiều giá trị)
- Xét từng giá trị m:
+ Nếu detA <>0: tính nghiệm x, y, z tùy theo hệ phương trình có 2 hoặc 3 ẩn số Nghiệm được tính theo công thức sau:
x:=detA1/detA y:=detA2/detA z:=detA3/detA
+ Nếu detA=0:
Thế giá trị m vào detA1
Nếu detA1<>0 thì kết luận vô nghiệm Ngược lại nếu detA2=detA3=0 thì tính nghiệm
Bước 3: Kết luận nghiệm của hệ phương trình
Hạn chế của giải thuật này là chỉ giải và biện luận hệ phương trình bậc nhất có 2 hoặc 3 ẩn số, chưa giải được hệ phương trình có nhiều hơn 3 ẩn số và hệ phương trình bậc hai, bậc ba, …
II.3.4 Thủ tục
giaiheptbac1:=proc(hept)
local he1,he2,i,j,k,l,o,pt,f,x,y,z,t,dx,dy,dz,mang,d,c,mt,matran, A,A1,A2,A3,DetA,
DetA1, DetA2,DetA3,listm,q;
#Bước 1: Đưa hệ phương trình về đúng dạng theo yêu cầu
d:=1; he1:=hept; i:=searchtext(";",he1); dx:=0;dy:=0;dz:=0;
while i>0 do
pt:=substring(he1,1 i-1); j:=searchtext("x",pt);
if j=0 then mang[d,1]:=0; dx:=dx+1; #để ktra nếu tất cả cột x=0 thì xóa else
mang[d,1]:=parse(substring(pt,1 j-2));
end if;
Trang 14mang[d,2]:=0; dy:=dy+1;
else mang[d,2]:=parse(substring(pt,(j+1) (k-2)));
end if;
l:=searchtext("z",pt);
if l=0 then mang[d,3]:=0; dz:=dz+1;
else mang[d,3]:=parse(substring(pt,(k+1) (l-2)));
end if;
o:=searchtext("=",pt); mang[d,4]:=parse(substring(pt,(o+1) length(pt))); d:=d+1; #tăng số dòng, tức là số lượng phương trình
#xóa phương trình trước đó he2:= Delete(he1,1 i); #xóa từ đầu đến dấu ; he1:=he2; i:=searchtext(";", he1);
od;
#số cột hiện tại =4;
c:=4;
#Bước 2:
#Đổ mảng 2 chiều vào ma trận
mt:=Matrix(d-1,4,mang);
matran:=Matrix(d-1,4,mang);#TH không xóa cột nào
#để ma trận vuông:kiểm tra nếu cột nào toàn 0 hết thì xóa cột đó ra (trừ cột cuối)
if dx=d-1 then matran:=DeleteColumn(mt,[1]);
c:=c-1;
end if;
if dy=d-1 then matran:=DeleteColumn(mt,[2]);
c:=c-1;
end if;
if dz=d-1 then matran:=DeleteColumn(mt,[3]);
c:=c-1;
end if;
#Tính ma trận A, A1, A2, A3 dựa vào ma trận
#A: xoá cột tự do d (cột cuối):
A:=DeleteColumn(matran, c);
DetA:=Determinant(A); #ma trận vuông thì mới tính được #A1: hoán vị cột hệ số tự do vào cột x, xóa cột x(cột cuối), A1:=DeleteColumn(swapcol(matran,1,c), c);
DetA1:=Determinant(A1);
#A2: hoán vị cột hệ số tự do vào cột y, xóa cột y(cột cuối),