【学习记录-R】牛顿迭代解非线性方程组及单个方程

newtons非线性方程组迭代过程:

 

思路分解:

  1. index=1,max=100,n=0,每迭代一次n++,在100次以内算出index=1标记;100次以内无法算出符合精度的解,index=0标记
  2. Function(x)自建函数f,进行J()*f()计算,输出list A,含多个结果,A$J,A$f
  3. 迭代,输入x,y原始值,精度ep,函数f,自建函数y=x,x=y-J[(y)]-1 * f(y),用x-y与ep进行比较
  4. 输出结果

 参考:

用R语言求解非线性方程 - R爱好者 - 博客园 (cnblogs.com)

R语言中%*%运算符 - 小鲨鱼2018 - 博客园 (cnblogs.com)

例题:

  

 (我)难理解的地方:

1.精度的表示,开始看到%*%符号下意识以为是矩阵乘积,但是其结果无法用于做判断条件,后来发现代码中的%*%运算实际上是两个向量在进行,精度判断条件为:

[x(k+1)-x(k)]%*%[x(k+1)-x(k)]<ep,即每个解的第k+1次迭代结果与上一次差值的和的开方。

 

2.雅可比矩阵的计算

调用numDeriv包计算:

library(numDeriv)
fw = function(x){
y1 = x[1]^2+x[2]^2-7*x[1]-9.4
y2 = x[2]^2*x[1]-54.648
c(y1,y2)
}

f<-function(x)
{
  J<-jacobian(func=fw,x)#雅各比矩阵
  fx<-c(x[1]^2+x[2]^2-7*x[1]-9.4,x[2]^2*x[1]-54.648) #方程组
  list(fx=fx,J=J)
}

参考:R中计算jacobian矩阵和hessian矩阵 | Keep Learning (biocuckoo.org)

手动计算:

代码:
 

f<-function(x)
{
  fx<-c(x[1]^2+x[2]^2-7*x[1]-9.4,x[2]^2*x[1]-54.648) ##方程组
  J<-matrix(c(2*x[1]-7,2*x[2],x[2]^2,x[2]*x[1]-1),nrow=2,byrow=T) ##jacobj矩阵,分别对x(x[1]),y(x[2])求一阶导,按行
  list(fx=fx,J=J)
}

完整代码:

library(numDeriv)
fw = function(x){
  y1 = x[1]^2+x[2]^2-7*x[1]-9.4
  y2 = x[2]^2*x[1]-x[2]-54.648
  c(y1,y2)
}

f<-function(x)
{
  J<-jacobian(func=fw,x)#雅各比矩阵
  fx<-c(x[1]^2+x[2]^2-7*x[1]-9.4,x[2]^2*x[1]-x[2]-54.648) #方程组
  list(fx=fx,J=J)
}

Newtons<-function(f,x,ep=1e-15,max=50) ##f需要求解的方程(组)和它的jacobj矩阵,x为初始解,ep为精度要求,max为最大迭代次数
{
  index<-1 #在n>max之前跳出,则为成功找到
  n<-1 #迭代次数
  while(norm>ep)
  {
    x1<-x
    obj<-f(x1)
    x<-x1-solve(obj$J,obj$fx) ##obj$J即为方程(组)的jacobj矩阵
    norm<-sqrt((x-x1)%*%(x-x1)) ##x(k+1)y与x(k)精度之差
    n=n+1
    if(n>max)
    {
      index<-0
      break
    }
  }
  obj<-f(x)
  list(root=x,it=n,index=index,FunVal=obj$fx)
}

结果:

  

单个方程组迭代过程:

解方程例题 (方程组同理):

已知总体的分布密度为:,x的样本值为:

0.1,0.2,0.9,0.8,0.7,0.7,求α的估计量

 

 

 

 牛顿迭代解方程代码:

f<-function(x,mean){
  x1=x-(x+1)*(x+2)+mean*(x+2)^2
  list(x1=x1)
}
newton<-function(f,mean,x1,x2=-999,ep=10^(-5),max=50){
  index=1;n=0
  while(abs(x1-x2)>ep){
    n=n+1
    x2<-x1
    x<-f(x2,mean)
    x1<-x$x1#如果直接x1<-f(),x1不能参与x1-x2
    if(n>=max){
      index=0;list(x1=x1,index=index,n=n)
      break
    }
  }
  list(x1=x1,index=index,n=n)
}

 结果:

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本资源涵盖多元方程组、非线性方程和常微分方程的软件组合,介绍如下: 线性方程组的数值法: 线性方程组亦即多元一次方程组。在自然科学与工程技术中,很多问题的决常常归结为线性方程组,如电学中的网络问题,船体数学放样中的建立三次样条函数问题,机械和建筑结构的设计和计算等等。因此,如何利用电子计算机这一强有力的计算工具去求线性方程组,是一个非常重要的问题。线性方程组法分直接()法{是指在没有舍入误差的假设下,经过有限步运算即可求得方程组的精确的方法。}和迭代()法{是用某种极限过程去逐步逼近线性方程组精确的方法,即是从一个初始向量x0出发,按照一定的迭代格式产生一个向量序列xk,使其收敛到方程组A*x=b的}。该部分就是针对线性方程组而设计的,内容包括:线性方程组的直接法:Gauss消去法、Gauss列主元消去法、Gauss全主元消去法、列主元消去法应用『列主元求逆矩阵、列主元求行列式、矩阵的三角分』、LU分法、平方根法、改进的平方根法、追赶法(三对角)、列主元三角分法;线性方程组的迭代法:雅可比迭代法、高斯-塞德尔迭代法、逐次超松驰迭代法;迭代法的收敛性『正定矩阵判断、向量范数、矩阵范数、严格对角站优矩阵判断』。 非线性方程的数值法: 在科学研究与工程技术中常会遇到求解非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有求根公式,而高于四次的代数方程则无精确的求根公式,至于超越方程就更无法求其精确了。因此,如何求得满足一定精度要求的方程的近似根也就成为了广大科技工作者迫切需要决的问题。该部分就是针对这一问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。 常微分方程的数值法: 常微分方程的求问题在实践中经常遇到,但我们只知道一些特殊类型的常微分方程。在科学和工程问题中遇到的常微分方程的往往很复杂,在许多问题中,并不需要方程的表达式,而仅仅需要获得在若干点的就算即可。因此,研究常微分方程的的数值就很有必要。该部分就是针对这些而设计的,内容包括:欧拉(Euler)方法、龙格库塔(Runge-Kutta)方法、线性多步方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值