複數實數係數多項式求根   說明
本卷主力程式的發行網站   數值配方 Numerical-Recipes 讀者評論
本卷編程環境是微軟 MSIE 6.0   更新 98,03,24
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。




<a name=index01> 
複數實數係數多項式求根輸入表格
測試複數函數
複數實數係數多項式求根說明
五項功能
初始值方格的使用法
填充亂數,簡化輸入
「任次方」﹕任意複數的實數次方
一百次多項式
「任次方」﹕任意複數的複數次方
公式導證,自修第六卷,另卷

<a name=begin0> 目錄 複數實數係數多項式求根
     
例題
多項式次數 2 至 100
精微輸出 打勾是,無勾否   100 次方的答案,誤差太大!
初始值 ; 


上面的 C 方格代表一個多項式,下面的方格一有一組測試點,
不一定是根 將測試點代入多項式計值,輸出於方格二
方格一。答案輸出  

方格二。偵錯驗證    

使用者不必輸入,點擊按鈕,輸出於方格二。
 輸入於方格一,點擊按鈕,輸出於方格二。

方格三。偵錯輸出


<a name=testFunc> 目錄
    第一複數第二複數 方格一二輸出     函數名稱
caddf(c1,c2)
csubf(c1,c2)
cmulf(c1,c2)
cdivf(c1,c2)
conjf(c1)
cnewf(r1,r2)
cabsf(c1)
csqrt(c1)
cmulr(c1,r2)
cargf(c1)
cpolr(c1)
cxryi(c1)
cpows(c1,c2)

complex1.htm 有比較好的任意次方函數 cpowf(c1,c2,nB,nE)
 ; 



<a name="doc01"> 目錄
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

98,02,28,13,39始
本卷是複數實數係數多項式求根程式,主力函數來自
Numerical Recipes Software 的 laguer.c
86,11,05,05,27 取得 Numerical-Recipes 的函數
ftp://ftp.mecheng.asme.org/pub/C_LANG/C-RECIPE.ZIP
(這個網址已經失效)
<a name="doc02">
98,02,24,12,06 開始寫 complex0.htm 複數加減乘除
98,02,25,12,15 寫 polyroot.htm 求多項式根
使用 Numerical-Recipes 的函數 laguer()
把 C 語言指令改為爪哇簡稿語言指令。
98,02,26,11,43 得到多項式根的正確輸出
98,02,26,19,18 去訪 nr.com 看版權規章
98,02,26,19,41 取閱 http://www.nr.com/licenses/
98,02,26,20,02 發覺 ftp.mecheng.asme.org 已經失效
98,02,27 增加功能,輸入已知根,求多項式的係數。
98,02,28 改進程式,為使用者提供便利,例如「測試轉為複數」
通常使用實數係數多項式,因為實數是複數的一部分,所以,
本卷可以解實數係數多項式的問題,只要在 C00, C01, C02
..... 方格填入一個數字(實數)就可以。

98,02,28,13,52止
<a name="doc03"> 目錄
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

98,02,28,16,26始
本卷有如下五項功能
第一項、求解複數係數多項式的根
第二項、將測試點代入複數係數多項式,然後計算數值。
第三項、已知根值,反求多項式的係數。
第四項、測試不同複數表達法的轉換結果。
第五項、測試複數運算函數。

<a name="doc04">
說明如下。
第一項、求解複數係數多項式的根
這是本卷的主要功能。
步驟一,在「多項式次數〔  〕2 至 100」的空格〔  〕中,
    填入多項式次數,例如 3 ,程式自動準備四個方格,
    三次多項式需要四個係數,某次多項式需要某加一個
    係數。
<a name="doc05">
步驟二,在空格〔  〕中填入多項式係數,大多數情況是實數
    係數,此時,在一個空格填入一個數字就可以了,如
    果是複數係數,例如 1+2i ,可以填入 1+2i 或者
    2i+1 或者 1,2 三者都產生正確的內部變數 。
    多數情況,多項式的最高次項係數為實數一 1+0i 。
    (函數 laguer() 容許非一的最高次項係數)
<a name="doc06">
步驟三,點擊執行按鈕。有兩個按鈕可以選擇。
    「快速求根,驗證輸出」及「慢速求根,偵錯輸出」
    答案存於方格一,偵錯驗證存於方格二。
    驗證輸出,除了展示根的答案之外,也展示每個根的
    多項式計值,完全精確的計值結果為零,若計值結果
    在 -1.e-7 至 +1.e-7 之間,答案算是滿意。
    「慢速求根,偵錯輸出」有執行過程的中間值,如果
    您懷疑中間過程有問題,可以用「慢速求根」按鈕。
    超過二十次方的「慢速求根」很耗時,主要是輸出字
    串太長,電腦到處尋覓存放空間。
9802281658此
<a name="doc07">
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

第二項、將測試點代入複數係數多項式,然後計算數值。
    用第一項功能找到一個根的時候,如果多項式計值不
    理想,距離零太遠,此時,可以改變根值,存入方格
    一,在方格一的上面找下面兩行字,
上面的 C 方格代表一個多項式,下面的方格一有一組測試點, 
不一定是根〔請計值〕將測試點代入多項式計值,輸出於方格二
    點擊〔請計值〕按鈕,輸出於方格二,
9802281704止
<a name="doc08">
9802281837始
    在使用第二項功能時,必須已經填滿多項式的係數方
    格,才能夠計值。

第三項、已知根值,反求多項式的係數。
    假設是三個根,先點擊「2 至 100」右側的「三」。
    其次,把已知根填入方格一,一行一個根,然後,在
    「方格二。偵錯驗證」這一行,點擊「已知根值,反
    求係數」,剛剛填入的已知根數值,在方格一消失,
    9802281847止 9802282025始
    方格一變為對應的多項式的係數。方格二有已知根數
    值及係數。
    方格一的係數,便利填入係數小方格,此時
    點擊「方格一是係數,填入小方格」,係數填入方格

    點擊「快速求根,驗證輸出」。如果一切順利,應該
    得到剛才輸入的根。
    9802282036此
<a name="doc09">
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

第四項、測試不同複數表達法的轉換結果。
    在方格二的下面有
「內定測試轉為複數」使用者不必輸入,點擊按鈕,輸出於方格二。 
「我的測試轉為複數」輸入於方格一,點擊按鈕,輸出於方格二。
    點擊「內定測試轉為複數」,方格一有測試字串,
    方格二有 toCplx() 轉換後的字串。主要目的為
    測試函數 toCplx() 
    至於「我的測試轉為複數」按鈕,方格一需要先填入
    使用者的測試字串,然後點擊「我的測試轉為複數」
    
<a name="doc10">
第五項、測試複數運算函數。
    到「第一複數 第二複數 方格一二輸出  函數名稱」
    這一行,一個函數佔一行,點擊左側按鈕,於是
    第一複數及第二複數可以加減乘除。輸出於第三列
    方格。主要為編程者提供測試。
9802282046止
<a name="doc11">
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

9802282219始
下面說明三點事項。

<a name="doc12"> 目錄
第一
程式使用迭代法求根,初始值為 0+0i ,如果求得的根為
[[
第 1 個根 -0.9988389295286827,0.33966125914902345
計值為 -0.007944743411053112,0.008009045986170804
絕對值為 0.011281124300178174 應該為零!
]]
絕對值為 0.011281124300178174 不理想。
<a name="doc13">
改進的方法是把第 1 個根 
-0.9988389295286827,0.33966125914902345
填入初始值方格,第二次執行,得到
[[
第 1 個根 -0.9988389707116815,0.3396529909955216
計值為 -1.7822854303517488e-11,4.598099678787548e-12
絕對值為 1.840642975105379e-11 應該為零!
]]
絕對值為 1.840642975105379e-11 改進許多。
這是初始值方格利用的方法。

<a name="doc14"> 目錄
第二
「填充亂數為係數」便利測試求根功能,不必特意輸入係數。

第三
精微輸出 打勾是,無勾否
如果打勾,程式會多執行幾個回合,改進答案。
9802282227止
<a name="doc15">
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

9803011025
多項式的係數一個一個填入係數小方格嗎?太麻煩。
把所有係數填入方格一,一行一個係數,第一行
填入常數項,第二行填入一次項係數,餘類推。然後,
點擊「方格一是係數,填入小方格」,程式自動填入。
9803011028

<a name="doc16"> 目錄
9803011202
關於「任次方」函數 cpowf(c1,r1) (任意次方函數),
〔上面的 r1 表示限制於實數次方 9803020925〕
讀者可以做下面的實驗
先執行 1.1+1.2i 的 0.3333333333333 次方
也就是 1.1+1.2i 的開立方,答案為
1.1317496330101923,0.3208898125926623
把答案貼入左方格
把中方格的 0.33333333333333 改為 3 
點擊「任次方」按鈕,執行三次方運算(開立方的反運算)
獲得答案為
1.1000000000000003,1.1999999999999997
這就是原有的 1.1+1.2i 
這一套驗證手續,表示「任次方」函數沒有錯誤,但是,
不能保證其他驗證值一定正確。

「任次方」的指數如果是 0.5 這就是開平方。
9803011210
<a name="doc17">
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

「正至極」的「正」意指 1.1+1.2i 表示法。
「正至極」的「極」意指 「1.1+1.2i」的絕對值及
 「1.1+1.2i」的轉角值表示法。
「1.1+1.2i」的極示法為
1.6278820596099707,0.8288490587889791
其中
1.6278820596099707 是「1.1+1.2i」的絕對值
0.8288490587889791 是「1.1+1.2i」的轉角值

「a+bi」的絕對值是 (a*a+b*b) 的開平方,
「a+bi」的轉角值是 atan2(b,a) 。
9803011217

<a name="doc18"> 目錄
執行 100 次方的多項式,獲得的答案,誤差太大!
正確的誤差應該是零,但是, 100 次方的多項式,
答案誤差值大小變動極大,下面是三次實驗,都是填
充亂數至 100 次方多項式的係數方格。

第 1 個根 -27.17957626448283,1.9752765245766852
計值為 1.4449038238060076e+144,2.189848792957901e+143
絕對值為 1.4614039268489098e+144 應該為零!

第 1 個根 -1.1807950170562482,0.31480027636011354
計值為 -24.248959138920753,3.6002667849790333
絕對值為 24.514769838692583 應該為零!

第 1 個根 -1.187684780721903,-0.3148747224749606
計值為 -0.000011195001952124528,0.000001952277281391801
絕對值為 0.000011363954210199483 應該為零!

<a name="doc19">
以「快速求根」按鈕執行 100 次方的多項式,大約耗時
十秒至二十秒,由電腦能力決定時間。

以「慢速求根」按鈕執行 100 次方的多項式,大約耗時
一小時。因為輸出資料太長。
9803011233

本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

<a name="doc20"> 目錄
98,03,02,09,30 始
98,03,01,15,07 第一次上載
複數實數係數多項式求根 polyroo1.htm
進入國際網路
http://freeman2.com/polyroo1.htm
這個版本,「任次方」功能限制於任意複數的任意實數次方。
上載後多加思考,為什麼不寫一個任意複數的任意複數次方?
[[
98,03,01,22,09 我寫的 cpowf(c1,r1) 不完全
完全的 cpowf(c1,r1) 容許複數的複數次方
.....
//9803020922 複數的任意複數次方成功!!
]]
經過數小時的工作,完成任意複數的任意複數次方。
但是,仍然與往常一樣,沒有他人驗證,自以為是的結果,
不一定正確。
本卷是個人的閑暇作業,輸出結果不能
保證正確,請先核對結果是否合理。

任意複數的任意複數次方的導證在本卷源碼的註解中,
請在源碼找「98,03,01,22,09 我寫的」
98,03,02,09,41 止

<a name="doc21">
98,03,02,11,18 始
98,03,02,10,23 第二次更新上載 polyroo1.htm 
98,03,02,10,49 發覺 polyroo1.htm 的答案是
i^i = 1+0i !! 錯誤 !!正確答案是
i^i = exp(-PI/2)
i^i = 0.20787957635076193+0i
98,03,02,11,13 刪除錯誤的條件返回指令。
98,03,02,11,22 止

<a name="doc22">
98,03,13,17,24 始
數值配方 Numerical-Recipes 原始程式使用的初始值
為 Complex(0.0,0.0) 如下
[[
  x=Complex(0.0,0.0);
  laguer(ad,j,&x,EPS,0);
]]
自由人在寫程式時,照樣以 0+0i 為初始值,當求解
x^6-1=0
時,全式為
x^6 +0*x^5 +0*x^4 +0*x^3 +0*x^2 +0*x^1 -1=0
有五個零係數,無法求解,十分困惑。今天
[[
98,03,13,17,11
解 x^6-1=0 時
不要用 0+0i 為初始值,(造成除以零)
改用 1+1i 為初始值,程式正常處理。
]]
發覺以 0+0i 為初始值造成除以零,改用 1+1i 為初始值,
程式正常處理。現在更改程式,內定用 1+1i 為初始值。
98,03,13,17,33 止

<a name="doc23">
98,03,14,04,55 始
[[
98,03,14,04,40 實數多項式引入虛數初始值是否
產生麻煩?
答案﹕沒有麻煩
初始值 0+1i
例題 05 十重根為 2 ; 
答案正確,沒有滲入虛數
]]
98,03,14,04,42 發覺執行偵錯輸出時,方格二的資料是
9802261040 係數為 -960,0
程式完畢時,不需要偵錯字串「9802261040」
「慢速求根,偵錯輸出」於方格二的資料,更改為
x^7 項的係數為 -960,0
98,03,14,04,59 止

98,03,14,05,07 電腦銀幕巨大閃動,駭人閃動,
電腦銀幕快要報銷了!這是目前唯一可以使用的銀幕!

<a name="doc24">
98,03,24,21,19 始
請看本卷源碼
9803241937用parseFloat(),否則產生意外的錯誤
使用 parseFloat(), 送回數字,否則送回字串。
98,03,24,21,21 止



爪哇簡稿卷目錄
http://freeman2.com/jsindex1.htm
空間曲線投影器
http://freeman2.com/curve3d1.htm
點對直線之垂足(眼足網頁)
http://freeman2.com/eyefoot1.htm
正交長一軸系展開法 Gram-Schmidt Process
http://freeman2.com/gramsch1.htm
複數實數係數多項式求根
http://freeman2.com/polyroo1.htm
複變函數
http://freeman2.com/complex1.htm


本卷複數實數係數多項式求根 polyroo1.htm 建立於
中華民國九十八年二月二十四日。

本卷網址
http://freeman2.com/polyroo1.htm
首次上載  98,03,01

謝謝光臨自由人網站。
自由人  中華民國九十八年三月一日。
98,03,01,11,02