在机器人算法开发中,经常会遇到求解非线性方程。非线性方程的求解十分困难,这里介绍两种方法:

1. 二分法 2.牛顿迭代法

定义:

非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,
例如平方关系、对数关系、指数关系、三角函数关系等等.
求解此类方程往往很难得到精确解,经常需要求近似解问题.

二分法:

二分法又称二分区间法,是求解非线性方程的近似根的一种常用的简单方法.
二分法的基本思想是: 首先确定有根区间,将区间二等分, 通过判断f(x)的符号,
逐步将有根区间缩小, 直至有根区间足够地小, 便可求出满足精度要求的近似根。
首先应确定方程在[a,b]区间确定存在至少一个实数根:
由高等数学知识知, 设f (x)为区间[a,b]上的单值连续, 如果f (a)·f (b)<0 ,
则[a,b]中至少有一个实根。如果f (x)在[a,b]上还是单调地递增或递减,
则仅有一个实根.
二分法求根过程
设方程f(x)=0在区间[a,b]内有根,二分法就是逐步收缩有根区间,最后得出所求的根。具体过程如下
① 取有根区间[a,b]之中点, 将它分为两半x0=(a+b)/2,分点,这样就可缩小有根区间
② 对压缩了的有根区间[a1,b1]施行同样的手法,即取中点x1=(a1+b1)/2,将区间[a1,b1]再分为两半,然后再确定有根区间[a2,b2]],其长度是[a1,b1]的二分之一.
③ 如此反复下去,若不出现f(xk)=0,即可得出一系列有根区间序列,每个区间都是前一个区间的一半,因此[ak,bk]的长度:

b k − a k = b k − 1 − a k − 1 2 = . . . = b − a 2 k b_k-a_k=\frac{b_{k-1}-a_{k-1}}{2}=...=\frac{b-a}{2^k} bk​−ak​=2bk−1​−ak−1​​=...=2kb−a​

当k->∞时趋于零,区间最终收敛于一点x即为所求的根.
只要二分足够多次,便有:

∣ x ∗ − x k ∣ < ϵ ϵ 是 给 定 的 精 度 , 当 k ≥ l g ( b − a ) − l g ϵ l g 2 − 1 时 , 做 到 k + 1 次 二 分 , 计 算 得 到 的 x k 就 是 满 足 满 足 精 度 的 近 似 解 , 在 程 序 中 通 常 用 相 邻 的 x k 与 x k − 1 的 差 的 绝 对 值 或 a k 与 b k 的 差 的 绝 对 值 是 否 小 于 ε 来 决 定 二 分 区 间 的 次 数 。 |x^*-x_k|<\epsilon \\ \epsilon 是给定的精度,当\\ k \ge\frac{lg(b-a)-lg\epsilon}{lg2}-1时,做到k+1次二分,\\ \\ 计算得到的x_k就是满足满足精度的近似解,在程序中通常用相邻的x_k与x_{k-1}的差的绝对值\\ 或a_k与b_k的差的绝对值是否小于ε来决定二分区间的次数。 ∣x∗−xk​∣<ϵϵ是给定的精度,当k≥lg2lg(b−a)−lgϵ​−1时,做到k+1次二分,计算得到的xk​就是满足满足精度的近似解,在程序中通常用相邻的xk​与xk−1​的差的绝对值或ak​与bk​的差的绝对值是否小于ε来决定二分区间的次数。

流程图:

牛顿迭代法

牛顿迭代法一种重要和常用的迭代法, 它的基本思想是将非线性函数f(x)逐步线性化, 从而将非线性方程f(x)=0近似地转化为线性方程求解。
牛顿迭代法的推导:
对于方程f(x)=0,设其近似根为xk, 函数f(x)可在xk附近作泰勒展开

f ( x ) = f ( x k ) + f ′ ( x − x k ) + f ′ ′ ( x k ) ( x − x k ) 2 2 + . . . 忽 略 高 次 项 f ( x ) ≈ f ( x k ) + f ′ ( x k ) ( x − x k ) 设 x ∗ 为 实 际 根 , 则 有 f ( x ∗ ) = 0 , 即 x ∗ = x k − f ( x k ) f ′ ( x k ) 这 就 是 牛 顿 迭 代 公 式 : x k + 1 = x k − f ( x k ) f ′ ( x k ) f(x)=f(x_k)+f^{'}(x-x_k)+\frac{f^{''}(x_k)(x-x_k)^2}{2}+...\\ 忽略高次项\\ f(x)≈f(x_k)+f^{'}(x_k)(x-x_k)\\ 设x^*为实际根,则有f(x^*)=0,即\\ x^*=x_k-\frac{f(x_k)}{f^{'}(x_k)}\\ 这就是牛顿迭代公式:\\ x_{k+1}=x_k-\frac{f(x_k)}{f^{'}(x_k)}\\ f(x)=f(xk​)+f′(x−xk​)+2f′′(xk​)(x−xk​)2​+...忽略高次项f(x)≈f(xk​)+f′(xk​)(x−xk​)设x∗为实际根,则有f(x∗)=0,即x∗=xk​−f′(xk​)f(xk​)​这就是牛顿迭代公式:xk+1​=xk​−f′(xk​)f(xk​)​

流程图:

算法实践

根据S形曲线加减速算法

设置参数条件为:

S = 5.3 V m = 5 V s = 0 V e = 30 A = 100 J = 600 S = 5.3\\ Vm = 5\\ V_s = 0\\ V_e = 30\\ A = 100\\ J = 600\\ S=5.3Vm=5Vs​=0Ve​=30A=100J=600

推导得知,按照V,J加速到Ve,位移S’>S,即需要降低Ve,解得合适的Ve使得S’=S.
S'计算公式如下:

{ t 1 = A J t 2 = V e − V s A − t 1 S ′ = ( V s + V e ) 2 ∗ ( 2 t 1 + t 2 ) \begin{cases} t1=\frac{A}{J}\\ t_2=\frac{V_e-V_s}{A}-t_1\\ S'=\frac{(V_s+V_e)}{2}*(2t_1+t_2)\\ \end{cases} ⎩⎪⎨⎪⎧​t1=JA​t2​=AVe​−Vs​​−t1​S′=2(Vs​+Ve​)​∗(2t1​+t2​)​

使用二分法和牛顿法两种方法迭代计算Ve.

二分法:

核心代码://二分法double a,b;int n=0;b = ve;a = tmp;while(1){tmp = (a+b)/2;n++;S1 = CalSacc(vs,tmp,A,J);if(fabs(S1-S)<1e-6){break;}if(S1 > S){b = tmp;}else{a = tmp;}}
共计迭代了n=21次,近似解Ve=25.2738762

牛顿法:

核心代码://牛顿法double a,b,c;int n=0;tmp = (tmp+ve)/2;while(1){n++;//ve 在 A*A/J+vs 和 ve之间a = (vs+tmp)*(A/J+(tmp-vs)/A)-2*S;b = A/J+(tmp-vs)/A+(vs+tmp)/A;c = tmp-a/b;if(fabs(c-tmp)<1e-6){break;}tmp = c;}
共计迭代了n=4次,近似解Ve=25.2738749

可知,牛顿迭代法的收敛速度远快于二分法,有助于节约处理器的计算资源.

非线性方程求解 :二分迭代法和牛顿迭代法相关推荐

  1. python迭代法求解非线性方程_荐【数学知识】非线性方程求解的二分法以及牛顿迭代法...

    [数学知识]非线性方程求解的二分法以及牛顿迭代法 本博客不谈及理论推导,只提供代码实现,关于理论推导,大家可以查看其它博客文章. 导入包 import sys import math import s ...

  2. 基于Python实现Aitken迭代法和牛顿迭代法

    目录 简单迭代法 简单迭代法的Aitken加速算法 基于Pyhton实现的Aitken加速算法 牛顿迭代法 基于Pyhton实现的牛顿迭代法 对于非线性方程,我们可以使用迭代的方式求出近似解.下面介绍 ...

  3. 不动点迭代法和牛顿迭代法

    不定点迭代法 方程的根 不动迭代法的概念 代码实现 import numpy import numpy as np from sympy import * import math import mat ...

  4. 分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根

    编写程序,分别用二分法和牛顿迭代法求解方程x3 – 3x – 1 = 0在x = 2附近的实根,要求计算精确到小数点后七位数字为止,并将求出的近似结果与理论值2cos20 相比较,二分法的初始迭代区间 ...

  5. 二分法和简单迭代法的优缺点_二分法和牛顿迭代法求解方程的比较.doc

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp高等教育&nbsp>&nbsp理学 二分法和牛顿迭代法求解方程的比较.doc5页 本文档一共 ...

  6. 题目:任意给定一个浮点数,计算这个浮点数的立方根。(基于二分法和牛顿迭代法)(基于Java实现)

    题目:任意给定一个浮点数,计算这个浮点数的立方根.(基于二分法和牛顿迭代法)(基于Java实现) 首先,来分析一下这道题,其实在leetcode上做了求解根号3的题之后,对于这种求解立方根的题,基本上 ...

  7. 方程组线性化方法和牛顿迭代法基础

    方程组线性化方法和牛顿迭代法基础 非线性方程组线性化和牛顿迭代法 参考书籍:GPS原理与接收机设计 谢钢 非线性方程,就是因变量与自变量之间的关系不是线性的关系,这类方程很多,例如平方关系.对数关系. ...

  8. 数值计算方法——不动点迭代和牛顿迭代法

    不动点迭代和牛顿迭代法 MATLAB基础 feval函数 format long syms x 简单迭代法[不动点迭代] Newton 迭代法 作业 MATLAB基础 feval函数 用于求函数值 基 ...

  9. 数值计算方法——Jacobi迭代法和G-S迭代法

    Jacobi迭代法和G-S迭代法 没完成的代码,仅做储存 矩阵常用操作 Jacobi迭代实现 G-S迭代实现 没完成的代码,仅做储存 function [L,D,U]=LU(A) n=length(A ...

最新文章

  1. 信号完整性 带宽的确定
  2. 童心制物(Makeblock)受邀参加2020年韩国机器人世界展览会,倡导以先进的STEAM教育培养未来复合型人才
  3. 5-510寝室课后习题4.35
  4. Linux 空格转换行
  5. python numpy np.argsort()(返回将对数组进行排序的索引)(不懂区别?)
  6. 网页“console”输出图文信息
  7. 2019年中国十大富豪排名出炉!马化腾力压马云位列榜首
  8. 高清动漫壁纸,满足动漫视觉控的你
  9. 怎么设计接口测试用例更好——百度大佬“教你写用例”
  10. vsc写vue生成基本代码快捷键_Vscode添加用户代码实现基础模板快速调用
  11. basis问题专区(文档)
  12. BroadcastReceiver入门
  13. BZOJ2438[中山市选2011] 杀人游戏
  14. 地震(earthquake)
  15. 2021爱分析・区域性银行数字化实践报告
  16. mysql替换占位符_【占位符替换】替换String中的占位符标志位{placeholder}
  17. Java项目Maven配置操作Pdf
  18. python opencv实现 12色相环、24色相环(基于RGB空间和基于HSV空间实现)
  19. 看英语数据手册很难?5步帮你搞定!
  20. 计算n阶行列式的C语言实现

热门文章

  1. 【转载】一个硕士程序员的求婚日记——做开发的不是木头人!
  2. Unity3D 角色控制器 Character Controller
  3. html5知识点:超文本标记语言编程
  4. 个人博客主页搭建随笔
  5. Python—实现语音自动播报最新疫情信息
  6. 【轉】一個在台積電工作3年的工程師寫給學弟學妹們的信
  7. android 内置默认输入法
  8. scrollToBottom
  9. HTTP响应头使用X-Content-Options、X-XSS-Protection、X-Frame-Options
  10. @Around简单使用示例——SpringAOP增强处理