Wolfram mathematica 如何直接从Solve的输出创建函数

Wolfram mathematica 如何直接从Solve的输出创建函数,wolfram-mathematica,Wolfram Mathematica,如果我计算Solve[f[x,y]==0,x],我会得到一系列解决方案,如: {{x->something[y]},{x->something}等 现在我想把这些x->somethings转换成一个函数。通常,我的要求很低,我的函数f[x]最多是一个立方体,对于x有简单的解决方案。所以我总是手动定义g1[y]:=something,g2[y]:=…等等 然而,对于我现在拥有的一个函数,Solve输出一个复杂的多项式,运行4页长,有4个这样的解决方案。我曾尝试使用Simplify、Collect、

如果我计算
Solve[f[x,y]==0,x]
,我会得到一系列解决方案,如:

{{x->something[y]},{x->something}

现在我想把这些
x->somethings
转换成一个函数。通常,我的要求很低,我的函数
f[x]
最多是一个立方体,对于
x
有简单的解决方案。所以我总是手动定义
g1[y]:=something
g2[y]:=…
等等

然而,对于我现在拥有的一个函数,
Solve
输出一个复杂的多项式,运行4页长,有4个这样的解决方案。我曾尝试使用
Simplify
Collect
Factor
等简化表单,但它似乎无法简化

是否有一种方法可以自动将它们分配给函数?(滚动浏览页面并复制每一页非常困难……我必须寻找下一页的开始位置!)


类似于:
{g1[y],g2[y],g3[y]}=解算的输出

这里有一个简单的解决方案,可以清理

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])}}
[1]中的
:=solns=Solve[x^2+ax+b==0,x]
Out[1]={{x->1/2(-a-Sqrt[a^2-4b])},{x->1/2(-a+Sqrt[a^2-4b])}
在[2]:=表[Symbol[“g”ToString[i]][a_u,b_u]:=Evaluate[x/.solns[[i]],
{i,长度[solns]}];
在[3]:=DownValues/@{g1,g2}
Out[3]={{HoldPattern[g1[a_,b_]]:>1/2(-a-Sqrt[a^2-4b]),
{HoldPattern[g2[a_,b_]]:>1/2(-a+Sqrt[a^2-4b])}

似乎Simon抢先给了我一个答案(我很高兴StackOverflow给了我一个弹出窗口让我知道!),因此我将采取不同的方法。您应该知道如何直接使用Solve的输出,因为很多时候这样做会很方便

ClearAll[a, x, sols]

sols = Solve[x^2 + a x + 1 == 0, x]
这里有一些你可以做的事情


a==7

绘制解决方案 此处使用
Evaluate
并非出于基本功能的需要,而是为了允许绘图功能分别设置每个解决方案的样式

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


为第二个解决方案定义一个新函数
a
注意这里使用的是
=
而不是
:=

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

下面是Simon为每个解决方案定义函数的方法的替代方法 然后,该函数与语法
gg[1][17]
一起使用,表示第一个解决方案,
a==17

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

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


这些使用通常要求
a
(在本例中)保持未分配状态。

以下函数将自动将
Solve
的输出转换为函数列表(当然假设
Solve
找到解决方案):

以下是一个例子:

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])}
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
如果
Solve
找不到任何解决方案,该功能将失败:

In[70]:= Through[g[1]]
Out[70]= {1/2 (-1-I Sqrt[3]),1/2 (-1+I Sqrt[3])}
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)] }

以下是最简单的方法:

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]

这真的很酷。谢谢通过将解算结果转换为函数,我可以在绘图中使用操纵。差不多

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,我想上面有些x是错的。您的
Solve[f[x]==0,x]
不应返回依赖于x的东西,因此将f[x]:=分配给没有x的东西似乎毫无意义。@belisarius同意。我没有把它写清楚。我已经编辑了我的帖子。如果解决方案只是混乱的立方体和四次方,那么您可以使用选项
cubics->False
quartics->False
使
Solve
返回一个
Root
对象。这看起来更简单,在计算时可能更快更准确。@Simon:
Solve
不使用选项
Cubics/Quartics
,但
Reduce
有效。o'b:该选项在版本8中添加到
Solve
,弹出窗口非常方便!鉴于此,我知道您将学习我使用的
SetDelayed[…,Evaluate[…]]
,而不仅仅是
Set[…,…]
@Wizard先生@Simon什么弹出窗口?我从来没有得到一个弹出窗口,即使整个军队都在我前面张贴过。@Sjoerd这很有趣。如果有人在我撰写我的答案时发布了答案(在答案框中键入),我会在屏幕顶部看到一个橙色条,就像“你赢得了某物徽章…”(意译).@Mr.Wizard可能是NoScript阻止了什么,但是我允许这里嵌入的大多数服务…@Sjoerd如果你在Meta上询问这个问题,请发布一个链接。我很好奇。这里的一般想法是:必须有一种更好的方法来做这件事,而不是将所有的
保留在[]
中,而
保留在[]
中。复制和粘贴是很自然的,这打破了这一点。我在[xx]:=中省略了
,但在我的答案中保留了
的[xx]=
。你认为在输入和输出代码之间划一条分界线怎么样?你认为这可以理解吗?@Wizard先生:我不确定。。。这是在屏幕/站点上清晰显示和便于传输到笔记本电脑之间的平衡。我想我更喜欢像这样简单的答案,为了清晰起见,我离开了。对于较长的多行代码,我只将第一个
放在[]
中(就像Mma一样),这样就可以很容易地复制它。但这都是品味的问题…@先生,每次我发布Mma代码时,我都必须思考如何做同样的事情。而且总是会说“一定有更好的方法去做”,但从来没有发现it@belisarius@Simon你认为关于这一点的问题/讨论适合Meta吗?@先生,我认为Meta不欢迎关于晦涩标签的狭隘话题。我创建了一个聊天室。让我们看看它是否有效。不知道如何宣传它的存在。
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}]