天天看點

Matlab 多項式的根求解

✅作者簡介:熱愛科研的算法開發者,Python、Matlab項目可交流、溝通、學習。

🍎個人首頁:算法工程師的學習日志

分享一下通過多種不同的方法計算多項式的根。

  • 數值根
  • 使用代換法求根
  • 特定區間内的根
  • 符号根

數值根

​roots​

​ 函數用于計算系數向量表示的單變量多項式的根。

例如,建立一個向量以表示多項式 x2−x−6,然後計算多項式的根。

p = [1 -1 -6];
r = roots(p)
r =


     3
    -2      

按照慣例,MATLAB以列向量形式傳回這些根。

​poly​

​ 函數将這些根重新轉換為多項式系數。對向量執行運算時,​

​poly​

​ 和 ​

​roots​

​ 為反函數,是以 ​

​poly(roots(p))​

​ 傳回 ​

​p​

​(取決于舍入誤差、排序和縮放)。

p2 = poly(r)
p2 =


     1    -1    -6      

對矩陣執行運算時,poly 函數會計算矩陣的特征多項式。特征多項式的根是矩陣的特征值。是以,roots(poly(A)) 和 eig(A) 傳回相同的答案(取決于舍入誤差、排序和縮放)。

使用代換法求根

通過使用代換法簡化方程來對涉及三角函數的多項式方程求解。一個變量的生成多項式不再包含任何三角函數。

例如,計算θ用于對該方程進行求解的值

3cos2(θ)−sin(θ)+3=0.

利用 cos2(θ)=1−sin2(θ),完全以正弦函數的方式表示該方程:

−3sin2(θ)−sin(θ)+6=0.

利用代換法 x=sin(θ),将該方程表示為簡單的多項式方程:

−3x2−x+6=0.

建立一個向量以表示多項式。

p = [-3 -1 6];      

求多項式的根。

r = roots(p)
r = 2×1


   -1.5907
    1.2573      

要撤消代換法,請使用 θ=sin−1(x)。​

​asin​

​ 函數計算反正弦。

theta = asin(r)
theta = 2×1 complex


  -1.5708 + 1.0395i
   1.5708 - 0.7028i      

驗證 ​

​theta​

​ 中的元素是否為θ中用來對原始方程求解的值(在舍入誤差内)。

f = @(Z) 3*cos(Z).^2 - sin(Z) + 3;
f(theta)
ans = 2×1 complex
 1.0e-14 *


  -0.0888 + 0.0647i
   0.2665 + 0.0399i      

特定區間内的根

使用 ​

​fzero​

​ 函數求多項式在特定區間内的根。在其他使用情況下,如果要繪制多項式并想要知道特定根的值,則這種方法很适用。

例如,建立一個函數句柄以表示多項式 3x7+4x6+2x5+4x4+x3+5x2。

p = @(x) 3*x.^7 + 4*x.^6 + 2*x.^5 + 4*x.^4 + x.^3 + 5*x.^2;      

在區間 [−2,1]

x = -2:0.1:1;
plot(x,p(x))
ylim([-100 50])
grid on
hold on      
Matlab 多項式的根求解

從繪圖中,多項式在 ​

​0​

​ 和另一個接近 ​

​-1.5​

​ 的位置各有一個簡單的根。使用 ​

​fzero​

​ 計算并繪制接近 ​

​-1.5​

​ 的根。

Z = fzero(p, -1.5)
Z = -1.6056
plot(Z,p(Z),'r*')      
Matlab 多項式的根求解

符号根

syms x
s = solve(x^2-x-6)
s =
 
 -2
  3      
F = factor(x^2-x-6)
F =
 
[ x + 2, x - 3]