化学工程过程导论/数值求根方法
求根是指确定单变量方程或n元n次方程组的解(前提是存在这样的解)。该方法的基础是围绕根的确定。
函数 的根,定义为方程 的解。为了使用本节中的任何数值方法,方程应以特定形式表示,这是其中最常用的形式之一,除了迭代方法外,所有方法都使用这种形式。
然而,将函数转化为这种形式很容易。如果你从形式为
的方程开始,那么减去 将得到所需的形式。即使只有一边是常数,也不要忘记这样做!
示例:
如果你想使用本节后面的二分法来求方程 的一个解,你应该将方程改写为 ,以便将其置于正确形式。
由于任何方程都可以转化为这种形式,因此这些方法可能应用于任何函数,尽管它们对某些函数比其他函数更有效。
方程或方程组的解析解是指可以通过一些数学工具精确地求解的解。例如,考虑函数 ,如下图所示。
根据惯例,该函数的根在 处,或者在该函数与 x 轴相交的地方。因此,根将出现在 处。
答案x=1是解析解,因为通过使用代数,我们能够得出精确的答案。
另一方面,尝试解析地求解像
这样的方程一定会让人沮丧,因为用基本方法是不可能的。在这种情况下,需要寻求数值解,其中会进行猜测,直到答案“足够接近”,但你永远不会知道精确的答案。
下面讨论的所有数值方法都只是提供了一种系统的猜测解方法,这样你就可以更有可能(在某些情况下有保证)越来越接近真实答案。数值方法的问题是,大多数方法在没有足够好的初始猜测的情况下不能保证有效。因此,在找到接近真实答案的地方之前,尝试几个点,然后开始使用数值算法来获得更精确的答案。它们大致按照从最容易使用到更难但收敛速度更快的算法排序。
最纯粹形式的迭代解将求解所需的函数,使其形式为
然后,猜测一个 x 的值,并计算 f(x)。然后将 x 的新值重新代入 f(x),并重复此过程,直到 x 的值变化很小。
以下示例说明了此过程。
示例:
使用迭代解法计算 的根。
解:求解 x 的方程
首先我们需要猜测一个 x 来开始。让我们尝试
然后我们有
因此,保留两位小数,根为 。如果需要,可以执行更多迭代以获得更精确的答案。
正如我们将在本示例中看到的那样,这种方法有一些相当严重的限制。
示例:
重复上述步骤,但这次以不同的方式求解 x。你发现了什么?
解:为了说明这一点,让我们从猜测 开始。
求解 x 的另一种方法是更明显的方法:
显然,即使我们从一个非常好的猜测开始,解也是发散的!
本例说明了迭代法成功的关键取决于方程右侧函数的性质。特别是,它与函数在根处的斜率大小有关。如果斜率太大,该方法将不会收敛;即使斜率很小,该方法的收敛速度也很慢。因此,通常不建议使用此方法,尽管一些更有用的算法是基于它的(这也是这里介绍它的原因)。
虽然迭代求解方法有其缺点,但可以通过使用平均来大幅改进。在这个方法中,函数仍然以以下形式求解 x
从初始猜测开始,使用函数 f(x) 生成第二个猜测。但是,不是简单地将代入 f(x),而是对和进行加权平均
项被称为权重。权重的最常见值是二分之一,在这种情况下,代入 f(x) 的下一个值就是和的平均值。
然后将这个新值代入 f(x),与结果取平均值,并重复此过程直到收敛。
以下示例表明,这种方法比普通的迭代解收敛得更快,更可靠。
示例:
使用权重为的迭代法,求解方程的根。
解:让我们像上次一样从 0.5 的猜测开始,并比较这次与普通迭代相比的结果。
这里,仅经过三次函数求值(这通常是所有步骤中最耗时的步骤),我们就得到了与使用其他方法进行**七次**求值相同的精度根!
该方法不仅收敛速度更快,而且更稳定,因此它实际上可以用来以另一种方式求解方程。
示例:
从初始猜测 开始,并使用 和加权迭代法,其中,求解方程的根。
解:从 开始,我们有
因此,我们可以(缓慢地)使用加权迭代法收敛到该解。
请注意,在这种情况下,如果我们使用正则迭代,则结果只有在以特定方式求解方程时才能收敛。使用加权迭代,可以以任何方式求解它并获得解,但一种方式显然比另一种方式快。然而,加权将在大多数情况下加速算法,并且相对容易实现,因此它是一个值得使用的方法。
让我们考虑一种求根的替代方法。考虑一个函数 f(x) = 0,我们希望找到它的根。如果我们令第二个变量 ,则 y 将(几乎总是)在根的左侧和右侧之间改变符号。这可以在上面的 图像中看到,它从根的左侧的负值变为右侧的正值 。
二分法通过观察函数在两点之间改变符号,并缩小符号改变发生的区间,直到包含在内的根被紧密地包围来工作。这仅适用于 连续 函数,在该函数中,图中没有跳跃或孔洞,但是许多常用的函数都是这样,包括对数(对于正数)、正弦和余弦以及多项式。
作为更正式的解释,考虑一个函数 ,它在 和 之间改变符号。我们可以通过以下方式缩小区间:
- 在中点处评估函数
- 确定函数在每个子区间中是否改变符号
- 如果连续函数在子区间中改变符号,这意味着它包含一个根,所以我们保留该区间。
- 如果函数没有改变符号,我们将其丢弃。这可能会在区间中有两个根的情况下导致问题,因此二分法不能保证找到所有根。
虽然二分法不能保证找到所有根,但它可以保证至少找到一个,如果原始端点具有相反的符号。
重复上述过程,直到你尽可能接近根。
示例:
使用二分法找到 的根
通过代入一些数字,我们可以发现该函数在 和 之间改变符号。因此,由于该函数是连续的,因此该区间中一定至少存在一个根。
- 第一个区间:
- 中点:
- 中点的 y: 因此,符号在 0.5 和 0.75 之间改变,在 0.75 和 1 之间没有改变。
- 新的区间:
- 中点:
- 中点的 y:
- 新的区间:
- 中点:
- 中点处的 y:
我们可以继续这样做,但由于结果非常接近根,让我们看看是否有一个小于 0.625 的数字给出正函数值,从而节省一些时间。
- x 值:
- y 值:
因此,x 介于 0.5625 和 0.57 之间(因为函数在这个区间内改变符号)。
请注意,这种方法的收敛速度很慢,但很稳定。它对于将粗略的近似值改进到足够接近以使用更快的但没有保证的方法(例如加权迭代)很有用。
试位法类似于二分法。您必须再次从两个 x 值开始,在这两个 x 值之间,您要找到其根的函数 f(x) 发生变化。但是,这种方法试图找到比区间中点更好的位置来分割它。它基于以下假设:与其随意地使用区间的中点作为指南,不如进行额外的计算,以尝试考虑曲线的形状。这是通过找到两个端点之间的割线,并使用该线的根作为分割点来完成的。
更正式地说
- 绘制或计算两个端点 (a, f(a)) 和 (b, f(b)) 之间线的方程。
- 找到这条线与 x 轴的交点(或 y = 0 时),得到 x = c。
- 使用此 x 值来评估函数,得到 f(c)
- 然后,与二分法一样处理子区间。如果 f(a) 和 f(c) 之间存在符号变化,则保留区间;否则,将其丢弃。对 f(c) 和 f(b) 之间进行相同操作。
- 重复上述操作,直到您达到所需的精度。
使用以下两个公式求解割线 y = mx + B
(您可以使用任一公式)
试位法保证收敛到一个根,但它可能比二分法快也可能比二分法慢,具体取决于计算线的斜率需要多长时间以及函数的形状。
示例:
找到 的根,但这次使用试位法。
解:在进行此操作时要注意簿记!跟踪 y 值比跟踪二分法更重要,在二分法中,我们只关心函数的符号,而不是它的实际值。
为了与二分法进行比较,让我们选择相同的初始猜测: 和 ,其中 和 .
- 第一个区间:
- 割线:
- 割线的根:
- 根处的函数值:
请注意,在这种情况下,我们可以丢弃比二分法大得多的区间(二分法将使用 作为分割点)
- 第二个区间:
- 割线:
- 割线的根:
- 根处的函数值:
我们仅仅经过两次迭代就得到了几乎完全精确的根!
在某些情况下,试位法可能会比二分法花费更长时间,这取决于曲线的形状。然而,由于试位法可能带来的显著提速,尝试几次迭代通常是值得的。
切线法 (牛顿法)
[edit | edit source]在这个方法中,我们试图使用函数的切线来找到函数 y = f(x) 的根。这与割线法类似,但它“脱离”了旧的点,只关注新的点,从而希望避免割线法例子中遇到的停滞现象。
由于这门课假设学生还没有学习微积分,因此切线将通过找到两个非常接近的点(分别用 (x) 和 表示)之间的直线方程来近似。该方法的工作原理如下:
- 选择一个初始猜测值,
- 在 和 处评估函数 f(x),其中 是一个很小的数字。这会在你的(近似)切线上产生两个点。
- 使用上面给出的公式找到切线的方程。
- 找到这条线的根。这是
- 重复步骤 2-4,直到你找到你想要的接近根的值。
除非你从一个足够好的第一个猜测值开始,否则该方法无法保证收敛,这就是为什么保证收敛的方法对于生成一个合适的猜测值非常有用。然而,由于该方法在收敛时比其他任何方法都快得多,因此如果有一个合适的猜测值,则最好使用该方法。
示例:
使用切线法找到 的根。
解:为了与迭代结果进行比较,让我们猜测 。选择
- 切线方程:
- 切线方程的根:
仅用**一次**计算,我们就已经获得了与目前为止所有其他方法相同的精度!