当我在Wolfram Mathamatica中求解高次多项式时,它返回一个带有可变槽(“#1”)的函数,如下所示:
In[1]:= Solve[p^4 + 4*p^4 (1 - p) + 10*p^4*(1 - p)^2 + 20*p^5*(1 - p)^3 + (
40*p^6*(1 - p)^4)/(1 - 2*p*(1 - p)) == x && 0 < p < 1 && 0 < x < 1, p, Reals]
Out[1]:= {{p -> Root[x - 2 x #1 + 2 x #1^2 - 15 #1^4 + 34 #1^5 - 28 #1^6 +
8 #1^7 &, 2]}
如何在没有变量插槽的情况下让它给我答案? 它不像需要更多信息,因为如果我为x赋值,它将完全评估表达式:
In[2]:= x=0.7
Out[2]:= 0.7
In[3]:= Root[x - 2 x #1 + 2 x #1^2 - 15 #1^4 + 34 #1^5 - 28 #1^6 + 8 #1^7 &, 2]
Out[3]:= 0.583356
Mathematica帮助在Root[]
的引用下显示了此语法,但没有给出任何解释。
我需要在VB程序中使用x的这个结果,所以我需要知道如何摆脱#1。非常感谢任何帮助,谢谢!
答案 0 :(得分:2)
这是一个数学问题,而不是编程问题。事实是,有许多数学函数具有无法在closed form中表达的根。经典的例子是the Abel-Ruffini theorem,它表明五度或更高的一般多项式的根不能以闭合的形式表示。表达这种多项式的根源的需要是Mathematica的Root
对象的全部目的。这是一个简单的例子:
roots = x /. Solve[x^5 - x - 1 == 0, x]
(* Out:
{Root[-1 - #1 + #1^5 &, 1], Root[-1 - #1 + #1^5 &, 2],
Root[-1 - #1 + #1^5 &, 3], Root[-1 - #1 + #1^5 &, 4],
Root[-1 - #1 + #1^5 &, 5]}
*)
这些是多项式根的精确表示。它们可以估计到你想要的任何精度:
N[roots, 20]
(* Out:
{1.1673039782614186843,
-0.76488443360058472603 - 0.35247154603172624932 I,
-0.76488443360058472603 + 0.35247154603172624932 I,
0.18123244446987538390 - 1.08395410131771066843 I,
0.18123244446987538390 + 1.08395410131771066843 I}
*)
现在,在你的情况下,你问的是$ p $中7度的合理函数是否等于$ x $。答案是
Root[x - 2 x #1 + 2 x #1^2 - 15 #1^4 + 34 #1^5 - 28 #1^6 + 8 #1^7 &, 2]
这告诉您需要
x - 2 x p + 2 x p^2 - 15 p^4 + 34 p^5 - 28 p^6 + 8 p^7 = 0
并没有更简单的封闭形式。现在,如果您设置x=0.7
或其他一些十进制近似值,那么您将获得对该特定x
值有用的数值估算值。不过,它仍然不是一个封闭的形式。为了进行比较,请尝试x=7/10
。你应该得到
x=7/10
Root[7 - 14 #1 + 14 #1^2 - 150 #1^4 + 340 #1^5 - 280 #1^6 + 80 #1^7 &, 2]
现在,您当然可以使用f
对象编写一个函数Root
,以帮助您了解正在进行的操作。
f[x_] = Root[x - 2 x #1 + 2 x #1^2 - 15 #1^4 + 34 #1^5 - 28 #1^6 + 8 #1^7 &,2];
f[0.7]
(* Out: 0.583356 *)
你甚至可以绘制它。
Plot[f[x], {x, 0, 1}]