Hình học giải tích và Đại số máy tính

Trên Blog này này tôi sẽ post code của các chương trình Đại số máy tính giải toán Hình học giải tích.
Để sử dụng được  chúng các bạn phải hội tụ đủ các điều kiện sau đây:

  1. Máy tính phải cài đặt TeXLive2013 hoặc MiKTeX2.9
  2. Máy tính phải cài đặt xcas-giac của Đại học Joseph Fourrier.
  3. Nếu máy của bạn chạy hệ điều hành Ubuntu thì không cần phải làm gì thêm. Nếu các bạn sử dụng MS Windows thì phải đợi tôi hướng dẫn set đường dẫn để LaTeX có thể thấy được Xcas.
  4. Tốt nhất là copy code để sử dụng và biên tập lại theo nhu cầu. Mỗi bài toán (nếu không có giải thích gì thêm), các bạn chỉ cần nhập đề bài ở dòng highlight đầu tiên. Tất cả mọi việc còn lại là do LaTeX và XCAS thực hiện.
temp390914536upKIỂM TRA ĐƯỜNG BẬC HAI CÓ PHẢI LÀ CẶP ĐƯỜNG THẲNG KHÔNG. NẾU PHẢI, VIẾT PHƯƠNG TRÌNH CỦA CẶP ĐƯỜNG THẲNG ĐÓ.
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[vietnam]{babel}
\usepackage{utopia}
\usepackage[utopia]{mathdesign} 
\usepackage{amsmath}
\usepackage{moreverb}
\usepackage{graphicx}
\newcommand{\executGiac}[1]{
\immediate\write18{giac <#1 } }
\begin{document}

\begin{verbatimwrite}{testquadric.in}
maple_mode(0);
Sortie:=fopen("testquadric.out.tex");
zz:=4*x^2-12*x*y+9*y^2+6*x-9*y-10;
Resultat:=cat("Cho đường bậc hai có phương trình:","$$",latex(ans()),"=0$$");
dfx:=diff(zz,x);
dfy:=diff(zz,y);
Resultat:=cat(Resultat,"Các hệ số "," $ a, b, c, d, e, f",,"$"," là:");
Resultat:=cat(Resultat,""," $$",,"$$");
aa:=simplify(diff(diff(zz,x),x)/2);
Resultat:=cat(Resultat,"","$ a = ",latex(ans())," $");
bb:=simplify(diff(diff(zz,x),y)/2);
Resultat:=cat(Resultat," , ","$ b=",latex(ans()),"$");
cc:=simplify(diff(diff(zz,y),y)/2);
Resultat:=cat(Resultat," , ","$ c=",latex(ans()),"$");
ww:=simplify(zz-aa*x^2-2*bb*x*y-cc*y^2);
dd:=simplify(diff(ww,x)/2);
Resultat:=cat(Resultat," , ","$ d =",latex(ans()),"$");
EE:=simplify(diff(ww,y)/2);
Resultat:=cat(Resultat," , ","$ e =",latex(ans()),"$");
ff:=simplify(ww-2*dd*x-2*EE*y);
Resultat:=cat(Resultat," , ","$ f =",latex(ans()),"$");
Resultat:=cat(Resultat,".","$$",,"$$");
J1:=aa+cc;
Resultat:=cat(Resultat,"Bất biến thứ nhất : ","$$ I_1 =",latex(ans()),"$$");
J2:=aa*cc-bb^2;
Resultat:=cat(Resultat,"Bất biến thứ hai : ","$$ I_2 =",latex(ans()),"$$");
J3:=det([aa,bb,dd],[bb,cc,EE],[dd,EE,ff]);
Resultat:=cat(Resultat,"Bất biến thứ ba : ","$$ I_3 =",latex(ans()),"$$");
J2>0 and J3<0;
Resultat:=cat(Resultat,"Đường bậc hai là elip: PHẢI (true),  KHÔNG (false/0)  ","$$",latex(ans()),"$$");
J2<0 and J3!=0;
Resultat:=cat(Resultat,"Đường bậc hai là hyperbol: PHẢI (true),  KHÔNG (false/0)  ","$$",latex(ans()),"$$");
J2=0 and J3!=0;
Resultat:=cat(Resultat,"Đường bậc hai là parabol: PHẢI (true),  KHÔNG (false/0)  ","$$",latex(ans()),"$$");
J3==0;
Resultat:=cat(Resultat,"Đường bậc hai suy biến thành một  cặp đường thẳng: PHẢI (true),  KHÔNG (false/0)  ","$$",latex(ans()),"$$");
%collect(simplify(solve(zz,y)[0]));
%Resultat:=cat(Resultat,"Phương trình đường thẳng 1","$$y=",latex(ans()),"$$");
%collect(simplify(solve(zz,y)[1]));
%Resultat:=cat(Resultat,"Phương trình hai đường thẳng 2","$$y=",latex(ans()),"$$");fprint(Sortie,Unquoted,Resultat);
fclose(Sortie);
\end{verbatimwrite}
\executGiac{testquadric.in}
\input{testquadric.out}
\end{document}

Trong trường hợp đường bậc hai là cặp đường thẳng (thực, ảo, cắt nhau, song song, trùng nhau), bằng cách bỏ đi các dấu % trước các dòng 50,51, 52,53 của file TeX và biên dịch lại, xcas sẽ giải phương trình bậc hai
ax^2+2bxy+cy^2+2dx+2ey+f=0
của y theo biến x. Như ví dụ:

cd1

temp508632577upĐƯỜNG BẬC HAI LÀ ÊLIP

Nếu tính nhẫm thấy I_2>0 thì ta dự đoán đó là elip. Khi chạy chương trình testquadric.tex sẽ có thông báo rằng đường bậc hai là elip. Ta tiếp tục ở file testelip.tex sau đây để thực hiện.

  1. Chạy pdflatex để dịch và lưu các macro vào file trung gian thích hợp. Có thể có một số thông báo lỗi do không tương thích với ngôn ngữ pstricks để vẽ hình ở dưới.
  2. chạy F1 trong texmaker: latex-dvips-pstopdf-viewpdf để thục hiện vẽ hình.
  3. Lưu ý mọi thứ đều thực hiện tự động, trừ dòng highlight đầu tiên, bạn phải nhập đề bai, tất nhiên.
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[vietnam]{babel}
\usepackage{utopia}
\usepackage[utopia]{mathdesign} 
\usepackage{amsmath}
\usepackage{moreverb}
\usepackage{graphicx}
\newcommand{\executGiac}[1]{
\immediate\write18{giac <#1 } }
\parindent=0pt
\usepackage{pstricks-add}
\pagestyle{empty}


\begin{document}
\begin{verbatimwrite}{testelip.in}
maple_mode(0);
Sortie:=fopen("testelip.out.tex");
z:=36*x^2+24*x*y+29*y^2-72*x+126*y+81;
Resultat:=cat("Cho đường bậc hai có phương trình:","$$",latex(ans()),"=0$$");
dfx:=diff(z,x);
dfy:=diff(z,y);
Resultat:=cat(Resultat,"Các hệ số "," $ a, b, c, d, e, f",,"$"," là:");
Resultat:=cat(Resultat,""," $$",,"$$");
a:=simplify(diff(diff(z,x),x)/2);
Resultat:=cat(Resultat,"","$ a = ",latex(ans())," $");
b:=simplify(diff(diff(z,x),y)/2);
Resultat:=cat(Resultat," , ","$ b=",latex(ans()),"$");
c:=simplify(diff(diff(z,y),y)/2);
Resultat:=cat(Resultat," , ","$ c=",latex(ans()),"$");
w:=simplify(z-a*x^2-2*b*x*y-c*y^2);
d:=simplify(diff(w,x)/2);
Resultat:=cat(Resultat," , ","$ d =",latex(ans()),"$");
E:=simplify(diff(w,y)/2);
Resultat:=cat(Resultat," , ","$ e =",latex(ans()),"$");
f:=simplify(w-2*d*x-2*E*y);
Resultat:=cat(Resultat," , ","$ f =",latex(ans()),"$");
Resultat:=cat(Resultat,".","$$",,"$$");
I1:=a+c;
Resultat:=cat(Resultat,"Bất biến thứ nhất : ","$$ I_1 =",latex(ans()),"$$");
I2:=a*c-b^2;
Resultat:=cat(Resultat,"Bất biến thứ hai : ","$$ I_2 =",latex(ans()),"$$");
I3:=det([a,b,d],[b,c,E],[d,E,f]);
Resultat:=cat(Resultat,"Bất biến thứ ba : ","$$ I_3 =",latex(ans()),"$$");
ptdt:=t^2-I1*t+I2;
Resultat:=cat(Resultat,"Phương trình đặc trưng: ","$$",latex(ans()),"=0$$");
t1:=solve(ptdt,t)[0];
Resultat:=cat(Resultat,"Hai nghiệm của phương trình đặc trưng:\\ ","$t_1=",latex(ans()),"$");
t2:=solve(ptdt,t)[1];
Resultat:=cat(Resultat," và "," $t_2=",latex(ans()),"$.\\ ");
A:=simplify(-I3/(I2*t1));
round(evalf(sqrt(abs(A))),2);
Resultat:=cat(Resultat,"\\def\\btl\{",ans(),"} ");
B:=simplify(-I3/(I2*t2));
round(evalf(sqrt(abs(B))),2);
Resultat:=cat(Resultat,"\\def\\btn\{",ans(),"} ");
t1*X^2+t2*Y^2=-I3/I2;
Resultat:=cat(Resultat,"Phương trình thu gọn của đường bậc hai là: ","$$",latex(ans()),"$$");
X^2/A+Y^2/B=1;
Resultat:=cat(Resultat,"Phương trình chính tắc của đường bậc hai là: ","$$",latex(ans()),"$$");
linsolve([diff(z,x)=0,diff(z,y)=0],[x,y]);
Resultat:=cat(Resultat,"Tọa độ của tâm:","$$",latex(ans()),"$$");
k1:=simplify((t1-a)/b);
Resultat:=cat(Resultat,"Hai phương chính của $(S)$ là:","$$k_1=",latex(ans()),"$$");
evalf((t1-a)/b);
Resultat:=cat(Resultat,"\\def\\slope\{",ans(),"} ");
evalf((t2-a)/b);
Resultat:=cat(Resultat,"\\def\\Slope\{",ans(),"} ");
round(atan(k1)*180/3.14159,2);
Resultat:=cat(Resultat,"\\def\\rotate\{",ans(),"} ");
k2:=simplify((t2-a)/b);
Resultat:=cat(Resultat,"và:","$$k_2=",latex(ans()),"$$");
hdt:=linsolve([diff(z,x)=0,diff(z,y)=0],[x,y])[0];
round(evalf(linsolve([diff(z,x)=0,diff(z,y)=0],[x,y])[0]),2);
Resultat:=cat(Resultat,"\\def\\center\{",ans(),"} ");
tdt:=linsolve([diff(z,x)=0,diff(z,y)=0],[x,y])[1];
round(evalf(linsolve([diff(z,x)=0,diff(z,y)=0],[x,y])[1]),2);
Resultat:=cat(Resultat,"\\def\\Center\{",ans(),"} ");
collect(simplify(k1*x-k1*hdt+tdt));
Resultat:=cat(Resultat,"Phương trình trục $IX$ trong hệ trục $Oxy$ là:","$$y=",latex(ans()),"$$");
collect(simplify(k2*x-k2*hdt+tdt));
Resultat:=cat(Resultat,"Phương trình trục $IY$ trong hệ trục $Oxy$ là:","$$y=",latex(ans()),"$$");
vr:=round(simplify(2+hdt+evalf(max(sqrt(abs(A)),sqrt(abs(B))))),2);
Resultat:=cat(Resultat,"\\def\\viewright\{",ans(),"} ");
simplify(95/100*vr);
Resultat:=cat(Resultat,"\\def\\viewx\{",ans(),"} ");
simplify(2*hdt-vr);
Resultat:=cat(Resultat,"\\def\\viewleft\{",ans(),"} ");
Vr:=round(simplify(2+tdt+evalf(max(sqrt(abs(A)),sqrt(abs(B))))),2);
Resultat:=cat(Resultat,"\\def\\Viewright\{",ans(),"} ");
round(simplify(2*tdt-Vr),2);
Resultat:=cat(Resultat,"\\def\\Viewleft\{",ans(),"} ");
simplify(975/1000*Vr);
Resultat:=cat(Resultat,"\\def\\Viewy\{",ans(),"} ");
fprint(Sortie,Unquoted,Resultat);
fclose(Sortie);
\end{verbatimwrite}
\executGiac{testelip.in}
\input{testelip.out}



\psset{xunit=1.0cm,yunit=1.0cm}
\begin{pspicture*}(\viewleft,\Viewleft)(\viewright,\Viewright)
\psset{xunit=1.0cm,yunit=1.0cm,algebraic=true,dotstyle=o,dotsize=3pt 0,linewidth=0.8pt,arrowsize=3pt 2,arrowinset=0.25}
\psaxes[labelFontSize=\scriptstyle,xAxis=true,yAxis=true,Dx=1,Dy=1,ticksize=-2pt 0,subticks=2]{->}(0,0)(\viewleft,\Viewleft) (\viewright,\Viewright)
\rput{\rotate}(\center,\Center){\parametricplot{-0.99}{0.99}{\btl*(1-t^2)/(1+t^2)|\btn*2*t/(1+t^2)}}
\rput{\rotate}(\center,\Center){\parametricplot{-0.99}{0.99}{\btl*(-1+t^2)/(1+t^2)|\btn*(-2)*t/(1+t^2)}}
\psplot{\viewleft}{\viewright}{(--(\Center-\slope*\center)--\slope*x)/1}
\psplot{\viewleft}{\viewright}{(--(\Center-\Slope*\center)--\Slope*x)/1}
\rput[tl](\viewx,0.4){$x$}
\rput[tl](0.25,\Viewy){$y$}
\rput[tr](0.4,-0.25){$O$}
\psline[linestyle=dashed,dash=2pt 2pt](\center,\Center)(\center,0)
\psline[linestyle=dashed,dash=2pt 2pt](\center,\Center)(0,\Center)
\end{pspicture*}
\end{document}

Một trong các ưu điểm của một chương trình đại số máy tính là nó có thể thực hiện một khối lượng tính toán đồ sộ với thời gian “như trong nháy mắt” mà con người không đủ kiên nhẫn để thục hiện như ví dụ sau đây các bạn thay dòng 20 trong testelip.tex với số liệu mới như sau:

z:=2*x^2-3*x*y+3*y^2+x+7*y+1;

biên dịch lại theo đúng hướng dẫn ở trên ta có:

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s