以2分法球出方程式f(x)=0的根 ->x^2-4x+2=0 , x=?
1.將根之左右2點a.b之初始值設為low 與 high
2.以x=(low+high)/2求low與high的中心點x
3.若f(x)>0則根位於x的左邊,high=x,將上限縮至一半,
若f(x)<0則根位於x的右邊,low=x,並將下限縮至一半
4.設f(x)為求0或 high-low (abs)/low(abs)
條件:當f(a).f(b)>0時,輸出無解
2006-11-19 07:41:09 · 4 個解答 · 發問者 nature9936 2 in 教育與參考 ➔ 考試
請使用while [high-low(abs)>10^-5]
如: next= (high+low)/2
if f(next)>0
high=next
next=(high+low)/2
else
low=next
next=(high+low)/2
...
2006-11-19 07:57:26 · update #1
不好意思,敘述的不詳細,abs是絕對質,EPS在這裡定義為10^-5次方,麻煩各位了!
2006-11-19 17:34:47 · update #2
抱歉了,舉個例,譬如說x^2-3x+2=0,該如何利用Low點(a)以及High點(b)擇一範圍,利用迴圈逐漸縮小範圍,使範圍趨近於"x"(其10^-5為預設接近值,越大則越趨近x),麻煩了!
2006-11-22 17:23:26 · update #3
Sorrry~那麼就以上例:x^2-3x+2=0來解求x,
a & b自行設定,可以嗎?
2006-11-23 18:16:19 · update #4
感謝 kui的回覆,我會於後天回家驗證一下,
如果您能補充一下式子的說明那就更棒了!
2006-11-24 18:56:46 · update #5
kui老師,想請教一下,當Low點(a)訂為0and High點(b)訂為1,是否x還有一解:0.58578,另外,倘若此為sin波,是否會一定跑出兩個解?如何同時顯示此2解?
不好意思,麻煩您了!
2006-11-26 11:50:14 · update #6
請教一下"using namespace std;"其語意為何?有何功用?而"bool nosol"的用途 & 使用方式能否稍加說明,感謝!
2006-11-27 18:51:27 · update #7
因為x^2-3x+2=0的解1和2有點明顯,所以我還是用最上面的x^2-4x+2=0來做例子,求出x=3和4之間的一根,參考看看。#include
2006-11-25 10:32:50 補充:
因為絶大部分都是照您寫的那些步驟寫的,程式也很短,您大致都可以對照的出來,而算法的部分您在題目中也都已經都說明詳細了,所以想請您說一下您說想要補充式子的說明指的是哪一部分?或者您run看看有問題一起說也可以。
2006-11-26 21:12:20 補充:
您說的沒錯,0,1之間還有一解。sin波不一定兩個解,要看它的波形以及x範圍的限制,可以無解,也可以無限多解。因為我^^|||也跟您有一樣的問題所以才先請教您的a,b是如何決定。用二分逼近法,我個人是沒有好的方法來決定a,b。我只能畫個圖,決定好a,b之間只有一個根,再開始解,因為a,b是大約就行了,所以就還好,如果超過一個根,就用不同組a,b來解,我這方面涉獵太少,也想知道找a,b以及不止一個根的好的方法。
2006-11-28 11:29:59 補充:
namespace 叫名稱空間,詳細的解釋要找C++的書。因為程式用到cout (我不知道您原來是不是習慣用printf ?),cout完整的名稱是std::cout,寫了using namespace std; 之後下面程式中只寫cout就代表std這個namespace的cout,不用每次寫std::cout這麼麻煩,C++標準函式庫中的項目都定義在std這個名稱空間中。在多人或撰寫大型程式時,或者現在商業類別,函式庫也很多,難保不會有相同名稱的類別或函式用到相同的名稱,只靠名稱來呼叫它無法確定到底呼叫了什麼,連結時也會發生問題,這時就靠名稱空間不同的機制來區別。
2006-11-28 11:36:05 補充:
bool nosol=true; 宣告了一個型態為bool的變數,bool就是值為false或true的一種型態,nosol (no solution的意思),把它設為true表示一開始假設這個方程式無解。如果while迴圈中每次都跑if(f(high)*f(next) > 0),到最後nosol的值還是true,我們就知道無解,如果程式有機會進到else那邊,表示f(high)*f(next) ≤ 0,那就是有解,我們就在else那邊把nosol設為false。最後if(nosol) 判斷nosol是true就會印a,b之間無解,如果是false就把解印出來。
2006-11-29 14:47:40 補充:
5,5為何無解?5和5太接近了,5-5=0沒辦法大於10^-5所以無解.講到這裡我看了一下題目,程式這部分沒有完全照上面的題目來寫,而是照你2006-11-19 12:57:26 補充的內容來寫,原來題目比較完整.
2006-11-29 14:50:23 補充:
為什麼只有一解?因為照這個演算法去做,出來就是只會有一解或無解,因為f(high)*f(next)>0不成立時,它就只認為解在high和next之間,沒有再看看next和low之間有沒有解,如果要都解出來,應該再加一些程式,f(high)*f(next)>0不成立時,也還是要對next和low之間做同樣的事把另外的解再找出來.
2006-12-02 20:41:10 補充:
不客氣. 照這個程式跑的話 low=0, high=9時next就是 4.5 , f(9)*f(4.5)>0 所以high就變成4.5 , 現在low=0, high=4.5, next就變成 2.25 , f(4.5)*f(2.25)<0 有解,所以最後解出來的解在2.25和4.5之間就是3.41421這個.
2006-12-02 20:41:28 補充:
還有釐清一點,我們所利用的定理,只保證在[a,b]連續函數若f(a)*f(b)<0時a,b間至少有1解,所以挑a,b時要滿足f(a)*f(b)<0才合乎定理,f(0)*f(9)>0,所以並不合乎定理的要求(但並不表示f(a)*f(b)>0是無解,其實當中有兩個解),我們之所以能解出1解,是f(a)*f(b)>0時程式還繼續一直除以2的關係.所以要改程式能解出已知low=0,high=9之間的所有解,並不多困難,只有最初為什麼要用0和9或是3和4,怎麼決定對程式有困難.
2006-11-24 05:55:58 · answer #1 · answered by chan 5 · 0⤊ 0⤋
請教:
next=(low+high)/2;
if(f(high)*f(next) > 0)
{
high=next;
......
如果high=5,low=5代入,何以能顯示出無解?
2006-11-28 23:12:14 補充:
此外,
此次當我將low點訂為0,
但high點改訂為9,
為何只會顯示一解:x=3.41421
而未顯示另一解:x=0.585793呢??
2006-12-02 01:26:12 補充:
嗯!感謝您的說明,我只是好奇一大範圍中包含兩個解,為何通常只會顯示x=3.41421而非x=0.585793,anyway thanks a lot !
2006-11-28 17:45:38 · answer #2 · answered by nature9936 2 · 0⤊ 0⤋
天ㄚ~好難..看不懂~><
2006-11-28 14:11:35 · answer #3 · answered by 美萱 2 · 0⤊ 0⤋
你的abs跟EPS是啥
2006-11-19 07:49:52 · answer #4 · answered by 小洛 2 · 0⤊ 0⤋