如何计算连续函数 f(x) 在 X 轴上的零点?


n

介绍:
本文包含一个如何计算连续函数 f(x) 在 X 轴上的零点的 S7-SCL 程序。在功能块 FB1 “Solve”中有两种数学方法可以计算零点。n

  • 等分法n
  • 割线法

图 01 显示了一个连续函数在完整区间 [a, b] 的曲线图,其在左端小于零,其在右端大于零。很明显,由于曲线没有跳跃并连续,其必然要与 X 轴交叉一次。这也就意味着函数 f(x) 在 (a, b) 区间内至少有一次零值。n

等分法

此方法适用于在区间 I = [a, b] 连续的函数,并且此函数在端点 a 和 b 之间改变了符号,例如 f(a) * f(b) < 0。n

通过连续等分区间及实数来计算零点。n

如何计算连续函数 f(x) 在 X 轴上的零点?
图 01n

根据中值定理,此例中包含一个 x0 € I, 满足f(x0) = 0。可以通过连续使用等分法至 f(x) 符号改变位置,来求得此 x0 的精确逼近。忽略条件是一个小的,为正的错误边界“e”:n

  1. 用(a + b) / 2 替代 x;n
  2. 如果 f(x) = 0, 跳转至 <状态 5>;n
  3. 如果 f(a) f(x) > 0,用 x 替代 a,否则用 x 替代 b;n
  4. 如果 |a - b| > e, 跳转至 <状态 1>;n
  5. 输出:(a + b) / 2

通过使用一个循环指令替代跳转指令可以改进上面的状态顺序,可以不使用 f(x) = 0 条件及不使用乘法指令:n

  1. 用 (a + b) / 2 替代 x;n
  2. 只要|a - b| > e;
  1. 如果 f(a) f(x) 同符号,用 x 替代 a,否则用 x 替代 b;n
  2. Replace x with (a + b) / 2;
  1. 输出:x

此运算仅在 n 步后逼近零点,此时e < (b - a) / 2n+1。n

割线法

此方法类似于等分法,适用于在区间 I = [a, b] 连续的函数。不同于等分法,不再使用(a + b) / 2 来选择 x,而是使用(a, f(a)) and (b, f(b))与X轴的交点来选择 x。n

如何计算连续函数 f(x) 在 X 轴上的零点?
图 02n

根据割线,及 X 轴,Y 轴与 a ,b 的截距组成的图形,x 可以根据以下比例导出:n

  • x - a b - x a f(b) - b f(a)
    ------ = -------,x = ---------------.
    -f(a) f(b) f(b) - f(a)

下面是非正式的过程描述:n

  1. 只要|a - b| > e;
  1. 用行“•” 的表达式替代 x ;n
  2. 用 b 替代 a ;n
  3. 用 x 替代 b ;
  1. 输出:x

由于更多地计算“reference point”,割线法一般快于等分法。但特定的一些序列会使此方法变慢,例如,如果零点位于区间的边缘,并且曲线急剧上升。不同于等分法,条件 a < b 可以相反。n

程序描述:
下载包“Solution.zip” 包含一个 S7-SCL 编写的功能块 FB1 (S7-SCL source:“Solve”),其通过等分法及割线法计算零点。此处有 4 个应用程序的例子,FB10, FB11, FB12及 FB13 ( S7-SCL source: “Cases”)。n

  • Case 1: FB10, DI10n
  • Case 2: FB11, DI11n
  • Case 3: FB12, DI12n
  • Case 4: FB13, DI13

FB1 查找此 4 个方程式的零点。下表描述了此 4 个例子的解决方法:n

情形: 数学表达式: 方法: 开始位置:
1 Y = X3+8 割线法 -10 to 10
2 Y = 100.0(1+3.9083*10-3X-5.775*10-7X2-4.183*10-12X3(X-100))-18.493 等分法 -300 to 0
3 Y = X 割线法 -0.5 to 10
4 Y = X3-2X-5 割线法 -10 to 10

在 FB1 中调用 FC2 来初始化FB10, FB11, FB12及 FB13 的数据块,在 OB1 中每次调用 FB1 使用一个背景数据块来对应于每个应用例子。类似于 FB 及 DI 的编号,DB块地址,要把起始位置参数分配给FB1。n

  1. 在情形 1 中调用 FB1, DI1(FB10, DI10)n
  2. 在情形 2 中调用 FB1, DI2(FB11, DI11)n
  3. 在情形 3 中调用 FB1, DI3(FB12, DI12)n
  4. 在情形 4 中调用 FB1, DI4(FB13, DI14)

零点的输出值存储在 FB1 的背景数据块中。图 03 显示了例子应用1 (Y = X3+8)的变量表。输出值,当 X= -2时, Y= 0,并存储在DB1.DBD30及 DB1.DBD34。为了完成此结果,功能块需要 27 次内部操作及大概 1ms 的运行时间。n

如何计算连续函数 f(x) 在 X 轴上的零点?
图 03n

对于每个要集成在 STEP7 项目中的数学连续函数,必须生成一个功能块,从 FB10 至 FB13。可以在 S7-SCL 源文件生成它,或将其集成在S7-SCL 源文件“Cases”中。必须在 SIMATIC Manager 为这些新的 FB 组态背景数据块。相应于每个应用例子,OB1 每次调用 FB1,都需另外指定一个背景数据块给 FB1,并赋予相应的参数(FB 编号,DI编号,起始位置等等)。

如何计算连续函数 f(x) 在 X 轴上的零点?
图 04

下载:
附件“Solution.zip”包括一个上面描述的 STEP7 项目。将“Solution.zip”文件复制到一个单独目录。该 STEP7 V5.4 项目会自动解压缩所有相关的子目录。可以使用 SIMATIC Manager 来打开和测试解包的项目。

如何计算连续函数 f(x) 在 X 轴上的零点? Solution.zip ( 42 KB )

运行及测试环境: 
程序例子可以被 SIMATIC S7-300,S7-400,,C7和 WinAC 的 CPU 使用,下表列出了在生成本条目及校验功能的过程中使用的组件。

测试环境: 版本:
PC 平台 Intel(R) Pentium(R) M Processor 1.73 GHz, 1.49 GB RAM
PC 操作系统 MS Windows XP SP2
STEP 7 V5.4 SP1
选项包S7 PLCSIM V5.3 SP1

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc336897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论