在数学领域,为了便于研究,一些较复杂的函数可以用简单的函数来近似表达。而本篇文章将要介绍的泰勒公式,可以用简单熟悉的多项式近似代替公式中出现的函数,从而将复杂的公式化简为多顶式的求解问题。 同时,泰勒公式为计算机领域实现科学计算的所需函数提供了一种解题思路,可以利用计算机加减乘除的基本运算实现各种数学函数模型。
最优化理论是应用数学的一个分支,也是人工智能数学模型的理论基础之一。 最优化理论研究的是判定给定目标函数的最大值(最小值)是否存在,并找到令目标函数取到最大值(最小值)的数值。人工智能之数学基础篇—高等数学基础(下篇)一文中介绍的梯度下降法就是最优化理论常见方法之一,本篇文章将介绍一种适用于约束优化问题的方法一一拉格朗日乘子法。
很多同学在学习泰勒公式时觉得它非常复杂, 单是长长的公式就让人望而生畏。其实,它的出发点就是用简单熟悉的多项式来近似代替函数。 例如,在微积分的应用中已经知道,当 ∣ x ∣ \left | x \right | ∣x∣ 很小时,有近似等式 e x ≈ 1 + x e^{x}\approx 1+x ex≈1+x、 l n ( x ) ≈ 1 + x ln\left ( x \right )\approx 1+x ln(x)≈1+x。
用多项式来近似代替函数有两个好处:一个是多项式容易计算函数值,另一个是多项式的导数和积分仍然是多项式。
多项式由它的系数确定,其系数又由它在某一点的函数值及导数所确定。这一句不好理解,接下来我们一点一点地进行分析。
首先,回忆微分知识。
在图1中 p p p 点处,横坐标为 x 0 x_{0} x0, 若 f ′ ( x 0 ) f^{'}(x_{0}) f′(x0) 存在,在 x 0 x_{0} x0 附近有 f ( x 0 + Δ x ) − f ( x 0 ) ≈ f ′ ( x 0 ) Δ x f(x_{0}+\Delta x)-f(x_{0})\approx f^{'}(x_{0})\Delta x f(x0+Δx)−f(x0)≈f′(x0)Δx,可以得到 f ( x ) = f ( x 0 ) + f ′ ( x 0 ) Δ x + o ( x − x 0 ) f(x) = f(x_{0}) + f^{'}(x_{0})\Delta x +o(x-x_{0}) f(x)=f(x0)+f′(x0)Δx+o(x−x0)。也就是说,在点 x 0 x_{0} x0 附近 f ( x ) f(x) f(x) 的值线性逼近 f ( x 0 ) + f ′ ( x 0 ) Δ x f(x_{0}) + f^{'}(x_{0})\Delta x f(x0)+f′(x0)Δx。通俗来说,就是以直代曲。
当 ∣ x ∣ \left | x \right | ∣x∣ 很小时,有近似等式 e x ≈ 1 + x e^{x}\approx 1+x ex≈1+x、 l n ( x ) ≈ 1 + x ln\left ( x \right )\approx 1+x ln(x)≈1+x,从图2可以看出,在原点附近,函数 y = x + 1 y=x+1 y=x+1 逼近 y = e x y=e^{x} y=ex,函数 y = x y=x y=x 逼近 y = l n ( 1 + x ) y=ln(1+x) y=ln(1+x)。
下面对函数 f ( x ) = c o s x f(x)=cosx f(x)=cosx 进行分析。在原点,用公式 f ( x 0 ) + f ′ ( x 0 ) Δ x f(x_{0}) + f^{'}(x_{0})\Delta x f(x0)+f′(x0)Δx 求得在原点 O O O 的近似函数为 c o s ( x ) ≈ f ( 0 ) + f ′ ( 0 ) ( x − 0 ) = c o s 0 + ( − s i n 0 ) ( x − 0 ) = 1 cos(x)\approx f(0)+ f^{'}(0)(x-0)=cos0+(-sin0)(x-0)=1 cos(x)≈f(0)+f′(0)(x−0)=cos0+(−sin0)(x−0)=1,也就是图3中的横线 l l l。
从上面几个图例可以看出,线性逼近的优点是形式简单、计算方便。 但是,如图4(a)所示,按照直线拟合预测 f ( x ) f(x) f(x) 上的点 Q Q Q, 显然有误差;同时,如图4(b)所示, f 1 ( x ) f_{1}(x) f1(x)、 f 2 ( x ) f_{2}(x) f2(x)、 f 3 ( x ) f_{3}(x) f3(x)、 f 4 ( x ) f_{4}(x) f4(x) 在 p p p 点的切线都与 f ( x ) f(x) f(x) 相同,都可以用同样的近似函数表示,一条直线可以线性逼近若干个函数, 所以只用一阶导数不够准确。
一阶导数只是帮函数定位出下一个点是上升还是下降,如图 5 所示,在点 p ( x 0 , y 0 ) p(x_0,y_0) p(x0,y0) 处,若 y y y 的一阶导数大于 0,则 y y y 的下一个邻接点在平行线 l l l 的上方;若 y y y 的一阶导数小于 0,则 y y y 的下一个邻接点在平行线 l l l 的下方。
如何才能更准确一些呢?如果把二阶导数利用上呢?如图 6 所示,坐标系被两根直线 a a a与 b b b 分割成了 4 个部分,若 y y y 的一阶导数大于 0 并且二阶导数大于 0, 则 y y y 的下一个邻接点在 A A A 部分;若 y y y 的一阶导数大于 0 并且二阶导数小于 0, 则 y y y 的下一个邻接点在 B B B 部分;若 y y y 的一阶导数小于 0 并且二阶导数大于 0, 则 y y y 的下一个邻接点在 C C C 部分;若 y y y 的一 阶导数小于0 并且二阶导数小于 0,则 y y y 的下一个邻接点在 D D D 部分。
将一阶导数和二阶导数都考虑进去,会得到如下结论。
如果多项式 p 2 ( x ) p_{2}(x) p2(x) 与 f ( x ) f(x) f(x) 在 x 0 x_0 x0 点相交,即 p 2 ( x 0 ) = f ( x 0 ) p_{2}(x_{0})=f(x_{0}) p2(x0)=f(x0);如果多项式 p 2 ( x ) p_{2}(x) p2(x) 与 f ( x ) f(x) f(x) 在 x 0 x_0 x0 点有相同的切线,即 p 2 ′ ( x 0 ) = f ′ ( x 0 ) p_{2}'(x_{0})=f'(x_{0}) p2′(x0)=f′(x0);如果多项式 p 2 ( x ) p_{2}(x) p2(x) 与 f ( x ) f(x) f(x) 在 x 0 x_0 x0 点的弯曲方向相同,即 p 2 ′ ′ ( x 0 ) = f ′ ′ ( x 0 ) p_{2}''(x_{0})=f''(x_{0}) p2′′(x0)=f′′(x0),那么在 x 0 x_0 x0 处, p 2 ( x ) ≈ f ( x ) p_{2}(x)\approx f(x) p2(x)≈f(x),即 p 2 ( x ) p_{2}(x) p2(x) 逼近 f ( x ) f(x) f(x)。
【例1】如图 7 所示, f 1 ( x ) f_{1}(x) f1(x)、 f 2 ( x ) f_{2}(x) f2(x)、 f 3 ( x ) f_{3}(x) f3(x) 哪个函数更逼近 f ( x ) f(x) f(x) 呢?
解:图中显示 f 2 ( x ) f_{2}(x) f2(x) 更逼近 f ( x ) f(x) f(x)。可以看出 f 2 ( x ) f_{2}(x) f2(x) 的二阶导数与 f ( x ) f(x) f(x) 的二阶导数在交点处弯曲方向一致。根据前面结论可知, f 2 ( x ) f_{2}(x) f2(x) 在 x 0 x_0 x0 附近是 3 个函数中最逼近 f ( x ) f(x) f(x) 的函数。
继续讨论 c o s x cosx cosx 函数在原点的二次逼近。
【例2】已知二次多项式 p 2 ( x ) = a 0 + a 1 x + a 2 x 2 p_{2}(x)=a_{0}+a_{1}x+a_{2}x^{2} p2(x)=a0+a1x+a2x2,在原点逼近 f ( x ) = c o s x f(x)=cosx f(x)=cosx 时,求 a 0 a_{0} a0、 a 1 a_{1} a1 和 a 2 a_{2} a2 的值。
解:根据前面结论,可知
二次逼近 c o s x ≈ a 0 + a 1 x + a 2 x 2 cosx \approx a_{0}+a_{1}x+a_{2}x^{2} cosx≈a0+a1x+a2x2。将 a 0 a_{0} a0、 a 1 a_{1} a1 和 a 2 a_{2} a2 的值代入公式可得 c o s x ≈ 1 − x 2 2 cosx \approx 1-\frac{x^{2}}{2} cosx≈1−2x2。如图8所示,可以看出 p 2 ( x ) p_{2}(x) p2(x) 在区间 [ − π 2 , π 2 -\frac{\pi }{2},\: \frac{\pi }{2} −2π,2π] 的逼近效果好于 p 1 ( x ) p_{1}(x) p1(x)。
【例3】已知八次多项式 p 8 ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + a 4 x 4 + a 5 x 5 + a 6 x 6 + a 7 x 7 + a 8 x 8 p_{8}(x)=a_{0} + a_{1}x + a_{2}x^{2}+a_{3}x^{3}+a_{4}x^{4}+a_{5}x^{5}+a_{6}x^{6}+a_{7}x^{7}+a_{8}x^{8} p8(x)=a0+a1x+a2x2+a3x3+a4x4+a5x5+a6x6+a7x7+a8x8,在原点逼近 f ( x ) = c o s x f(x)=cosx f(x)=cosx 时,求解各系数值。
解:求解过程同上,不再重复。结果带入公式得: p 8 ( x ) = 1 − x 2 2 ! + x 4 4 ! − x 6 6 ! + x 8 8 ! p_{8}(x)=1 - \frac{x^{2}}{2!} + \frac{x^{4}}{4!} - \frac{x^{6}}{6!}+\frac{x^{8}}{8!} p8(x)=1−2!x2+4!x4−6!x6+8!x8逼近结果如图9所示,可以看出八次多项式在更大的范围内逼近 c o s x cosx cosx。
那么,依此类推,是不是用更高阶的多项式来表达,就会更加逼近函数呢?
【例4】假设 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处具有 n n n 阶导数,试找出一个关于 ( x − x 0 ) (x-x_0) (x−x0) 的 n n n 次多项式来近似表达 f ( x ) f(x) f(x)。设: p n ( x ) = a 0 ( x ) + a 1 ( x − x 0 ) + a 2 ( x − x 0 ) 2 + ⋯ + a n ( x − x 0 ) n p_{n}(x)=a_{0}(x)+a_{1}(x-x_0) + a_{2}(x-x_0)^{2}+\cdots + a_{n}(x-x_0)^{n} pn(x)=a0(x)+a1(x−x0)+a2(x−x0)2+⋯+an(x−x0)n要求 p n ( x ) − f ( x ) p_{n}(x) - f(x) pn(x)−f(x) 的差是当 x → x 0 x\rightarrow x_{0} x→x0 时比 ( x − x 0 ) n (x-x_0)^{n} (x−x0)n 高阶的无穷小。
将上述所得结果称为 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处关于 ( x − x 0 ) (x-x_0) (x−x0) 的 n n n 阶泰勒多项式。
从上面推理可知,泰勒多项式是根据函数在点 x 0 x_0 x0 的信息情况来取其附近值的公式,如果函数足够平滑,并且函数在点 x 0 x_0 x0 处的各阶导数值存在,泰勒公式就可以利用这些导数值来作系数,构建一个多项式近似替代函数。可见一点一世界!
根据前面的讨论,阶数越高,多项式越逼近,那么什么时候满足逼近结果呢?下面引入误差项的概念。
定理1 如果函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 处具有 n n n 阶导数,那么存在 x 0 x_0 x0 的一个邻域,对于该邻域内的任意点 x x x, 有 f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 ! f ′ ′ ( x 0 ) ( x − x 0 ) 2 + ⋯ + 1 n ! f ( n ) ( x 0 ) ( x − x 0 ) n + R n ( x ) f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{1}{2!}f''(x_0)(x-x_0)^2+\cdots +\frac{1}{n!}f^{(n)}(x_0)(x-x_0)^n+R_{n}(x) f(x)=f(x0)+f′(x0)(x−x0)+2!1f′′(x0)(x−x0)2+⋯+n!1f(n)(x0)(x−x0)n+Rn(x)称此公式为泰勒公式1。其中 R n ( x ) = O [ ( x − x 0 ) n ] R_{n}(x)=O\left [ (x-x_0)^{n} \right ] Rn(x)=O[(x−x0)n], O [ ( x − x 0 ) n ] O\left [ (x-x_0)^{n} \right ] O[(x−x0)n]称为佩亚诺余项, R n ( x ) R_{n}(x) Rn(x) 为用 n n n 次泰勒多项式近似表达 f ( x ) f(x) f(x) 所产生的误差,这一误差是当 x → x 0 x\rightarrow x_{0} x→x0 时比 ( x − x 0 ) n (x-x_0)^{n} (x−x0)n 高阶的无穷小。
【注意】佩亚诺余项不能具体估算出误差的大小,下面给出的具有另一种余项形式的泰勒公式公式解决了这一问题。
定理2 如果函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0 的某个邻域 U ( x 0 ) U(x_0) U(x0) 内具有 ( n + 1 ) (n+1) (n+1) 阶导数,那么对于任意点 x ϵ U ( x 0 ) x\,\epsilon \,U(x_0) xϵU(x0),有 f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + 1 2 ! f ′ ′ ( x 0 ) ( x − x 0 ) 2 + ⋯ + 1 n ! f ( n ) ( x 0 ) ( x − x 0 ) n + R n ( x ) f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{1}{2!}f''(x_0)(x-x_0)^2+\cdots +\frac{1}{n!}f^{(n)}(x_0)(x-x_0)^n+R_{n}(x) f(x)=f(x0)+f′(x0)(x−x0)+2!1f′′(x0)(x−x0)2+⋯+n!1f(n)(x0)(x−x0)n+Rn(x)称此公式为泰勒公式2。其中余项 R n ( x ) = f ( n + 1 ) ( ξ ) ( n + 1 ) ! ( x − x 0 ) n + 1 R_{n}(x)=\frac{f^{(n+1)}(\xi )}{(n+1)!} (x-x_0)^{n+1} Rn(x)=(n+1)!f(n+1)(ξ)(x−x0)n+1 ξ \xi ξ 是 x 0 x_0 x0 与 x x x 之间的某个数。该余项称为拉格朗日余项。
定理3 如果泰勒公式2中 x 0 = 0 x_0=0 x0=0, ξ \xi ξ 是 0 与 x x x 之间的某个值,因此可以令 ξ = θ x ( 0 < x < 1 ) \xi =\theta x(0
ξ=θx(0<x<1) ,泰勒公式2就可以简化为 f ( x ) = f ( 0 ) + f ′ ( 0 ) ( x ) + 1 2 ! f ′ ′ ( 0 ) ( x ) 2 + ⋯ + 1 n ! f ( n ) ( 0 ) ( x ) n + f ( n + 1 ) ( θ x ) ( n + 1 ) ! ( x ) n + 1 f(x)=f(0)+f'(0)(x)+\frac{1}{2!}f''(0)(x)^2+\cdots +\frac{1}{n!}f^{(n)}(0)(x)^n+\frac{f^{(n+1)}(\theta x )}{(n+1)!} (x)^{n+1} f(x)=f(0)+f′(0)(x)+2!1f′′(0)(x)2+⋯+n!1f(n)(0)(x)n+(n+1)!f(n+1)(θx)(x)n+1称此公式为麦克劳林公式。
可得近似公式: f ( x ) ≈ f ( 0 ) + f ′ ( 0 ) ( x ) + 1 2 ! f ′ ′ ( 0 ) ( x ) 2 + ⋯ + 1 n ! f ( n ) ( 0 ) ( x ) n f(x)\approx f(0)+f'(0)(x)+\frac{1}{2!}f''(0)(x)^2+\cdots +\frac{1}{n!}f^{(n)}(0)(x)^n f(x)≈f(0)+f′(0)(x)+2!1f′′(0)(x)2+⋯+n!1f(n)(0)(x)n
【提示】麦克劳林公式将泰勒公式中的点 x 0 x_0 x0 直接认定为原点0。从原点出发,一点一世界。
麦克劳林公式非常长,不太好理解。下面将详细分析麦克劳林公式的各项含义。一个复杂函数 f ( x ) f(x) f(x) 通过麦克劳林公式近似表达,多项式中包含以下 3 个模块。
(1)函数在原点的各阶导数。它们表示着多项式下一点变化的走向,参与的各阶导数越多,多项式变化的走向与 f ( x ) f(x) f(x) 越一致。例如,一阶导数帮多项式定位了下一个点是上升还是下降, 二阶导数表达了在点 x 0 x_0 x0 处的弯曲走向。
(2)麦克劳林公式中多项式的每一项 x x x 的幂次。
(3)麦克劳林公式中多项式的每一项中的阶乘 。
那么阶数与阶乘的含义是什么呢?下面继续深入探讨。
【例5】根据麦克劳林公式分别求出 f ( x ) = e x f(x)=e^x f(x)=ex 在原点的一阶、二阶、三阶、八阶多项式,并用图显示结果。
解: f ( 0 ) = e 0 = 1 f(0)=e^0 = 1 f(0)=e0=1,因为 ( e x ) ′ = e x (e^{x})^{'} =e^{x} (ex)′=ex,所以 f ′ ( 0 ) = f ′ ′ ( 0 ) = f ′ ′ ′ ( 0 ) = ⋯ = f ( 8 ) ( 0 ) = 1 f'(0)=f''(0)=f'''(0)=\cdots =f^{(8)}(0)=1 f′(0)=f′′(0)=f′′′(0)=⋯=f(8)(0)=1,得出:
为了显示变化效果,图10中的 x x x 坐标与 y y y 坐标的刻度不相等。
从图中可以看出阶数越高,多项式曲线越逼近 f ( x ) = e x f(x)=e^x f(x)=ex。
下面再通过观察多项式的函数图像变化,来讨论阶数与阶乘的作用。
首先来讨论多项式 x 9 + x 2 x^9+x^2 x9+x2 的函数变化。 如图 11 所示, x 2 x^2 x2 被 x 9 x^9 x9 完全压制, x 9 + x 2 x^9+x^2 x9+x2 几乎只有 x 9 x^9 x9 的特性,原因在于阶数越高函数增长越快。
其次再来观察 x 3 x^3 x3 与 x 2 x^2 x2 的函数图像变化,如图 12 所示,在 x = 2 x=2 x=2 处 x 3 x^3 x3 比 x 2 x^2 x2 增长快,但是在 x = 1 x = 1 x=1 的左侧,接近原点的区域,低阶对函数起到的作用反而更大。在麦克劳林公式的展开式中,给我们的感觉是,在原点附近,低阶项能更好地描述当前点附近的趋势,但离原点越远,走势就越来越依靠高阶,甚至高阶有可能完全压制低阶。那么如何控制麦克劳林公式中各项的作用呢?
如图13所示,加入阶乘后,再来看看函数图像的变化,有了 9! 和 2! 的帮助后,函数图像先呈现 x 2 x^2 x2 的曲线特性,随着 x x x 的增大再呈现 x 9 x^9 x9 的曲线特性。
通过上面的讨论,可以通俗地解释麦克劳林公式中各个模块的作用:导数表示下一点的走向,阶数表示曲线该怎样逼近,阶乘控制着各部分起着什么样的作用。
【例6】求函数 f ( x ) = e x f(x) = e^x f(x)=ex 的 n n n 阶麦克劳林展开式。
【例7】根据 e x e^x ex 的 n n n 次泰勒多项式展开式,用 Python 编程实现求无理数 e e e 的近似值。
【代码如下】
from numpy import *
def f(n):
sum1 = 1
m = 0
if n == 0:
sum1 = 1
else:
m = n+1 # 因为 range 函数是左闭右开,所以用 m 来控制循环次数
for i in range(1, m):
sum2 = 1.0
k = i+1 # 因为 range 函数是左闭右开,所以用 k 来控制循环次数
for j in range(1, k):
sum2 = sum2*j
sum1 = sum1+1.0/sum2
return sum1
print(f(0))
print(f(1))
print(f(2))
print(f(3))
print(f(10))
【输出结果】
1
2.0
2.5
2.6666666666666665
2.7182818011463845
【例8】求函数 f ( x ) = s i n x f(x)=sinx f(x)=sinx 的 n n n 阶麦克劳林展开式。
在求解最优化问题中,拉格朗日乘子法是常用的方法之一。
【例9】已知目标函数 f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2,在约束条件 x y = 3 xy=3 xy=3 下,求 f ( x , y ) f(x,y) f(x,y) 的最小值。
解:这是一个典型的约束优化问题,在学习拉格朗日乘子法之前,解这个问题最简单的方法就是通过约束条件将其中的一个变量用另外一个变量进行替换,再带入目标函数就可以求出极值。
将 y = 3 x y = \frac{3}{x} y=x3 带入 f ( x , y ) = x 2 + y 2 f(x,y)=x^2+y^2 f(x,y)=x2+y2,可得 f ( x ) = x 2 + 9 x 2 f(x)=x^2+\frac{9}{x^2} f(x)=x2+x29,然后求 f ( x ) f(x) f(x) 的最小值。
这就将约束优化问题转变成了无约束求极值。根据前文求极值方法可知,当 f ′ ( x ) = 0 f'(x) = 0 f′(x)=0 时,即为极值点。推导可得,在点 ( 3 , 3 ) (\sqrt{3},\, \sqrt{3}) (3,3) 和点 ( − 3 , − 3 ) (-\sqrt{3},\, -\sqrt{3}) (−3,−3) 处, f ( x , y ) f(x,y) f(x,y)的最小值为6。
再来讨论一个问题,已知目标函数为 V ( x , y , z ) = x y z V(x,y,z) =xyz V(x,y,z)=xyz,在约束条件 2 x y + 2 x z + 2 y z = S 2xy+2xz+2yz=S 2xy+2xz+2yz=S 下,求体积 V V V 的最大值( S S S 表示面积,为常量值)。 这个问题就不能用简单的替换来求解了。
对例 9 继续分析,例 9 的题目可以这样表述:求双曲线 x y = 3 xy=3 xy=3 离原点最近的点。 将 x 2 + y 2 = c x^2+y^2=c x2+y2=c 的曲线族画出来,如图 14 所示,当 曲线族中的圆与 x y = 3 xy=3 xy=3 曲线相切时,切点到原点的距离最短。也就是说, f ( x , y ) = c f(x,y)=c f(x,y)=c 的等高线和双曲线 g ( x , y ) g(x,y) g(x,y) 相切时,可以得到上述优化问题的一个极值。 那么,当 f ( x , y ) f(x,y) f(x,y) 和 g ( x , y ) g(x,y) g(x,y) 相切时, x x x, y y y 的值是多少呢?该如何求解呢?
在讨论梯度概念时,梯度与等高线的关系描述如下:函数 z = f ( x , y ) z=f(x, y) z=f(x,y) 在点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的梯度方向与过点 ( x 0 , y 0 ) (x_0,y_0) (x0,y0) 的等高线 f ( x , y ) = c f(x,y)=c f(x,y)=c 在这点的法线方向相同,且从数值较低的等高线指向数值较高等高线,而梯度的模等于函数在这个法线方向的方向导数。这个法线方向就是方向导数取得最大值的方向,如图15所示。
根据梯度与等高线的关系描述,上面问题中 f ( x , y ) f(x,y) f(x,y) 和 g ( x , y ) g(x,y) g(x,y) 相切时,它们的切线相同,即法向量是相互平行的,因此,可以得到 ▽ f ( x , y ) = − λ ⋅ ▽ g ( x , y ) \triangledown f(x,y)=-\lambda \cdot \triangledown g(x,y) ▽f(x,y)=−λ⋅▽g(x,y)。分别求偏导,并且加上约束条件 x y = 3 xy=3 xy=3,可以得到方程组:
{ ∂ f ∂ x = − λ ∂ g ∂ x ∂ f ∂ y = − λ ∂ g ∂ y x y = 3 \begin{cases} \frac{\partial f}{\partial x} = -\lambda \frac{\partial g}{\partial x} \\ \frac{\partial f}{\partial y} = -\lambda \frac{\partial g}{\partial y} \\ xy=3 \end{cases} ⎩⎪⎨⎪⎧∂x∂f=−λ∂x∂g∂y∂f=−λ∂y∂gxy=3
即:
{ 2 x = − λ y 2 y = − λ x x y = 3 \begin{cases} 2x=-\lambda y \\ 2y=-\lambda x \\ xy=3 \end{cases} ⎩⎪⎨⎪⎧2x=−λy2y=−λxxy=3
求解结果: x = 3 , y = 3 , λ = − 2 x = \sqrt{3},\: y = \sqrt{3}, \: \lambda =-2 x=3,y=3,λ=−2 或者 x = − 3 , y = − 3 , λ = − 2 x = -\sqrt{3},\: y =- \sqrt{3}, \: \lambda =-2 x=−3,y=−3,λ=−2
通过上述例子引入拉格朗日乘子法的基本原理,即通过引入拉格朗日乘子 ( λ ) (\lambda) (λ) 将原来的约束优化问题转化为无约束的方程组问题。
拉格朗日乘子法的求解过程大致分为如下步骤。
(1)原问题描述:求解函数 z = f ( x , y ) z=f(x,y) z=f(x,y) 在条件 φ ( x , y ) = 0 \varphi(x,y)=0 φ(x,y)=0 下极值。
(2)构造函数: F ( x , y , λ ) = f ( x , y ) + λ ⋅ φ ( x , y ) F(x,y,\lambda )=f(x,y)+\lambda \cdot \varphi (x,y) F(x,y,λ)=f(x,y)+λ⋅φ(x,y),其中, λ \lambda λ 为拉格朗日乘子。
(3)构造函数求偏导列出方程组。
{ ∂ F ∂ x = 0 ∂ F ∂ y = 0 ∂ F ∂ λ = 0 \begin{cases} \frac{\partial F}{\partial x}=0 \\ \frac{\partial F}{\partial y}=0 \\ \frac{\partial F}{\partial \lambda }=0 \end{cases} ⎩⎪⎨⎪⎧∂x∂F=0∂y∂F=0∂λ∂F=0 (4)求出 x x x、 y y y 和 λ \lambda λ 的值,带入即可得目标函数的极值。
自变量多于两个的情况下,拉格朗日乘子法的求解过程同上面步骤。
(1)原问题描述:求解函数 u = f ( x , y , z , t ) u=f(x,y,z,t) u=f(x,y,z,t) 在条件 φ ( x , y , z , t ) = 0 , ψ ( x , y , z , t ) = 0 \varphi(x,y,z,t)=0,\: \psi(x,y,z,t)=0 φ(x,y,z,t)=0,ψ(x,y,z,t)=0 下极值。
(2)构造函数: F ( x , y , z , t , λ 1 , λ 2 ) = f ( x , y , z , t ) + λ 1 ⋅ φ ( x , y , z , t ) + λ 2 ⋅ ψ ( x , y , z , t ) F(x,y,z,t,\lambda_1,\lambda_2 )=f(x,y,z,t)+\lambda_1 \cdot \varphi (x,y,z,t)+\lambda_2 \cdot \psi (x,y,z,t) F(x,y,z,t,λ1,λ2)=f(x,y,z,t)+λ1⋅φ(x,y,z,t)+λ2⋅ψ(x,y,z,t),其中, λ 1 \lambda_1 λ1、 λ 2 \lambda_2 λ2 为拉格朗日乘子。
(3)通过对构造函数求偏导为 0 列出方程组。
(4)求出方程组的解,带入即可得目标函数的极值。
【例10】已知目标函数为 V ( x , y , z ) = x y z V(x,y,z)=xyz V(x,y,z)=xyz,在约束条件 2 x y + 2 x z + 2 y z = 12 2xy+2xz+2yz=12 2xy+2xz+2yz=12 下,求体积 V V V 的最大值。
【例11】已知目标函数为 u = x 3 y 2 z u=x^3y^2z u=x3y2z,在约束条件 x + y + z = 12 x+y+z=12 x+y+z=12 下,求其最大值。
【例12】在第一象限内做椭球面 x 2 a 2 + y 2 b 2 + z 2 c 2 = 1 \frac{x^2}{a^2}+\frac{y^2}{b^2}+\frac{z^2}{c^2}=1 a2x2+b2y2+c2z2=1 的切平面,使切平面与 3 个坐标面所围成的四面体体积最小,求切点坐标。
解:从题目很难看出目标函数是什么,因此首先要找出目标函数。
设 p ( x 0 , y 0 , z 0 ) p(x_0,y_0,z_0) p(x0,y0,z0) 为椭球面上的一 点,令 F ( x , y , x ) = x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 F(x,y,x)=\frac{x^2}{a^2}+\frac{y^2}{b^2}+\frac{z^2}{c^2}-1 F(x,y,x)=a2x2+b2y2+c2z2−1则:
F x ′ ∣ ( x 0 , y 0 , z 0 ) = 2 x 0 a 2 , F y ′ ∣ ( x 0 , y 0 , z 0 ) = 2 y 0 b 2 , F z ′ ∣ ( x 0 , y 0 , z 0 ) = 2 z 0 c 2 \left.\begin{matrix} F_{x}^{'} \end{matrix}\right|_{(x_0,y_0,z_0)}=\frac{2x_0}{a^2}, \, \left.\begin{matrix} F_{y}^{'} \end{matrix}\right|_{(x_0,y_0,z_0)}=\frac{2y_0}{b^2},\,\left.\begin{matrix} F_{z}^{'} \end{matrix}\right|_{(x_0,y_0,z_0)}=\frac{2z_0}{c^2} Fx′∣∣(x0,y0,z0)=a22x0,Fy′∣∣(x0,y0,z0)=b22y0,Fz′∣∣(x0,y0,z0)=c22z0 过 p ( x 0 , y 0 , z 0 ) p(x_0,y_0,z_0) p(x0,y0,z0) 的切平面方程: x 0 a 2 ( x − x 0 ) + y 0 b 2 ( y − y 0 ) + z 0 c 2 ( z − z 0 ) = 0 \frac{x_0}{a^2}(x-x_0)+\frac{y_0}{b^2}(y-y_0)+\frac{z_0}{c^2}(z-z_0)=0 a2x0(x−x0)+b2y0(y−y0)+c2z0(z−z0)=0 化简可得: x ⋅ x 0 a 2 + y ⋅ y 0 b 2 + z ⋅ z 0 c 2 = 1 \frac{x\cdot x_0}{a^2}+\frac{y\cdot y_0}{b^2}+\frac{z\cdot z_0}{c^2}=1 a2x⋅x0+b2y⋅y0+c2z⋅z0=1 该切平面在 3 个坐标轴上的截距分别为: x = a 2 x 0 , y = b 2 y 0 , z = c 2 z 0 x = \frac{a^2}{x_0},\: y = \frac{b^2}{y_0},\: z = \frac{c^2}{z_0} x=x0a2,y=y0b2,z=z0c2 因此得到目标函数为所求四面体的体积: V = 1 6 x y z = a 2 b 2 c 2 6 x 0 y 0 z 0 V=\frac{1}{6}xyz=\frac{a^2b^2c^2}{6x_0y_0z_0} V=61xyz=6x0y0z0a2b2c2 从题目可知,要求的切点 p ( x 0 , y 0 , z 0 ) p(x_0,y_0,z_0) p(x0,y0,z0) 是未知量,且满足约束条件: x 0 2 a 2 + y 0 2 b 2 + z 0 2 c 2 = 1 \frac{x_0^2}{a^2}+\frac{y_0^2}{b^2}+\frac{z_0^2}{c^2}=1 a2x02+b2y02+c2z02=1 下面采用拉格朗日乘子法进行求解,求出 x 0 x_0 x0、 y 0 y_0 y0 、 z 0 z_0 z0 的值。
【例13】编程模拟实现 sinx 的 n n n 阶泰勒多项式并验证结果。假设 m = 20 m=20 m=20, n = 39 n=39 n=39, m m m 和 n n n 的含义参考例8。
为了区别 Python 中系统函数 sinx 的名字,自定义的函数命名为 fsin(x)。
【代码如下】
from numpy import *
# 自定义函数 fsin(x)
def fsin(x):
m = 20
sum = 0.0
for i in range(1, m+1):
n = 2*i-1
temp1, temp2, temp3 = 1, 1, 1
for j in range(1, i):
temp1 = -temp1
for j in range(1, n+1):
temp2 = temp2*x
temp3 = temp3*j
sum = sum+temp1*temp2/temp3
return sum
# 调用 numpy 库中 sin 函数和自定义的 fsin(),验证结果
for x in range (-20,20):
print(sin(x))
print(fsin(x))
【运行结果】
运行结果对比见表1所示, 由于 sinx 关于原点对称,所以表 1 只显示了 x x x 取值范围为[-20,1] 的结果。
【结果分析】
从结果可以看出, x x x 在区间[-11,11]内取值, 39 阶泰勒展开式与 sinx 值在精确度内一致;而当 x x x 在区间 [-20, -12] 、[12,20] 内取值时,误差随着偏移原点距离的增大而快速增大。当 x x x 取值 -20 时,sin(-20) 为 0.912945,39 阶泰勒展开式结果为 5364.41,误差非常大,当 n n n 为 199 阶时, x x x 在区间[-20,20] 内取值时,两个函数结果在精确度范围内完全一致。可以设想,将阶数 n n n 取无穷大时,两个函数结果将完全拟合,实现了一点一世界。
【注意】本文中对泰勒公式强调的 “一点一世界” 是有条件的,那就是它的定义域必须是全体实数,且处处可导。