Вычислить все шаги в направлении локальных экстремумов для функции с несколькими переменными - PullRequest
0 голосов
/ 24 ноября 2011

Я пытаюсь создать скрипт Mathematica, который принимает в качестве входных данных функцию двух переменных и, в свою очередь, вычисляет все необходимые шаги (поиск корней первых частных производных, проверка соответствующих условий 2-го порядка) в подробном виде (например, показать все частные производные), чтобы найти локальные экстремальные точки.

Большая часть этого проста, моя самая большая проблема заключается в том, как использовать корни, найденные Solve[] в последовательных вычислениях.Я начал так:

f[x_,y_] :=  y^3 -3 x^2 y
dfx[x_,y_]:=D[f[x,y],x]
dfy[x_,y_]:=D[f[x,y],y]
dfxx[x_,y_]:=D[f[x,y],x, x]
dfyy[x_,y_]:=D[f[x,y],y, y]
dfx[x_,y_]:=D[f[x,y],x]
dfxy[x_,y_]:=D[f[x,y],x,y]
dff[x_,y_]:=dfxx[x,y]*dfyy[x,y]-(dfxy[x,y])^2
Solve[{dfx[x,y]==0, dfy[x,y]==0},{x,y}]
Apply[dff, %]
Evaluate[dff[%]]

Я застрял здесь, любая помощь была бы фантастической!

Ответы [ 2 ]

7 голосов
/ 24 ноября 2011

Может быть немного проще, если мы используем немедленные, а не отложенные присвоения для этих производных. (Если вы хотите, чтобы что-то более общее, то есть обрабатывало произвольные функции f, его было бы не слишком сложно модифицировать с помощью локальных переменных.) Я использую новую функцию, которая имеет несколько критических точек.

f[x_, y_] := y^4 - y^3 - 3 x^2 y + x^4
dfx[x_, y_] = D[f[x, y], x];
dfy[x_, y_] = D[f[x, y], y];
dfxx[x_, y_] = D[f[x, y], x, x];
dfyy[x_, y_] = D[f[x, y], y, y];
dfxy[x_, y_] = D[f[x, y], x, y];
dff[x_, y_] = dfxx[x, y]*dfyy[x, y] - (dfxy[x, y])^2;
solns = {x, y} /. Solve[{dfx[x, y] == 0, dfy[x, y] == 0}, {x, y}];
realsolns = Select[solns, FreeQ[#, Complex] &]

Вот точки решения.

Out[87]= {{0, 0}, {0, 3/4}, {-(3/2), 3/2}, {3/2, 3/2}}

Теперь можно применить второй производный якобиан к каждому, как показано ниже.

In[88]:= jacs = dff @@@ realsolns

Out[88]= {0, -(81/8), 243, 243}

Даниэль Лихтблау Wolfram Research

1 голос
/ 24 ноября 2011

Как насчет этого:

solns = Solve[{dfx[x, y] == 0, dfy[x, y] == 0}, {x, y}]
CheckSoln[soln_] := 
  (
    hessianDet = ReplaceAll[dff[x, y], soln];
    Print["First order condition solution: ", soln, 
        "; has Hessian determinant=", hessianDet
    ];
  )
Map[CheckSoln, solns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...