[問題] 使用while求多項式根問題QQ

看板C_and_CPP (C/C++)作者 (驚驚驚驚驚)時間14年前 (2012/03/18 15:18), 編輯推噓2(2010)
留言12則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) dev c++ 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): f(x)=X^6 -2.6X^5 +2.57X^4 -1.248X^3 +0.316X^2 -0.04X +0.002 利用指定g(x)=x+f(x) 進行迭代,直到小於設定的誤差 即當g(X0)=X0時 X0即為一根 根分別為1 0.5 0.5 0.2 0.2 0.2 但是使用while跑出來總是0.00000000... 餵入的資料(Input): 隨意,僅為初猜值 預期的正確結果(Expected Output): 根據fixed point方法 他應該是要跑出來6個根中的一個根... 錯誤結果(Wrong Output): 0.0000000000 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <stdlib.h> #include <math.h> int main(){ double g; double f; double x; printf("輸入初猜值"); scanf ("%f",&x); while(abs(g-x)>=0.002){ f=pow(x,6)-2.6f*pow(x,5)+2.57f*pow(x,4)-1.248f*pow(x,3)+0.316f*pow(x,2)-0.04f*x+0.002f; g=x+f; x=g; } printf("%.12f",x); system ("pause"); return 0; } 補充說明(Supplement): 無 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.118.198 ※ 編輯: billiron 來自: 59.112.118.198 (03/18 15:25)

03/18 15:33, , 1F
怎麼我學的定點迭代和你的定點迭代不一樣 Orz
03/18 15:33, 1F

03/18 15:34, , 2F
http://0rz.tw/sVkqK 定點點迭代未必可找到一個根,決定
03/18 15:34, 2F

03/18 15:34, , 3F
除了初值x0外,還相依於 g(x) 是如何表示。
03/18 15:34, 3F

03/18 15:35, , 4F
你已經做了 x = g 了 所以 abs(g-x)>=0.002 會不成立
03/18 15:35, 4F

03/18 15:35, , 5F
所以你的迭代只會做一次
03/18 15:35, 5F

03/18 15:39, , 6F
再者你的誤差值取太大了 即使這件事弄對了也容易得到錯誤值
03/18 15:39, 6F

03/18 15:39, , 7F
不說別的 f(0) 就是 0.002 所以如果你拿 0 當起始值的話
03/18 15:39, 7F

03/18 15:40, , 8F
第一步 g(0) = 0.002 就停了 一次迭代都沒做...
03/18 15:40, 8F

03/18 15:43, , 9F
最後一點 由於 f 有重根 在重根附近收斂會很慢很慢很慢
03/18 15:43, 9F

03/18 15:43, , 10F
例如你這方法就算拿 0.199 當起始值
03/18 15:43, 10F

03/18 15:44, , 11F
迭代一萬次只會得到 0.199001
03/18 15:44, 11F

03/18 15:45, , 12F
這是定點迭代法的問題之一
03/18 15:45, 12F
文章代碼(AID): #1FPOnUfh (C_and_CPP)
文章代碼(AID): #1FPOnUfh (C_and_CPP)