newton.mws
  Рихвицкий В.С.  

Поиск минимума с применением метода Ньютона

> with(linalg): with(plots): with(codegen): currentdir(`c:/rqvtsk/test`);

     Это демонстрационный пример автоматического построения
вычислительой программы на Паскале.
Пусть ищется минимум функции двух переменных

                            F:=subs(x=x+1,y=y+1,(A*arcsin(x)^2+B*arcsin(y)^2));

      зависящей от переменных

                            V:=[x,y];

F := A*arcsin(x+1)^2+B*arcsin(y+1)^2

V := [x, y]

>   Это график функции:

              plot3d(subs(A=1,B=1,F),x=-3.1..1.1,y=-3.1..1.1,axes=boxed,orientation=[145,82]);

[Maple Plot]

>  Условием минимума является равенство нулю градиента функции

                G:=grad(F,V);

G := vector([2*A*arcsin(x+1)/(sqrt(-x^2-2*x)), 2*B*...

>  Метод решения (уже на Паскале) содержит итерацию

                                     V = V - H^(-1) G

                H:=hessian(F,V);

H := matrix([[2*A/(-x^2-2*x)-A*arcsin(x+1)*(-2*x-2)...

>   Для реализации программы на Паскале изготавливаются сначала процедуры
  (в Maple)

           GProc:=makevoid(makeproc(G,parameters=V,globals=[A,B]));

GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...
GProc := proc (x, y) local G; global A, B; G := arr...

и

            HProc:=makevoid(makeproc(H,parameters=V,globals=[A,B]));

HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...
HProc := proc (x, y) local H; global A, B; H := arr...

  Затем они записываются в файл test2.txt на языке C

     writeto(`test2.txt`):
        C(GProc,optimized);
        C(HProc,optimized);
     writeto(terminal);

0

  и перерабатываются в модуль test2.pas на Паскале
    (который, быть может использует модуль test1.pas)

          system(`c2pas test2(test1)`);

0

   Главная программа test.pas и модуль test1.pas пишутся
 программистом и содержат все, что программист пожелал
 сделать традиционным путем.
    Далее программа обычным путем транслируется, выполняется
 и получается результат,
 который в данном случае мог быть получен аналитически:

            {solve(convert(subs(A=1,B=1,G),set),{x,y})};

{{y = -1, x = -1}}

>

 Рихвицкий В.С.  

Хостинг от uCoz