Как создать функцию прямо из вывода Solve - PullRequest
9 голосов
/ 16 марта 2011

Если я оцениваю Solve[f[x,y]==0,x], я получаю кучу решений, таких как:

{{x -> something g[y]}, {x -> something else}} и т. Д.

Теперь я хочу преобразовать каждый из этих x->somethings в функцию,Как правило, мои требования невысоки, и моя функция f[x] является не более кубической, с прямыми решениями для x.Поэтому я всегда просто определяю g1[y_]:=something, g2[y_]:=... и т. Д. Вручную.

Однако для функции, которую я сейчас имею, Solve выводит сложный многочлен длиной 4 страницы, и есть 4такие решения.Я пытался свести к более простым формам, используя Simplify, Collect, Factor и т. Д., Но это просто кажется неприводимым.

Есть ли способ, которым я могу автоматически назначать их функциям?(Очень трудно пролистывать страницы и копировать каждую из них ... и мне нужно искать, где начинается следующая!)

Что-то вроде: {g1[y_], g2[y_], g3[y_]} = output of Solve?

Ответы [ 5 ]

7 голосов
/ 16 марта 2011

Похоже, Саймон опередил меня в ответ (я рад, что StackOverflow выдает мне всплывающее окно, чтобы сообщить мне!), Поэтому я выберу другой подход.Вы должны знать, как использовать выходные данные Solve напрямую, поскольку довольно часто это будет удобно делать.

Начиная с

ClearAll[a, x, sols]

sols = Solve[x^2 + a x + 1 == 0, x]

Вот несколько вещей, которые вы можете сделать.


Найдите решения для x для a == 7

x /. sols /. a -> 7

График решений

Evaluate используется здесь не вненеобходимость в базовой функции, но чтобы позволить функции Plot стилизовать каждое решение отдельно

Plot[Evaluate[x /. sols], {a, 1, 4}]

enter image description here


Определить новую функцию a для второго решения

Обратите внимание на использование = вместо := здесь

g[a_] = x /. sols[[2]]

Вот альтернатива методу Саймона для определения функций для каждого решения

MapIndexed[(gg[#2[[1]]][a_] := #) &, x /. sols]

Затем функция используется с синтаксисом gg[1][17] для обозначения первого решения, а a == 17

Plot[gg[1][a], {a, 1, 4}]

gg[2] /@ {1, 2, 3}

Для этих целей обычно требуется, чтобы a (в этом примере) оставалосьUnassigned.

1 голос
/ 16 марта 2011

Вот простое решение, которое можно очистить

In[1]:= solns = Solve[x^2+a x+b==0, x]
Out[1]= {{x -> 1/2 (-a-Sqrt[a^2-4 b])}, {x -> 1/2 (-a+Sqrt[a^2-4 b])}}

In[2]:= Table[Symbol["g"<>ToString[i]][a_,b_] := Evaluate[x/.solns[[i]]],
              {i,Length[solns]}];

In[3]:= DownValues/@{g1,g2}
Out[3]= {{HoldPattern[g1[a_,b_]]:>1/2 (-a-Sqrt[a^2-4 b])},
         {HoldPattern[g2[a_,b_]]:>1/2 (-a+Sqrt[a^2-4 b])}}
0 голосов
/ 14 ноября 2014

Это действительно круто. Благодарю. Преобразовав результаты Solve в функции, я мог бы использовать Manipulate in Plot. Что-то вроде

In[73]:= g = solutionFunctions[x^2 + a x + b == 0, x]
Out[73] = {Function[{a, b}, 1/2 (-a - Sqrt[a^2 - 4 b])], 
  Function[{a, b}, 1/2 (-a + Sqrt[a^2 - 4 b])]}

In[74]:= Manipulate[Plot[g[[1]][a, b], {a, 0, 4}], {{b, 1}, 0, 10}]

И вы получите график, где вы можете манипулировать параметром b

0 голосов
/ 18 апреля 2014

Вот самый простой способ:

In[1]:= f = Solve[x^2 + ax + 1 == 0, x]
Out[1]= {{x -> -Sqrt[-1 - ax]}, {x -> Sqrt[-1 - ax]}}

In[2]:= g1[y_] := x /. f[[1]] /. a -> y
        g2[y_] := x /. f[[2]] /. a -> y

In[4]:= g1[a]
        g2[a]

Out[4]= -Sqrt[-1 - ax]
Out[5]= Sqrt[-1 - ax]
0 голосов
/ 22 января 2012

Следующая функция автоматически преобразует вывод Solve в список функций (при условии, что Solve найдет решения, конечно):

solutionFunctions[expr_, var_] :=
  Check[Flatten @ Solve[expr, var], $Failed] /.
    (_ -> x_) :>
      Function[Evaluate[Union @ Cases[x, _Symbol?(!NumericQ[#]&), Infinity]], x]

Вот пример:

In[67]:= g = solutionFunctions[x^2+a x+1==0, x]
Out[67]= {Function[{a},1/2(-a-Sqrt[-4+a^2])],Function[{a},1/2(-a+Sqrt[-4+a^2])]}

Функции можно вызывать по отдельности:

In[68]:= g[[1]][1]
Out[68]= 1/2 (-1-I Sqrt[3])

In[69]:= g[[2]][1]
Out[69]= 1/2 (-1+I Sqrt[3])

Или все функции можно вызывать сразу, чтобы вернуть все решения:

In[70]:= Through[g[1]]
Out[70]= {1/2 (-1-I Sqrt[3]),1/2 (-1+I Sqrt[3])}

Функция не будет выполнена, если Solve не сможет найти решения:

In[71]:= solutionFunctions[Log[x]==Sin[x],x]
During evaluation of In[71]:=
  Solve::nsmet: This system cannot be solved with the methods available to Solve.
Out[71]= $Failed

Переменные автоматически идентифицируются:

In[72]:= solutionFunctions[a x^2 + b x + c == 0, x]

Out[72]= { Function[{a, b, c}, (-b - Sqrt[b^2 - 4 a c])/(2 a)],
           Function[{a, b, c}, (-b + Sqrt[b^2 - 4 a c])/(2 a)] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...