求取多解的非線性代數(shù)方程所有數(shù)值解的方法
0. 引言
一些非線性方程在實數(shù)范圍內(nèi)存在多解,本帖要討論的正是求得所有的這些解的方法。多解方程,其解的個數(shù)不同,求解難度也不同,本帖將針對解個數(shù)較少和解個數(shù)較多的兩種情況,各舉一例進(jìn)行討論,并提出相應(yīng)的方法和代碼,作者希望本帖提出的方法和代碼能具有較強(qiáng)的普適性。
本帖所采用軟件及其版本:
(1)1stOpt 1.5
(2)MATLAB 2010a
(3)Maple 18
1. 解個數(shù)較少的情況
例:求出如附圖1所示方程的全部解(方程出處:http://www.gaoyang168.com/bbs/viewthread.php?tid=9911763&fpage=1)。

附圖1.png
具體步驟如下:
步驟1:畫出方程圖形,直觀上確定解的個數(shù)
為了畫出方程圖形,首先須正確輸入該方程,如果輸入的原始方程都是錯誤的,就更不用談結(jié)果的正確性。
因此,在步驟1中還包括一個方程輸入預(yù)檢驗的步驟。
步驟1.1:方程輸入預(yù)檢驗
根據(jù)附圖1,可將原始方程寫為:
y=(25-(3/25)*k)^2-9.8*k*tanh((1/10)*k)*(1+(0.125e-2*(8+cosh(.4*k)-2*tanh(.1*k)^2))/sinh(.1*k)^4)
由于待求解方程形式較為復(fù)雜,須檢查方程的輸入是否正確。這里用到的軟件是Maple,利用該軟件強(qiáng)大的二維顯示功能,可判斷方程輸入的正誤。
將上述方程在Maple中的顯示結(jié)果如附圖2所示。

附圖2.png
仔細(xì)比對可知,原方程輸入無誤。
步驟1.2:方程圖形繪制
繪制原方程的圖形曲線時,橫軸坐標(biāo)的范圍盡量大一些;同時繪制出直線y=0,該直線與原方程曲線的交點(diǎn),即為方程的解。
對于本例,MATLAB代碼如下:
上述代碼中,n表示繪圖時散點(diǎn)的個數(shù),n應(yīng)當(dāng)取為較大的數(shù)值,以防止漏解。
上述代碼結(jié)果如附圖3所示。從附圖3中可見,原方程在k<100,以及k=1000附近存在兩個解;此外,仔細(xì)觀察可見,在k=0左右的細(xì)微局部也存在解,將此局部放大如附圖4,可見在這細(xì)微局部內(nèi),存在兩個解。

附圖3.png

附圖4.png
步驟2:求解
對于這種方程,MATLAB的fsolve函數(shù)可高效求解,根據(jù)步驟1.2中的分析,初值選為-0.1,0.1,100和1000,具體代碼如下:
計算結(jié)果:
至此,用MATLAB求得了原方程全部4個解。
當(dāng)然,上述求解過程也可用1stOpt實現(xiàn),根據(jù)步驟1.2中的分析,通過限定未知數(shù)k取值范圍的辦法,可同樣求解4個解,具體的代碼有4段,分別如下:
限定k小于0:
計算結(jié)果:
限定k在[0,1]:
計算結(jié)果:
限定k在[10,100]:
計算結(jié)果:
限定k>500:
計算結(jié)果:
2. 解個數(shù)較多的情況
對于解個數(shù)較多的情況,采用上述人工選取初值點(diǎn)的辦法將比較低效而且容易漏解,舉例如下:
求方程:y=sin(10*x)-log10(x) 的全部解(方程出處:http://www.gaoyang168.com/bbs/viewthread.php?tid=9425648&fpage=1)。
由于原方程形式很簡單,無需進(jìn)一步檢查方程輸入的正誤,采用MATLAB可繪制該方程在[0,100]范圍內(nèi)的圖形(由于方程中對數(shù)的存在,x<0時,不存在實數(shù)解,故x<0的情況毋須考慮),代碼如下,結(jié)果如附圖5所示。

附圖5.png
由附圖5可見,盡管原方程的曲線在縱軸方向劇烈震蕩,但在[0,10]之外的范圍不存在解,因此可進(jìn)一步繪制[0,10]范圍內(nèi)的圖形,如附圖6所示。

附圖6.png
可看到,該方程解的個數(shù)極多,采用上述人工選取初值點(diǎn)的方法就難以實施了。對于這種情況,作者的思路是這樣的:從圖形上至少能觀察到這些解大概的取值范圍,在這取值范圍之內(nèi)廣“撒網(wǎng)”,取足夠多的初值,求出來的結(jié)果就能遍歷全部解。當(dāng)然由于選取初值的個數(shù)大于解的個數(shù),求出來的結(jié)果中肯定會有重復(fù)的,在代碼中加一段去重的函數(shù),即可將所有解求出來,具體的MATLAB代碼如下:
計算結(jié)果:
至此,求得了原方程全部的31個解(如果有興趣數(shù)一下附圖6中紅線和藍(lán)線交點(diǎn)的個數(shù),會發(fā)現(xiàn)交點(diǎn)個數(shù)正是31)。
[ Last edited by 月只藍(lán) on 2018-8-17 at 21:23 ]
京公網(wǎng)安備 11010802022153號
內(nèi)容已刪除
用OpenLu求解:
說明:Lu腳本對整數(shù)運(yùn)算和實數(shù)運(yùn)算是有區(qū)別的,故3/25寫成了3.0/25,其他類似。
1. 解個數(shù)較少的情況
發(fā)現(xiàn)3個解:
-0.4190923544648197 3.410605131648481e-013
0.4207852612243718 -1.13686837721616e-013
40.83784438616018 0.
3
使用optmax參數(shù)加大求解精度:
求得全部解:
-0.4190923544648196 -1.13686837721616e-013
0.4207852612243718 -1.13686837721616e-013
40.83784438616018 0.
1063.205199210628 1.818989403545857e-012
4
2. 解個數(shù)較多的情況
發(fā)現(xiàn)9個解:
0.3601157243768782 -5.551115123125783e-017
0.6064214141293833 -2.220446049250313e-016
0.9449377253677708 -5.273559366969494e-016
1.266930508628267 -1.110223024625157e-016
1.55160066324603 -7.771561172376096e-016
1.913526139727183 1.498801083243961e-015
2.164907697628906 -8.326672684688674e-016
2.555238085345417 -5.551115123125783e-016
3.399721564856651 8.881784197001252e-016
9
使用optmax參數(shù)加大求解精度:
求得全部解:
0.3601157243768782 -5.551115123125783e-017
0.6064214141293833 -2.220446049250313e-016
0.9449377253677708 -5.273559366969494e-016
1.266930508628267 -1.110223024625157e-016
1.55160066324603 -7.771561172376096e-016
1.913526139727183 1.498801083243961e-015
2.164907697628906 -8.326672684688674e-016
2.555238085345417 -5.551115123125783e-016
2.781398223612919 3.885780586188048e-016
3.194461071000813 2.775557561562891e-015
3.399721564856651 8.881784197001252e-016
3.832208094483737 1.554312234475219e-015
4.019201851137966 6.994405055138486e-015
4.469016047883874 -2.331468351712829e-015
4.639443152869999 -2.220446049250313e-016
5.105216467504163 -2.442490654175344e-015
5.260182951108074 -1.332267629550188e-015
5.741042948060711 3.33066907387547e-016
5.881225293357182 -9.769962616701378e-015
6.376684609873521 -1.52433621281034e-013
6.502403275288452 -2.664535259100376e-015
7.012321721086956 -1.332267629550188e-015
7.123550557006736 3.441691376337985e-015
7.648162774282883 -2.664535259100376e-015
7.744467806033315 3.987921104453562e-013
8.284508976557957 -2.442490654175344e-015
8.364860078182078 -8.881784197001252e-016
8.921930291619619 5.551115123125783e-016
8.984161831936833 5.551115123125783e-016
9.562104170355372 -2.55351295663786e-015
9.600698824827939 -6.905742644391921e-011
31
,