Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wolfram mathematica 这是mathematica中的一个错误吗?_Wolfram Mathematica_Numerical Methods_Polynomial Math - Fatal编程技术网

Wolfram mathematica 这是mathematica中的一个错误吗?

Wolfram mathematica 这是mathematica中的一个错误吗?,wolfram-mathematica,numerical-methods,polynomial-math,Wolfram Mathematica,Numerical Methods,Polynomial Math,如果你要求Mathematica求多项式的根,无论你是用符号表示,还是用数字表示,它都会给出相同的(近似的)答案。下面是一个例子(在OS X上运行的Mathematica 7中),它严重失败: poly = -112 + 1/q^28 + 1/q^26 - 1/q^24 - 6/q^22 - 14/q^20 - 25/q^18 - 38/q^16 - 52/q^14 - 67/q^12 - 81/q^10 - 93/q^8 - 102/q^6 - 108/ q^4 - 111/q^2 -

如果你要求Mathematica求多项式的根,无论你是用符号表示,还是用数字表示,它都会给出相同的(近似的)答案。下面是一个例子(在OS X上运行的Mathematica 7中),它严重失败:

poly = -112 + 1/q^28 + 1/q^26 - 1/q^24 - 6/q^22 - 14/q^20 - 25/q^18 -
  38/q^16 - 52/q^14 - 67/q^12 - 81/q^10 - 93/q^8 - 102/q^6 - 108/
  q^4 - 111/q^2 - 111 q^2 - 108 q^4 - 102 q^6 - 93 q^8 - 81 q^10 -
  67 q^12 - 52 q^14 - 38 q^16 - 25 q^18 - 14 q^20 - 6 q^22 - q^24 +
  q^26 + q^28;

Total[q^4 /. NSolve[poly == 0, q]] - Total[q^4 /. N[Solve[poly == 0, q]]]
(注意:这实际上是一个洛朗多项式,如果你乘以q的大幂,问题就会消失。)

这里的最后一行只是一个例子,说明所找到的解决方案是非常不同的;事实上,这是我们在研究的问题中试图计算的数量

如果仔细观察
NSolve[poly==0,q]
N[Solve[poly==0,q]
的输出,您会发现,NSolve只给出了
54
根,而不是预期的
56
。这并不是因为它遗漏了一个重复的根或任何东西;它遗漏了两个最大的根(大约
+/-1.59

这是Mathematica中的错误吗?有人能解释为什么会发生这种情况吗


不幸的是,你的期望是没有根据的

正如您所说,
Solve[]
给出了一个精确的解,
N[]
引入了一个小错误,但在计算时只引入了一次。
Solve[]
另一方面使用了从开始到结束的数值近似值,因此可以累积显著的舍入误差

您还受到计算默认精度的限制,这可能导致数值方法完全失败,例如,缺少根(请参阅)。您可以通过告诉
NSolve[]
使用更高的精度来抵消这一点,如下所示:

In[1]  := Total[q^4 /. NSolve[poly == 0, q, WorkingPrecision -> 50]] - 
          Total[q^4 /. N[Solve[poly == 0, q]]]
Out[1] := 0. - 3.66374*10^-15 I

在使用数值方法时,务必牢记错误。因为这适用于从求解长多项式到对角化大矩阵到奇异函数积分等各种各样的问题。没有一种正确的方法,需要告诉Mathematica,例如,提高工作精度,或者应用一种不同的数值技术。

另外两个注释:1.
NSolve[]
支持一种缩写语法:
NSolve[poly,var,prec]
2。)在使用
NSolve[]
查找多项式根时,没有“不同的数值技术”;它只知道詹金斯·特劳布(本质上,这是一个奇特的瑞利商迭代);但是,我们可以构造Frobenius伴矩阵并使用特征值[]。这在v8中可能是新的,但NSolve肯定接受方法选项。在任何情况下,我谈论的是一般的数值方法。