Maplet Programming

Phương pháp Newton cho hệ phi tuyến


Lý thuyết xấp xỉ nghiệm của hệ phi tuyến tổng quát bằng phương pháp Newton có thể xem trong bài báo dưới đây 

http://benisrael.net/Newton-MP.pdf

Ở đây giới thiệu maplet cho bài xấp xỉ nghiệm của hệ phi tuyến bẳng phương pháp Newton hiểu theo nghĩa cổ điển.

Thí dụ giải hệ phương trình x^3-y+1=0, 2x+y+3=0

Trước hết lập một vài procedure cần thiết

> with(LinearAlgebra): with(MTM):
> F:=proc(F1,F2,x,y) local f1,f2;      # Lập vector hàm
f1:= proc (x,y) options operator, arrow; F1 end proc;
f2:= proc (x,y) options operator, arrow; F2 end proc;
return (Vector([f1(x,y),f2(x,y)]));
end proc:

> JacobianMatrix := proc (F1,F2,x,y) local f1,f2;    # tính ma trận Jacobian
f1:= proc (x,y) options operator, arrow; F1 end proc;
f2:= proc (x,y) options operator, arrow; F2 end proc;
return (jacobian(Vector([f1(x,y),f2(x,y)]),Vector([x,y])))
end proc:

> V := proc (n::nonnegint,F1,F2,x,y)  #  Tìm nghiệm gần đúng bằng đệ quy
if n = 1 then return Vector([-1, 1]);             
         else return (
V(n-1,F1,F2,x,y)-MatrixVectorMultiply(
MatrixInverse(eval(JacobianMatrix(F1,F2,x,y),[x=V(n-1,F1,F2,x,y)[1],y=V(n-1,F1,F2,x,y)[2]])),
eval(F(F1,F2, x,y),[x=V(n-1,F1,F2,x,y)[1],y=V(n-1,F1,F2,x,y)[2]] ))                     );
end if;
end proc:

> U:=proc(F1,F2,x,y,e) local n;  # Tìm nghiệm gần đúng với sai số là  e
n:=1;
while (VectorNorm(V(n+1,F1,F2,x,y)-V(n,F1,F2,x,y))> e) do
           n:=n+1; end do;  
return(evalf(V(n,F1,F2,x,y)));
end proc:

Có thể test một số hệ phương trình hai biến (dĩ nhiên có thể xảy ra trường hợp phương trình vô nghiệm, hoặc không hội tụ, tuy nhiên trong giải thuật ở trên được xin bỏ qua những điều này, việc bổ sung và tổng quát giải thuật không có nhiều khó khăn), chẳng hạn với ví trên

>  U(x^3-y+1, 2*x+y+3, x, y, 1/1000000);

Kết quả:  x=-1.179509057, y=-0.6409818860

Lập một maplet là bước cuối cùng để thu được sản phẩm phần mềm hữu ích
> with(Maplets[Elements]):

> maplet := Maplet(
Window(‘title’ = “Solving System of Equations”, ‘toolbar’ = ‘TB’,
[[“Enter the 1st function with variables x,y”], [TextField[‘f1’](30)],
[“Enter the 2nd function with variables x,y”], [TextField[‘f2’](30)],
[“Enter tolerance”, TextField[‘e’](12)],
[“Solution”],[MathMLViewer[‘ML’]()]]),

ToolBar[TB](
ToolBarButton(caption = “Do It”, image = Image(“run.png”), onclick=Evaluate(‘ML’=’U(f1,f2,x,y,e)’)),
ToolBarSeparator(),
ToolBarButton(caption = “About”, image = Image(“about.png”), onclick = RunDialog(‘DG’)),
ToolBarSeparator(),
ToolBarButton(caption = “Exit”, image = Image(“exit.png”), onclick = Shutdown())),
 
MessageDialog[DG](“Solving System of Equations. Copyringt (C) 2009 Mathematical Diary”)):

> Maplets[Display](maplet);

systemeq

Maplet Programming

Popup Menu


PopupMenu là một đối tượng dạng menu xuất hiện khi ta kích chuột phải trên cửa sổ ứng dụng, hoặc cục bộ trên các đối tượng TextBox hoặc TextField. Như vậy nó là được coi như là một option của Window hoặc của đối tượng TextBox, TextField. PopupMenu bao gồm các Menu, MenuSeparator, MenuItem.

Thí dụ sau đây về ứng dụng tính đạo hàm của hàm hai biến. Trong đó một TextField để input hàm hai biến cần tính, PopupMenu của nó gồm:

– Menu: gồm hai ItemMenu tương ứng với hai chứng năng là tính đạo hàm theo x hoặc theo y và output ra một MathMLViewer.

– MenuSeparator (dấu ngăn cách)

– MenuItem: Thoát khỏi ứng dụng.

Thực hiện như sau

> with(Maplets[Elements]):

> MyMaplet := Maplet(Window(title=”Differentiate Calculator”,

[

[“Enter a function with variables x and y”],

TextField[‘TF’](‘popupmenu’ = ‘PM’, ‘value’ = “cos(x^2)+sin(x*y^2)”),

[“The result is”],

MathMLViewer[‘ML’](),

Button(“Exit”, Shutdown())

]),

PopupMenu[‘PM’](

Menu(“Differentiate”,

MenuItem(“With respect to x”, Evaluate(‘ML’ = ‘diff(TF, x)’)),

MenuItem(“With respect to y”, Evaluate(‘ML’ = ‘diff(TF, y)’))

),

MenuSeparator(),

MenuItem(“Exit Maplet application”, Shutdown())

)

):

> Maplets[Display](MyMaplet)

Kết quả ta được

PopupMenu

Maplet Programming

Tool Bar


Tool Bar – Thanh công cụ là đối tượng thường thấy trong các cửa sổ chương trình ứng dụng, nó là một dãy các nút công cụ được xếp trên một thanh thường nằm ở vị trí ở lề dọc hoặc lề ngang. Nó cũng đồng chức năng như button hay menu tuy nhiên thân thiện và dễ sử dụng hơn. Chúng ta sẽ làm quen với đối tượng Toolbar trong một ứng dụng Maplet.

Cú pháp chung

> with(Maplets[Elements]):

> MyMaplet := Maplet(Window(‘title’ = “My Maplet Application”, ‘toolbar’ = ‘TB’,

 [

# Phần thân của cửa sổ

]),

ToolBar[TB](

ToolBarButton(caption = “Tool 1”, image = Image(“image1.png”), onclick = <Command>),

ToolBarSeparator(),

ToolBarButton(caption = “Tool 2”, image = Image(“image2.png”), onclick =<Command>),

 ToolBarSeparator(),

….

ToolBarButton(caption = “Tool n”, image = Image(“imagen.png”), onclick = <Command>)

)):

> Maplets[Display](MyMaplet);

Trong đó chú ý các file hình ảnh phải được lưu cùng thư mục với file maple worksheet, và nếu bạn export thành file maplet thì cũng cần các file này đi kèm.

Thí dụ: Tạo một ứng dụng tính tích phân bất định với ToolBar có các chức năng:

– Run: Tính tích phân.

– About: Thông tin về ứng dụng

– Exit: Thoát khỏi chương trình.

Ta thực hiện như sau:

> with(Maplets[Elements]):

> myMaplet := Maplet(Window(‘title’ = “Integration calculator”, ‘toolbar’ = ‘TB’,

[[“Enter a function with variable x”],

[TextField[‘TF’](40)],

[“Result of integration”],

[MathMLViewer[‘ML’]()]]),

ToolBar[TB](ToolBarButton(caption = “Do It”, image = Image(“run.png”), onclick = Evaluate(‘ML’ = ‘Int(TF, x) = int(TF, x) + C’)),

ToolBarSeparator(),

ToolBarButton(caption = “About”, image = Image(“about.png”), onclick = RunDialog(‘DG’)),

ToolBarSeparator(),

ToolBarButton(caption = “Exit”, image = Image(“exit.png”), onclick = Shutdown())

),

MessageDialog[DG](“Integration Calculator. Copyringt (C) 2009 Mathematical Diary”)):

> Maplets[Display](myMaplet);

Các file nguồn, download ở đây (corrected)

Ta có kết quả là cửa sổ như sau

ToolBar

 Một số file hình ảnh mẫu có thể hữu ích bạn có thể tham khảo thêm ở đây