作者ptx03 (改昵称是宅宅)
看板MATLAB
标题[问题]请问matlab一元五次方程式的数值计算问题
时间Mon Oct 21 22:21:50 2013
想请问板上前辈
小弟我目前用matlab 解一元五次方程式的根
由於原来的方程式系数order差异很大
所以我利用 x = m*y+n 调整 m 和 n 的大小
将原本的方程式改为 p 其中 p 的系数表示如下
p = [a1 a2 a3 a4 a5 a6]
a1 = 1
a2 = -8.3253840053406076293640580843203
a3 = 27.724839697799051663196223671548
a4 = -46.164094636185041053977329283953
a5 = 38.433515602069739713897433830425
a6 = -12.799010656064368163242761511356
由 p 可以利用 roots(p) 解出方程式的根 r1~r5
r1 = 1.6633 + 0.0061i
r2 = 1.6633 - 0.0061i
r3 = 1.6668
r4 = 1.6660 + 0.0000i
r5 = 1.6660 + 0.0000i
由上可以知道有一实根在 1.6668 附近
所以我选择 y = 1.665:0.00001:1.667; 的区间对 p 做图
以下为结果
http://imgur.com/Mg775kN
可以发现在这范围内的图型上下震荡的很严重
但是我输入的是很单纯一元五次函数阿
造成这样的原因是matlab本身的问题,还是函数精度的问题呢?
有劳各位前辈解惑,谢谢! <(_ _)>
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.233.148.147
1F:→ ejialan:浮点数误差造成的 看起来振的很严重 那是因为order在1E-14 10/22 09:48
2F:→ ejialan:由他给出的五个解看来 实部都很接近 虚部很小 粗略的看 10/22 09:52
3F:→ ejialan:会视为五重根 所以在解附近的一个区间都会很接近0 10/22 09:53
4F:→ ptx03:那请问这种情况可以用什麽方式改善吗? 还是可以再调整精度计 10/22 13:46
5F:→ ptx03:计算呢? 10/22 13:46
6F:推 alamabarry:怎麽感觉变成单精度的浮点运算? 10/22 14:22
7F:→ alamabarry:不过我印象中浮点运算误差大概是这个量值 10/22 14:22
8F:→ alamabarry:输入eps看看 10/22 14:23
9F:→ ptx03:我目前只用过vpa,eps没有用过,可以请教一下他的功用吗? 10/22 14:54
10F:→ ptx03:欧欧!他是看电脑能分辨的最小值吗? 10/22 14:58
11F:→ ptx03:我输入以後得到的是2.2204e-016 10/22 14:59
12F:→ ptx03:所以表示我这附近的数值运算是无法再调整了吗 @_@ 10/22 14:59
13F:→ ptx03:还是可以重新定义eps让它变得更小?增加计算精度? 10/22 15:08
14F:→ H45:呃..还有个 realmin.. 10/22 17:40
15F:→ H45:你研究一下 1 + 0.1 * eps, 1 + eps, realmin, 0.5 * realmin 10/22 17:42
16F:→ H45:上面这些数值 (在双倍精度浮点数下) 哪些会相等 10/22 17:43
18F:推 alamabarry:如果你真的要很准的解~~五次方还是有公式解 10/22 18:38
19F:→ alamabarry:但可能就要先用符号运算去处理了~~再把他数值化 10/22 18:38
20F:→ alamabarry:如果你是要实数解而已 可以用fzero去收敛 10/22 18:40
21F:→ alamabarry:roots 好像是利用矩阵的方法去求解的 很容易跑出复数 10/22 18:41
22F:推 profyang:我怎麽记得四次以上就没有公式解了@@好像还有证明 10/22 20:15
23F:→ ptx03:五次方程式除了特殊型式外是没有公式解的 Q_Q 10/22 20:44
24F:→ ptx03:我有用fzero去做,但是那附近震荡很严重,fzero也算不准 10/22 20:46
25F:→ ptx03:我是需要用到所有的根,所以要使用roots。之所以画图是要验 10/22 22:24
26F:→ ptx03:证roots的精准性。 10/22 22:25
27F:推 alamabarry:抱歉记错了~~四次以下~~ 10/22 23:41
28F:推 profyang:实数解的话 试过牛顿法吗?还是fzero就是= =" 10/23 05:36
29F:推 profyang:不过震成这样牛顿法应该也不会准... 10/23 08:15
30F:→ ptx03:所以这种情形是无法避免的事吗? 10/23 15:13
31F:→ ptx03:但是double精度不是可以计算到e-308以下吗? 10/23 15:14
32F:→ ptx03:这样看起来就很矛盾,有前辈可以解释一下吗? 10/23 15:15
33F:推 ejialan:realmin是指他机器最小的浮点数 实际运算还是只有到eps 10/23 15:50
34F:→ ejialan:而且会因为舍入误差再吃掉一些 就造成振荡的情形 10/23 15:51
35F:→ ejialan:如果真的要求很准的根可能要用多精度计算了 10/23 15:52
37F:推 alamabarry:fzero 印象中是混合法 好像也包含二分 和牛顿等等 10/23 18:03
38F:→ alamabarry:只能找实数的根 重根可能就比较危险一点 10/23 18:04
39F:→ alamabarry:roots 好像是把它当成特徵方程式 建构出一个矩阵 10/23 18:05
40F:→ alamabarry:用一些分解法去求出特徵值 QZ分解? 10/23 18:05
41F:→ alamabarry:所以会算出复数的解 10/23 18:05
42F:→ alamabarry:不过太详细的内容不清楚 10/23 18:06
43F:→ alamabarry:如果把你的数值代入整数还会这麽震荡吗 10/23 18:06
44F:→ ptx03:整数?是指a1~a6都带整数吗? 10/23 19:13
45F:推 alamabarry:恩~~因为之前有做过类似的~但没有变动这麽剧烈 10/23 22:58
46F:→ ptx03:不这样又会产生另一个问题! 原本方程式的系数差异非常大 10/23 23:03
47F:→ ptx03:最大和最小比例是1:10^22,要是改动系数那结果就会差很多 10/23 23:04
48F:推 alamabarry:单纯觉得有可能是因为位数太多而产生计算的误差 10/23 23:53
49F:→ alamabarry:可以测试一下厘清原因在哪 10/23 23:53
50F:→ ptx03:那我可以使用vpa来计算吗?把小数位精度调整? 10/24 00:03
51F:推 WRO:印象中超过四次还是有精确公式解,只是这个『公式』内含类似 10/28 13:04
52F:→ WRO:双曲函数或三角函数等等,也就是无法将方程式系数透过有限次的 10/28 13:05
53F:→ WRO:加、减、乘、除、开根号操作得出根,这也是普遍所指的『公式 10/28 13:06
54F:→ WRO:解』。所以精确的"五次公式解"印象中应该还是存在的 10/28 13:08
55F:推 WRO:如果你愿意接受公式内有包含加、减、乘、除、开根号以外的动作 10/28 13:10
56F:→ ptx03:要用Θ函数和戴德金η函数才能建构出来。 10/28 23:39
57F:→ ptx03:然而这两种函数会花费大量运算的时间,五次函数是我程式的一 10/28 23:40
58F:→ ptx03:小部分,不能花太多时间的 10/28 23:41