【问题标题】:Mathematica Solve[] returns function with variable slotsMathematica Solve[] 返回具有可变槽的函数
【发布时间】:2014-07-16 14:33:49
【问题描述】:

当我在 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。任何帮助将不胜感激,谢谢!

【问题讨论】:

标签: vb.net wolfram-mathematica


【解决方案1】:

这更像是一个数学问题而不是编程问题。事实上,有很多数学函数的根无法用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]

现在,您当然可以使用Root 对象编写函数f 来帮助您探索发生了什么。

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}]

【讨论】:

  • 我怎样才能让 Mathematica 给我一个以 x 表示的十进制近似值,以便我可以在 VB 中使用近似公式?
  • @PGmath 您不能使用 Mathematica 或任何其他程序 - 这才是重点。不过,正如我在编辑中所展示的,编写一个接受 x 的十进制输入并返回十进制输出的函数很容易。
  • 我想我的问题是如何在 VB.net 中编写这样的函数。感谢您的耐心等待。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-20
  • 2011-11-02
  • 2013-03-20
  • 2020-10-21
  • 2015-03-06
  • 2015-10-14
相关资源
最近更新 更多