|
通常把F和Jacobian Matrix分别定义,
方便在多个联立方程时除错
底下是简单两个联立方程之求解:
#function values
fun = function (x)
{
f = array(0,c(2,1))
f[1] = x[1] + 2*x[2] - 2
f[2] = x[1]^2 + 4*x[2]^2 - 4
f
}
############
#derivative values,Jacobian Matrix 2x2
Jac = function (x)
{
j = rbind(c(1,2),c(2*x[1],8*x[2]))
j
}
#############
NR = function (f, J, x0, tol, max.it)
{
xold = x0
xnew = xold - solve(Jac(xold)) %*% fun(xold)
for (k in 1:max.it)
{
xold = xnew
niter = k
xnew = xold - (solve(Jac(xold)) %*% fun(xold))
if((svd(fun(xnew))$d < tol) | max(abs(xold-xnew))/max(abs(xnew))<tol | (niter==max.it) ) break
xold=xnew
}
list(r=xnew,niter=niter)
}
############
result=NR (fun, Jac, x0=c(1,2), tol=1.0e-06, max.it=20)
result
$r
[,1]
[1,] -6.27144e-09
[2,] 1.00000e+00
$niter
[1] 4
|