用R语言求解非线性方程
2014-12-04 10:10
169 查看
从本质上来说,Newtons就是用迭代方式,使近似解(泰勒公式)不断的逼近真实解,当满足精度要求时,即可认为近似解为真实解
下面用R语言实现Newtons法
Newtons<-function(fun,x,ep=1e-5,it_max=100) ##fun为需要求解的方程(组),x为初始解,ep为精度要求,it_max为最大迭代次数
{
index<-0 ##指示是否完成迭代成功,满足精度要求
k<-1 ##迭代次数
while(k<=it_max)
{
x1<-x;obj<-fun(x);
x<-x-solve(obj$J,obj$f) ##obj$J即为方程(组)的jacobj矩阵
norm<-sqrt((x-x1)%*%(x-x1)) ##x(k+1)y与x(k)精度之差
if(norm<ep)
{
index<-1
break
}
k<-k+1
}
obj<-fun(x);
list(root=x,it=k,index=index,FunVal=obj$f,Jacobi=obj$J)
}
现在来构造需要求解的方程(组)和它的jacobj矩阵
funs<-function(x)
{
f<-c(x[1]^2+x[2]^2-5,(x[1]+1)*x[2]-(3*x[1]+1)) ##方程组
J<-matrix(c(2*x[1],2*x[2],x[2]-3,x[1]+1),nrow=2,byrow=T) ##jacobj矩阵,分别对x1和x2求一阶导
list(f=f,J=J)
}
计算结果:
> Newtons(funs,c(0,1))
$root
[1] 1 2
$it
[1] 6
$index
[1] 1
$FunVal
[1] 1.598721e-14 6.217249e-15
$Jacobi
[,1] [,2]
[1,] 2 4
[2,] -1 2
有兴趣的同学,可以用debug(Newtons)来调试计算过程
相关文章推荐
- R语言非线性方程组求解dfsane,nleqslv
- 牛顿下山法求解非线性方程(组)(C实现)
- 使用matlab进行非线性方程组求解
- python用fsolve、leastsq对非线性方程组进行求解
- matlab中求解由符号表达式组成的非线性方程组
- 对分法求解非线性方程
- Matlab非线性方程求解
- R语言求解线性方程组
- Python求解非线性方程
- 非线性方程组求解算法的C++实现
- R语言-加快混合整数规划求解速度试验(1)
- 试位法求解非线性方程
- 二分法,newton迭代法求解非线性方程组
- matlab实现牛顿迭代法求解非线性方程组
- 用牛顿迭代法求解非线性方程
- R语言-条件约束最优化_整数规划、线性规划求解(Rglpk)
- matlab实现牛顿迭代法求解非线性方程组
- R语言求解线性回归方程
- 用弦割法求解非线性方程
- Newton-Raphson法求解非线性方程复根