在R語言中可以使用uniroot函數求解一元方程的根。uniroot函數的語法格式如下:
uniroot(f, interval, ..., lower = min(interval), upper = max(interval), tol = .Machine$double.eps^0.25, maxiter = 1000)
主要參數的含義如下:
f 要求解的方程;interval 用向量表示的區間;lower,upper 用於搜索解的下限和上限;tol 求解的精度;maxiter 最大迭代次數
該函數的結果是一個包含4部分的列表:求解的根root和在該點的函數值f.root;迭代次數iter和求解方程的近似估計的精度estim.prec。
求解一元一次方程
求解形如ax+b=0的根。如求解 3x + 2 = 0的根,編寫程序及運行結果如下:
在該例子中,首先定義了一個函數f,用於返回形如ax+b的值。然後使用uniroot函數來求解,並將結果賦給root變量,搜索根的範圍為[-5, 0]。最終求得的結果為-0.6666667(root$root),將該值代入到函數中時的函數值為0(root$f.root)。
求解一元二次方程
求解形如f(x)=ax^2 + bx + c的方程的解。如求出方程x^2 - x - 6 = 0的根。編寫的程序及運行結果如下圖所示:
從上圖可以看出該方程的一個根為-2,改變它的運算區間可以求出另外一個根:
re<-uniroot(f, c(0,3), a=1, b=-1, c=-6, tol=1e-9)
re$root
這裡求得的另外一個根為3。由於uniroot()函數每次只能計算一個根,而且要求輸入的區間端點值必須是正負號相反的。如果我們直接輸入(-3, 4)這個區間,那麼uniroot()函數會出現錯誤:
Error in uniroot(f, c(-3, 4), a = 1, b = -1, c = -6, tol = 1e-09) : 位於極點邊的f()值之正負號不相反
即要求f(lower) * f(upper) <=0。那麼在實際中如何確定根的大致範圍呢,一個做法就是通過繪圖來觀察,如本例中可以使用西面的代碼來繪圖:
f<-function(x,a,b,c){return (a*x^2+b*x+c)}
X<-seq(-6,6,by=0.1)
Y<-f(X,a=1,b=-1,c=-6)
plot(X,Y,type="l",col=2) #繪製函數圖形
abline(h=0,v=0,lty=2,col="gray") #繪製出橫軸和縱軸
繪圖結果如下圖所示:
從圖中可以看出,方程的一個根位於-3和0之間,另外一個根位於2和4之間,這樣我們取區間(-3,0)和(0,4)即可。同時也可以看出這兩個區間的兩個端點的函數值得符號是相反的。
求解一元三次方程
求解形如ax3+bx2+cx+d=0的根。如求x3-x-3=0的方程根。編寫的程序及運行結果如下:
從上圖中可以看出,求得的該函數的一個根是1.6717,迭代次數為8。上面給出的程序中也給出了繪圖方法,其繪製的函數圖像如下圖:
從該圖中可以觀察到該方程有一個根,大致位於[1, 2]之間,所以在上面的程序中給出的搜索根的範圍為[1, 2.5]是合理的。
關於求解一元方程根的方法就說到這裡,有什麼問題,可以給我留言。也歡迎關注交流。