看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《htonton (東)》之銘言: : 問題(Question): : 一個方程式f(x)=x^4-9x^3-2x^2+120x-130 上網先找 "數值分析 非線性方程式" 目前我所知道的方法大概有 二分法、定點回路法、牛頓法、割線法 比較好用、常用的我認為是二分法、牛頓法 : 要用f(a)*f(b)<0 的方式逼出解 這就叫勘根定理,大概是在講下面的東西 ※ f(x) 於 (a,b) 恰有一解,則 f(a) * f(b) < 0 其中的 "恰有一解" 是很重要的觀念,如果有 "二個解","三個解" 的話, 這定理 f(a) * f(b) < 「未必成立」 : .... 略 : 1.我不知道怎麼找四個解 : 2.根本不能用阿orz 你不知道怎麼找不代表不能用 : 拜託各位大大幫我進入程式語言的世界 這問題實屬「數值分析」方面之問題,C/C++ 學完基本的 基本輸出入、資料型態、流程控制、回圈判斷 的確可以「勉強」進入 不過比較建議先把 C/C++ 練熟再探討會好些 ------------ 非線性方程式求解步驟時,「通常」會有四個一定要設的參數 1. X_LOW -> 求解之最小值 2. X_UP -> 求解之最大值 3. X_STEP-> 每次步進值 4. EPS -> 容許最小誤差 其中 1~3 是套用在 勘根定理上,寫起來像這樣 #define X_LOW (double)(-100) #define X_UP (double)(100) #define X_STEP (double)(1.0) double func(double x){ // your function double x2=x*x, x3=x*x2, x4=x2*x2; // Horner rule to turbo return x4 - 9*x3 - 2*x2 + 120*x - 130; } for(double i=X_LOW; i<=X_UP; i+=X_STEP) { if( func(i) * func(i+X_STEP) <= 0.0) { // 用勘根定理判斷有無解 // 代表在 X_LOW 至 X_LOW + X_STEP 之間有一組解 // 再用所謂的二分法、牛頓法... etc 去詳細求這組解的正確是位在哪 } } 至於 EPS 即為題意中的 "最小誤差為 0.00001", 這部份真要懂的話還是要去精華區看浮點數誤差等相關問題。 另從 po 上來的程式碼,判斷應為「二分法」。 比較建議去借閱數值分析的書回來 K, 專門用C 語言寫數值分析的書也很多, 這部份各家也說明很詳細。 如果只是要參考程式碼、不想了解背後原理的話,可到下述網址 http://edisonx.pixnet.net/blog/category/1783618 聲明,沒寫得很漂亮,如果沒有函式指標概念的話應該也看不懂 -- YouLoveMe() ? LetItBe() : LetMeFree(); -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.76.142 ※ 編輯: tropical72 來自: 180.177.76.142 (03/14 17:23)
dos792:買本 numerical recipes 03/14 20:28