【学习记录-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)
}

 结果:

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛顿迭代法是一种用于解非线性方程组算法。它是通过使用函数的泰勒级数来逼近方程的根的。简单来说,牛顿迭代法通过不断迭代来逼近方程的根,直到满足给定的收敛条件。牛顿迭代法在实数域和复数域上都可以使用。 具体步骤如下: 1. 首先,选择一个初始近似值作为方程的根。 2. 使用该近似值计算方程的函数值和导数值。 3. 使用牛顿迭代公式 x1 = x0 - f(x0) / f'(x0),其中x1是新的近似值,x0是旧的近似值,f(x)是方程的函数值,f'(x)是方程的导数值。 4. 重复步骤2和步骤3,直到满足给定的收敛条件,例如达到指定的精度或迭代次数。 需要注意的是,牛顿迭代法可能会出现收敛失败的情况,特别是当初始近似值选择不当或方程具有特殊的性质时。因此,在使用牛顿迭代解非线性方程组时,需要注意选择合适的初始近似值,并进行收敛性和稳定性的分析。 牛顿迭代法在数值计算和科学工程中被广泛应用,特别是在求解非线性方程组时。它具有平方收敛性,因此可以快速逼近方程的根。此外,牛顿迭代法还可以用于求方程的重根和复根,并可以通过一些技巧将线性收敛性转化为超线性收敛性。 总之,牛顿迭代法是一种常用的求解非线性方程组算法,它通过使用函数的泰勒级数来逼近方程的根,具有较高的收敛速度和精度。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab实现牛顿迭代法求解非线性方程组教学文稿.pdf](https://download.csdn.net/download/m0_62089210/85510922)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [利用牛顿迭代法求解非线性方程组](https://blog.csdn.net/weixin_42452301/article/details/117206760)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值