数学建模社区-数学中国

标题: 一个比较简单的三次方程怎么mathematica算出来3个复根呢? [打印本页]

作者: ntf198602    时间: 2012-12-17 16:25
标题: 一个比较简单的三次方程怎么mathematica算出来3个复根呢?
如题,我的问题如下:- H, u, r9 Q& g+ y* G- t5 @
如果不赋值的话,
  1. Clear["`*"];! ]& a# E/ p& I8 f, g# o
  2. Solve[4 (a + b (c - 2 w)) (a + b (c + 4 c r - 2 (w + 2 r w))) +
    ' \3 U0 y0 J7 }+ H- c8 x* V4 H; c1 ]
  3.    4 b (-a + b c) r (c - w)^2 (a + 1 F6 Y4 I) T& Y9 C- _; n9 @
  4.       b (c + 2 c r - 2 (1 + r) w)) \[Rho]r == 0, w]
复制代码
这样会得到数值结果,看起来应该是1个实数根和两个复根,这个我比较满意,而且我也希望是这个结果。
1 N% ~  V% j2 G* Z* y/ k* [然而,我赋值进去算过之后发现:
  1. Clear["`*"];% s. E+ z! q& Z% v& v+ m5 ~
  2. a = 10; b = 2; c = 3; r = 1; \[Rho]r = 1.5;- r  D( R: i8 h# `/ F5 c8 x
  3. Solve[4 (a + b (c - 2 w)) (a + b (c + 4 c r - 2 (w + 2 r w))) +
    : b: p, h* e5 z* h2 s. r* d
  4.    4 b (-a + b c) r (c - w)^2 (a +
    0 |+ k6 y- _' v( E9 A
  5.       b (c + 2 c r - 2 (1 + r) w)) \[Rho]r == 0, w]
复制代码
其结果如下:
, ]1 k4 Q. b: i. v: H% b8 l4 t9 s. w{{w -> 2.0793}, {w -> 3.28456}, {w -> 3.63614}}% |/ f  V/ o$ I
可以看到,分明是同样的一个方程,为什么赋值与不赋值得到的复根数量不一样呢?为什么赋值之后是3个实数根。太奇怪了,应该也是2个复根和一个实数根才对啊?" @) _; ]( M9 Q, F6 B* y& Q
还有,我将不赋值的情况所求得的那三个根分别赋值计算发现,这3个又都是复根了,连那个看上去是实数根(看上去是实数根是因为我在里面没有发现复根的标志i)的根都变成了复根了。真的太奇怪了。求高人解释为什么会出现这种情况呢?到底最后有几个复根和几个实数根啊?难道mathematica算的结果不可以令人相信吗?大家只要代入算一下就马上又结果,很快的。
作者: ntf198602    时间: 2012-12-17 16:25
自己先顶一个吧
作者: zhb    时间: 2012-12-17 19:46
表示看的不是恒明白。。
作者: ntf198602    时间: 2012-12-17 23:56
zhb 发表于 2012-12-17 19:46 + q0 N) J, ]  |1 r7 a$ a
表示看的不是恒明白。。

. q' ^, w9 v+ v8 W问题应该比较清楚了吧。请复制“不赋值”的那4行代码,然后在mathematica里面计算一下,会得到3个解,其中第一个解显示为实数根(原因是表达式里面没有虚部),而后面两个是复根(因为它们都有虚部)。* R0 R0 z6 E/ K( Y! m1 B
然后,复制“赋值”的情况,那就是另外5行代码,算一下,结果为3个实数根,我在问题里面都写出来了。同样的方程,只不过一个赋值了一个没有赋值,是符号计算,为什么实数根和复根的个数在两种情况下不一样呢。复根不可能变成实数根的,相反也是一样。这里可能的原因,我猜可能是因为误差的原因。但是,到底这个方程有几个实数根和几个复根呢。不可能说,在这种赋值下有2个复根,在另外情况下有3个复根的。
作者: ntf198602    时间: 2012-12-18 16:47
还没有高手进入阿
作者: linanisyugioh    时间: 2013-4-22 21:00
mathematica默认所有的变量都是复数,所以算出表达式里有i不一定根就是复的,因为如果考虑到你给的a,b,c什么的都有可能含有虚数的成分的话,会把i抵消成一个实根也不一定的。不知道这么说你明不明白?
作者: linanisyugioh    时间: 2013-4-22 21:19
另外,mathematica里面,其实不只mathematica,整个计算机里面,计算机里面储存的0其实都很有可能并不是严格的0,而是一个很小的数,比如10的-17次方什么的,反过来也有可能把一个很小的数,比如10的-16次方什么的当做零来处理,总之呢,就是有个精度问题的,计算机是无法做到理想中的百分之百精确的。你用mathematica解出来的那个解析符号解是个很精确的表达式,这点是毋庸置疑的,如果你把那个几个参数代进去如果你肯手动计算应该是可以把虚数部分消掉的,但是计算机算的话,就有可能因为精度问题而把本来是零的虚部以很小的一个数给保留下来。相信你代进那个解析解去的话,也会发现,虚部是个非常非常非常非常小的数,而实部就是你想要的结果。! p" N- y1 w3 e6 Q, c" x% Q. l" d
你如果是解之前就把各项系数都代进去得到一个各项系数都确定的方程,系统会自行判断得到的解是虚数还是实数什么的,就会算出一个数值结果的。




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5