时停止迭代.此准则可以不考虑x的单位的情况下达到指定的精度. 例1解方程 a2+y2+2ay =n-2 n-1 其中a为常数,n>2为一整数.显然,方程的解为 y=-n2±Vn-2+a2+n 下面我们使用二分法求此方程的一个数值解.我们首先要找一个区间,比 如(0,5n),使得函数f()=a2+y2+兴-n+2在区间两端有着不同的符 号.然后即可以使用二分法 FCode a<-0.5 n<-20 cat("true roots",-a/(n-1)-sqrt(n-2-a*2+(a/(n-1))2), -a/(n-1)+sqrt(n-2-a^2+(a/(n-1))2),"\n") bisec<-function(b0,b1){ Previous Next First Last Back Forward 4
û éSì. dOKå±ÿƒx¸†ú¹eàç½°›. ~1 )êß a 2 + y 2 + 2ay n − 1 = n − 2 Ÿ•aè~Í, n > 2èòÍ. w,, êß)è y = − a n − 1 ± r n − 2 + a 2 + ( a n − 1 ) 2 e°·Ç¶^©{¶dêßòáÍä). ·ÇƒkáÈ òá´m, ' X(0, 5n), ¶ºÍf(y) = a 2 + y 2 + 2ay n−1 − n + 23´m¸‡kXÿ”Œ “. ,=å±¶^©{. ↑Code a <- 0.5 n <- 20 cat("true roots",-a/(n-1)-sqrt(n-2-a^2+(a/(n-1))^2), -a/(n-1)+sqrt(n-2-a^2+(a/(n-1))^2),"\n") bisec<-function(b0,b1){ Previous Next First Last Back Forward 4
f <-function(y,a,n){ a2+y^2+2*a*y/(n-1)-(n-2) #solve using bisection 1t<-0 eps <-.Machine$double.eps0.25 r<-seq(bo,b1,length=3) y<-c(f(r[1],a,n),f(r[2],a,n),f(r[3],a,n) 1f(y[1]*y[3]>0) stop("f does not have opposite sign at endpoints") while(it 1000&&abs(y[2])>eps){ 1t<-1t+1 if(y[1]*y[2]<0)[ r[3]<-r[2] y[3]<-y[2] else r[1]<-r[2] y[1]<-y[2] } r[2]<-(r[1]+r[3])/2 y[2]<-f(r[2],a=a,nn) Previous Next First Last Back Forward 5
f <- function(y, a, n) { a^2 + y^2 + 2*a*y/(n-1) - (n-2) } #solve using bisection it <- 0 eps <- .Machine$double.eps^0.25 r <- seq(b0, b1, length=3) y <- c(f(r[1], a, n), f(r[2], a, n), f(r[3], a, n)) if (y[1] * y[3] > 0) stop("f does not have opposite sign at endpoints") while(it < 1000 && abs(y[2]) > eps) { it <- it + 1 if (y[1]*y[2] < 0) { r[3] <- r[2] y[3] <- y[2] } else { r[1] <- r[2] y[1] <- y[2] } r[2] <- (r[1] + r[3]) / 2 y[2] <- f(r[2], a=a, n=n) Previous Next First Last Back Forward 5
pr1nt(c(r[1],y[1],y[3]-y[2]) bisec(0,5*n) Code 精确的解为y=4.186841,-4.239473. 1.1.2 Brent's method 二分法是一种特殊的括入根算法.Bent通过逆二次插值方法将括入 根方法和二分法结合起来.其使用y的二次函数来拟合x.如果三个点 为(a,f(a),(b,f(b),(c,f(c),其中b为当前最好的估计,则通过Lagrange多 项式插值方法(y=0)对方程的根进行估计, 【y-f(alg-f(⑥c ly-f(b)lly-f(c)la x= [f(e)-f(a)llf(e)-f(b)][f(a)-f(6)lIf(a)-f(c)] Previous Next First Last Back Forward 6
print(c(r[1], y[1], y[3]-y[2])) } } bisec(0,5*n) ↓Code °()èy = 4.186841, −4.239473. 1.1.2 Brent’s method ©{¥ò´Aœ)\äé{. Brent œL_gäê{Ú)\ äê{⁄©{(‹Â5. Ÿ¶^ygºÍ5[‹x. XJná: è(a, f(a)), (b, f(b)), (c, f(c)), Ÿ•b ècÅ–O, KœLLagrangeı ë™äê{(y = 0)Èêßä?1O, x = [y − f(a)][y − f(b)]c [f(c) − f(a)][f(c) − f(b)] + [y − f(b)][y − f(c)]a [f(a) − f(b)][f(a) − f(c)] Previous Next First Last Back Forward 6
ly-f(c)]ly-f(a) +[f(b)-f(e)lf(c)-f(a)l 在R中,函数uniroot.就是应用Brent方法求解一元方程的数值根. 例2应用uniroot求例1中方程的根. FCode a<-0.5 n<-20 out <uniroot(function(y){ a2+y^2+2*a*y/(n-1)-(n-2)], lower =0,upper n*5) unlist(out) uniroot(function(y){a2 y2 2*a*y/(n-1)-(n-2)}, interval c(-n*5,0))$root Code 函数polyroot.求一个系数为复数的多项式的根.因此,此例的问题使 用polyroot函数为 Previous Next First Last Back Forward 7
+ [y − f(c)][y − f(a)]b [f(b) − f(c)][f(c) − f(a)] 3R•, ºÍuniroot“¥A^Brentê{¶)òêßÍää. ~2 A^uniroot¶~1•êßä. ↑Code a <- 0.5 n <- 20 out <- uniroot(function(y) { a^2 + y^2 + 2*a*y/(n-1) - (n-2) }, lower = 0, upper = n*5) unlist(out) uniroot(function(y) {a^2 + y^2 + 2*a*y/(n-1) - (n-2)}, interval = c(-n*5, 0))$root ↓Code ºÍpolyroot¶òáXÍèEÍıë™ä. œd, d~ØK¶ ^polyrootºÍè Previous Next First Last Back Forward 7
TCode po1 yroot(c(a2-(n-2),2*a/(n-1),1)) Code 1.1.3 Newton's method Newton方法是一种快速求根的方法,有时也称为Newton-Raphson迭代算法. 假设f(x)是连续且可微的,且f'(x)≠0.假设我们想要求根x,我们已经有了 当前的一个近似值x,则由下图可以看出,通过导数表示斜率这一特点,可以 给出x的一个更好的近似 Previous Next First Last Back Forward 8
↑Code polyroot(c(a^2-(n-2),2*a/(n-1),1)) ↓Code 1.1.3 Newton’s method Newtonê{¥ò´ØÑ¶äê{, kûè°èNewton-RaphsonSìé{. bf(x)¥ÎYÖåá, Öf 0 (x) 6= 0. b·Çéá¶äx, ·ÇƲk còáCqäxn, Kde„å±w—, œLÍL´«˘òA:, å± â—xòáç–Cq. Previous Next First Last Back Forward 8