系列文章:
- 第一篇:算法工程师必知必会的数学基础之线性代数
- 第二篇:算法工程师必知必会的数学基础之微积分上(本文)。
文章目录
- 2. 微积分
- 2.1 极限(Limits)和 连续性(Continuity)
- 2.1.1 极限
- 极限的基本定义
- 极限的直观理解
- 极限的存在条件
- 极限的基本性质
- 极限的计算方法
- 极限的应用
- 极限的例子
- Python代码示例及解释
- 2.1.2 连续性
- 连续性的定义
- 连续性的直观理解
- 连续性的类型
- 连续性的性质
- 连续的例子
- 不连续的例子
- 连续性的应用
- Python代码示例
- 2.2 导数(Derivatives)和 偏导数(Partial derivatives)
- 2.2.1 导数的基本概念
- 2.2.2 常见函数的导数
- 2.2.3 导数的应用
- 1. 求极值
- 2. 求凹凸性
- 3. 泰勒展开
- 2.2.4 偏导数
- 偏导数的定义
- 偏导数的直观理解
- 偏导数的计算
- 例子
- 偏导数的应用
- Python示例代码
- 2.3 梯度(Gradient)
- 2.3.1 梯度的含义与Python求解
- 2.3.2 常见函数梯度公式
- 一、多元线性函数
- 二、多项式函数
- 三、指数函数
- 四、对数函数
- 五、三角函数
- 六、复合函数
- 2.4 雅可比矩阵(Jacobian matrix)和 黑塞矩阵(Hessian matrix)
- 2.4.1 雅可比矩阵
- 2.4.2 黑塞矩阵
- 2.4.3 Python 示例
- 2.4.4 应用举例
- 雅可比矩阵的应用
- 黑塞矩阵的应用
- 应用举例:牛顿法
- 2.5 积分(Integration)
- 2.5.1 不定积分与定积分
- 2.5.2 基本积分公式及代码
- 2.5.3 积分的应用
- 以数学领域为例
- 2.6 拉格朗日乘子(Lagrange multipliers)
- 2.6.1 概念
- 2.6.2 例子
- 代码示例
- 代码解析
- 2.6.3 扩展到多个变量和多个约束
- 示例代码
- 代码解析
- 输出分析
- 分析实数解
2. 微积分
微积分是机器学习和深度学习中另一个重要的数学基础,它涉及函数的变化率、极限、导数和积分等方面。下面我将详细介绍微积分中的一些基本概念,并使用 Python 的 SymPy 库来演示这些概念的应用。
2.1 极限(Limits)和 连续性(Continuity)
极限是函数在某个点处的行为,它描述了函数值随着输入接近某个特定值时的趋势。连续性是指函数在某一点处是否有定义且函数值与其极限值相同。
2.1.1 极限
极限是微积分中的一个核心概念,它描述了函数值随着自变量接近某一特定值时的趋势。极限的概念是理解和应用微积分的基础,因为它不仅涉及函数在某一点附近的性质,而且还是定义导数和积分的关键。
极限的基本定义
对于函数
f
(
x
)
f(x)
f(x),如果当
x
x
x 接近
a
a
a 时,
f
(
x
)
f(x)
f(x) 接近一个确定的数
L
L
L,则称
L
L
L 为
f
(
x
)
f(x)
f(x) 当
x
→
a
x \to a
x→a 时的极限,记作:
lim
x
→
a
f
(
x
)
=
L
\lim_{x \to a} f(x) = L
x→alimf(x)=L
这意味着无论 x x x 如何接近 a a a(但 x x x 不等于 a a a), f ( x ) f(x) f(x) 都会无限接近 L L L。
极限的直观理解
- 逼近: 极限描述了函数值在某点附近的趋势。
- 无限接近: 极限关注的是函数值随着自变量越来越接近某一点时的表现,而不是函数在该点的实际值。
极限的存在条件
- 左极限: lim x → a − f ( x ) = L \lim_{x \to a^-} f(x) = L limx→a−f(x)=L(当 x x x 从左侧接近 a a a 时)。
- 右极限: lim x → a + f ( x ) = L \lim_{x \to a^+} f(x) = L limx→a+f(x)=L(当 x x x 从右侧接近 a a a 时)。
- 函数值: f ( a ) f(a) f(a)(如果 a a a 在定义域内)。
如果左极限、右极限以及函数在 a a a 处的值都存在并且相等,则 lim x → a f ( x ) = L \lim_{x \to a} f(x) = L limx→af(x)=L 存在。
极限的基本性质
- 唯一性: 如果极限存在,则它是唯一的。
- 线性性: 对于任意常数
c
c
c 和
d
d
d,
lim x → a ( c f ( x ) + d g ( x ) ) = c lim x → a f ( x ) + d lim x → a g ( x ) \lim_{x \to a} (cf(x) + dg(x)) = c\lim_{x \to a} f(x) + d\lim_{x \to a} g(x) x→alim(cf(x)+dg(x))=cx→alimf(x)+dx→alimg(x) - 乘法性: 如果
lim
x
→
a
f
(
x
)
\lim_{x \to a} f(x)
limx→af(x) 和
lim
x
→
a
g
(
x
)
\lim_{x \to a} g(x)
limx→ag(x) 都存在,则
lim x → a ( f ( x ) g ( x ) ) = ( lim x → a f ( x ) ) ( lim x → a g ( x ) ) \lim_{x \to a} (f(x)g(x)) = \left(\lim_{x \to a} f(x)\right) \left(\lim_{x \to a} g(x)\right) x→alim(f(x)g(x))=(x→alimf(x))(x→alimg(x)) - 商的极限: 如果
lim
x
→
a
f
(
x
)
\lim_{x \to a} f(x)
limx→af(x) 和
lim
x
→
a
g
(
x
)
\lim_{x \to a} g(x)
limx→ag(x) 都存在且
lim
x
→
a
g
(
x
)
≠
0
\lim_{x \to a} g(x) \neq 0
limx→ag(x)=0,则
lim x → a f ( x ) g ( x ) = lim x → a f ( x ) lim x → a g ( x ) \lim_{x \to a} \frac{f(x)}{g(x)} = \frac{\lim_{x \to a} f(x)}{\lim_{x \to a} g(x)} x→alimg(x)f(x)=limx→ag(x)limx→af(x) - 复合函数的极限: 如果
lim
x
→
a
g
(
x
)
=
b
\lim_{x \to a} g(x) = b
limx→ag(x)=b 且
lim
y
→
b
f
(
y
)
=
L
\lim_{y \to b} f(y) = L
limy→bf(y)=L,则
lim x → a f ( g ( x ) ) = L \lim_{x \to a} f(g(x)) = L x→alimf(g(x))=L
极限的计算方法
- 直接代入: 如果 f ( x ) f(x) f(x) 在 a a a 处连续,则可以直接代入 a a a 来计算极限。
- 因式分解: 对于多项式函数,可以通过因式分解来简化函数表达式。
- 洛必达法则: 如果极限形式为 0 0 \frac{0}{0} 00 或 ∞ ∞ \frac{\infty}{\infty} ∞∞,可以使用洛必达法则来求极限。
- 夹逼定理: 如果存在两个函数 f ( x ) f(x) f(x) 和 g ( x ) g(x) g(x) 使得 f ( x ) ≤ h ( x ) ≤ g ( x ) f(x) \leq h(x) \leq g(x) f(x)≤h(x)≤g(x) 且 lim x → a f ( x ) = lim x → a g ( x ) = L \lim_{x \to a} f(x) = \lim_{x \to a} g(x) = L limx→af(x)=limx→ag(x)=L,则 lim x → a h ( x ) = L \lim_{x \to a} h(x) = L limx→ah(x)=L。
极限的应用
- 导数: 导数是函数在某一点的瞬时变化率,可以通过极限来定义。
- 积分: 定积分是函数在某区间内的面积,也可以通过极限来定义。
- 物理模型: 在物理学中,极限的概念被用来描述物理量的变化率,如速度、加速度等。
极限的例子
- 多项式函数: 对于多项式函数 p ( x ) p(x) p(x), lim x → a p ( x ) = p ( a ) \lim_{x \to a} p(x) = p(a) limx→ap(x)=p(a)。
- 有理函数: 对于有理函数 p ( x ) q ( x ) \frac{p(x)}{q(x)} q(x)p(x),如果 q ( a ) ≠ 0 q(a) \neq 0 q(a)=0,则 lim x → a p ( x ) q ( x ) = p ( a ) q ( a ) \lim_{x \to a} \frac{p(x)}{q(x)} = \frac{p(a)}{q(a)} limx→aq(x)p(x)=q(a)p(a)。
- 三角函数: 对于三角函数 sin ( x ) \sin(x) sin(x), lim x → 0 sin ( x ) x = 1 \lim_{x \to 0} \frac{\sin(x)}{x} = 1 limx→0xsin(x)=1。
Python代码示例及解释
示例:这段代码使用了 SymPy 库来计算极限。
from sympy import symbols, limit, oo
# 定义符号变量
x = symbols('x')
# 极限
lim = limit((x**2 - 4)/(x - 2), x, 2)
print("Limit:", lim) # 输出: Limit: 4
让我们逐步解释这段代码:
lim = limit((x**2 - 4)/(x - 2), x, 2)
limit
函数接受三个参数:- 第一个参数是表达式
(x**2 - 4)/(x - 2)
,这是一个关于x
的函数。 - 第二个参数是符号变量
x
,它指出了我们希望计算极限时所关注的变量。 - 第三个参数
2
表示我们希望计算当x
接近 2 时的极限值。
- 第一个参数是表达式
极限的数学解释
给定的表达式为 x 2 − 4 x − 2 \frac{x^2 - 4}{x - 2} x−2x2−4。我们可以尝试对这个表达式进行简化:
x 2 − 4 x − 2 = ( x − 2 ) ( x + 2 ) x − 2 \frac{x^2 - 4}{x - 2} = \frac{(x - 2)(x + 2)}{x - 2} x−2x2−4=x−2(x−2)(x+2)
当 x ≠ 2 x \neq 2 x=2 时,分子和分母中的 ( x − 2 ) (x - 2) (x−2) 可以相互约去,因此原始表达式可以简化为 x + 2 x + 2 x+2。
接下来,我们计算当 x x x 接近 2 时的极限:
lim x → 2 ( x + 2 ) = 2 + 2 = 4 \lim_{x \to 2} (x + 2) = 2 + 2 = 4 x→2lim(x+2)=2+2=4
这就是为什么 lim
的结果是 4。
2.1.2 连续性
连续性是微积分中的一个重要概念,它描述了函数在其定义域内的行为。一个函数在某一点连续意味着函数在该点处的值与其邻近点的值变化平滑且没有突然的跳跃或间断。下面是关于连续性的定义和一些关键点:
连续性的定义
对于实函数 f ( x ) f(x) f(x),如果满足以下条件,则称 f ( x ) f(x) f(x) 在点 c c c 处连续:
- f ( c ) f(c) f(c) 存在;
- lim x → c f ( x ) \lim_{x \to c} f(x) limx→cf(x) 存在;
- lim x → c f ( x ) = f ( c ) \lim_{x \to c} f(x) = f(c) limx→cf(x)=f(c)。
也就是说,函数在点 c c c 处的极限值等于函数在该点的函数值。
连续性的直观理解
- 无间断: 函数在某点连续意味着图像在该点没有“缺口”或“跳跃”。
- 平滑过渡: 函数值随自变量的变化平滑过渡,没有突然的变化。
连续性的类型
- 左连续: 如果 lim x → c − f ( x ) = f ( c ) \lim_{x \to c^-} f(x) = f(c) limx→c−f(x)=f(c),则 f f f 在 c c c 处左连续。
- 右连续: 如果 lim x → c + f ( x ) = f ( c ) \lim_{x \to c^+} f(x) = f(c) limx→c+f(x)=f(c),则 f f f 在 c c c 处右连续。
- 连续: 如果 f f f 既左连续又右连续,则 f f f 在 c c c 处连续。
连续性的性质
- 局部保序: 如果函数 f f f 在区间 I I I 上连续,且 a < b a < b a<b 且 a , b ∈ I a, b \in I a,b∈I,那么 f ( a ) ≤ f ( b ) f(a) \leq f(b) f(a)≤f(b) 或 f ( a ) ≥ f ( b ) f(a) \geq f(b) f(a)≥f(b)。
- 介值定理: 如果 f f f 在闭区间 ([a, b]) 上连续,且 f ( a ) ≠ f ( b ) f(a) \neq f(b) f(a)=f(b),则对于任意 c c c 位于 f ( a ) f(a) f(a) 和 f ( b ) f(b) f(b) 之间,存在 d ∈ ( a , b ) d \in (a, b) d∈(a,b) 使得 f ( d ) = c f(d) = c f(d)=c。
- 最值定理: 如果 f f f 在闭区间 ([a, b]) 上连续,则 f f f 在 ([a, b]) 上取得最大值和最小值。
连续的例子
- 多项式函数: 所有多项式函数在整个实数范围内都是连续的。
- 有理函数: 有理函数在定义域内(除了分母为零的点)是连续的。
- 三角函数: 正弦函数 sin ( x ) \sin(x) sin(x) 和余弦函数 cos ( x ) \cos(x) cos(x) 在整个实数范围内是连续的。
不连续的例子
- 跳跃间断: 函数在某点的左右极限存在但不相等。
- 可去间断: 函数在某点的左右极限相等但不等于该点的函数值。
- 无穷间断: 函数在某点的左右极限至少有一个是无穷大。
- 振荡间断: 函数在某点附近振荡,不存在极限。
连续性的应用
- 积分: 连续函数可以在其定义域上积分。
- 微分: 若函数在某区间内连续,则可以应用微分的性质。
- 物理模型: 在物理学中,连续性常用于描述物理量的变化,如温度、压力等。
Python代码示例
import sympy as sp
x = sp.symbols('x') # 定义符号
f = x**2 - 4
# 连续性检查
def is_continuous(f, a):
try:
left_limit = limit(f, x, a, '-')
right_limit = limit(f, x, a, '+')
value_at_a = f.subs(x, a)
if left_limit == right_limit == value_at_a:
return True
else:
return False
except:
return False
a = 2
continuous = is_continuous(f, a)
print("Continuous at x =", a, ":", continuous) # 输出: Continuous at x = 2 : True
代码解释:
- 导入 SymPy:
import sympy as sp
导入 SymPy 库。 - 定义符号:
x = sp.symbols('x')
定义符号变量x
。 - 定义函数:
f = x**2 - 4
定义函数 f ( x ) = x 2 − 4 f(x) = x^2 - 4 f(x)=x2−4。 - 定义检查连续性的函数:
is_continuous
函数接受函数f
和点a
作为参数。- 使用
sp.limit
函数来计算左极限和右极限。 - 使用
f.subs(x, a)
来获取函数在点a
处的值。 - 检查左极限、右极限和函数值是否相等。
- 调用函数:
continuous = is_continuous(f, a)
调用is_continuous
函数来检查函数在 x = 2 x = 2 x=2 处的连续性。 - 输出结果:
print("Continuous at x =", a, ":", continuous)
输出检查结果。
运行这段代码时,将会输出 Continuous at x = 2 : True
,这是因为多项式函数在整个实数范围内都是连续的,因此
f
(
x
)
=
x
2
−
4
f(x) = x^2 - 4
f(x)=x2−4 在
x
=
2
x = 2
x=2 处也是连续的。
如果需要针对不同的函数或不同的点检查连续性,只需修改 f
和 a
的值即可。
2.2 导数(Derivatives)和 偏导数(Partial derivatives)
导数是微积分中的一个核心概念,用于描述函数在某一点的变化率。
2.2.1 导数的基本概念
导数是函数在某一点处的瞬时变化率。如果有一个函数 f ( x ) f(x) f(x),那么 f ( x ) f(x) f(x) 在点 x = a x = a x=a 处的导数记作 f ′ ( a ) f'(a) f′(a) 或 d f d x ( a ) \frac{df}{dx}(a) dxdf(a),它表示函数在该点附近的变化率。
导数的定义
对于函数 f ( x ) f(x) f(x),如果存在极限
f ′ ( a ) = lim h → 0 f ( a + h ) − f ( a ) h f'(a) = \lim_{h \to 0} \frac{f(a+h) - f(a)}{h} f′(a)=h→0limhf(a+h)−f(a)
则称 f ′ ( a ) f'(a) f′(a) 为函数 f ( x ) f(x) f(x) 在点 x = a x = a x=a 处的导数。
导数的几何意义
在几何上,导数 f ′ ( a ) f'(a) f′(a) 表示函数 f ( x ) f(x) f(x) 在点 x = a x = a x=a 处切线的斜率。如果 f ( x ) f(x) f(x) 在点 a a a 处可导,那么这条切线唯一确定。
导数的物理意义
在物理学中,导数经常用来描述变化率。例如,如果 s ( t ) s(t) s(t) 表示物体的位置随时间 t t t 的变化,那么 s ′ ( t ) s'(t) s′(t) 表示物体在时刻 t t t 的瞬时速度。
2.2.2 常见函数的导数
-
幂函数:
- 如果 f ( x ) = x n f(x) = x^n f(x)=xn,则 f ′ ( x ) = n x n − 1 f'(x) = nx^{n-1} f′(x)=nxn−1。
-
指数函数:
- 如果 f ( x ) = e x f(x) = e^x f(x)=ex,则 f ′ ( x ) = e x f'(x) = e^x f′(x)=ex。
- 如果 f ( x ) = a x f(x) = a^x f(x)=ax,则 f ′ ( x ) = a x ln ( a ) f'(x) = a^x \ln(a) f′(x)=axln(a)。
-
对数函数:
- 如果 f ( x ) = ln ( x ) f(x) = \ln(x) f(x)=ln(x),则 f ′ ( x ) = 1 x f'(x) = \frac{1}{x} f′(x)=x1。
- 如果 f ( x ) = log a ( x ) f(x) = \log_a(x) f(x)=loga(x),则 f ′ ( x ) = 1 x ln ( a ) f'(x) = \frac{1}{x \ln(a)} f′(x)=xln(a)1。
-
三角函数:
- 如果 f ( x ) = sin ( x ) f(x) = \sin(x) f(x)=sin(x),则 f ′ ( x ) = cos ( x ) f'(x) = \cos(x) f′(x)=cos(x)。
- 如果 f ( x ) = cos ( x ) f(x) = \cos(x) f(x)=cos(x),则 f ′ ( x ) = − sin ( x ) f'(x) = -\sin(x) f′(x)=−sin(x)。
- 如果 f ( x ) = tan ( x ) f(x) = \tan(x) f(x)=tan(x),则 f ′ ( x ) = sec 2 ( x ) f'(x) = \sec^2(x) f′(x)=sec2(x)。
-
复合函数的导数:
- 如果 y = f ( g ( x ) ) y = f(g(x)) y=f(g(x)),则 y ′ y' y′ 可以通过链式法则计算: y ′ = f ′ ( g ( x ) ) ⋅ g ′ ( x ) y' = f'(g(x)) \cdot g'(x) y′=f′(g(x))⋅g′(x)。
2.2.3 导数的应用
- 求极值:导数为 0 的点可能是函数的局部最大值点或最小值点。
- 求凹凸性:二阶导数可以用来判断函数的凹凸性。
- 泰勒展开:导数可以用来构造函数的泰勒展开式,从而近似函数的值。
导数的应用非常广泛,在数学和工程学中有许多重要的用途。下面是上述提到的三个应用的详细介绍:
1. 求极值
极值指的是函数在其定义域内的最大值或最小值。在某一点处的导数为 0 的点可能是函数的局部极大值点、局部极小值点或拐点。为了找到这些点,我们需要做以下几步:
- 求导数:找到函数的一阶导数。
- 求导数为 0 的点:解方程 f ′ ( x ) = 0 f'(x) = 0 f′(x)=0 来找到可能的极值点。
- 确定极值类型:使用二阶导数测试或邻域比较法来确定这些点是极大值点、极小值点还是拐点。
Python 示例(极值点位置已修正,已验证结果正确)
from sympy import symbols, diff, solve
# 定义符号变量
x = symbols('x')
# 定义函数
f = x**3 - 4*x**2 + 3*x - 7
# 计算一阶导数
df_dx = diff(f, x)
# 解方程 f'(x) = 0
critical_points = solve(df_dx, x)
print("Critical Points:", critical_points) # 输出: Critical Points: [4/3 - sqrt(7)/3, sqrt(7)/3 + 4/3]
# 计算二阶导数
d2f_dx2 = diff(df_dx, x)
# 确定极值类型
for point in critical_points:
second_derivative = d2f_dx2.subs(x, point)
if second_derivative > 0:
print(f"x = {point}: Local Minimum")
elif second_derivative < 0:
print(f"x = {point}: Local Maximum")
else:
print(f"x = {point}: Not a Local Extremum")
# 输出:
# x = 4/3 - sqrt(7)/3: Local Maximum
# x = sqrt(7)/3 + 4/3: Local Minimum
2. 求凹凸性
函数的凹凸性描述了函数图像的弯曲方向。如果函数在某区间内二阶导数大于 0,则函数在该区间内是凹的(concave up);如果小于 0,则函数是凸的(concave down)。
# 使用上面的代码继续
# 已经计算了二阶导数 d2f_dx2
# 检查凹凸性
for point in critical_points:
second_derivative = d2f_dx2.subs(x, point)
if second_derivative > 0:
print(f"x = {point}: Concave Up")
elif second_derivative < 0:
print(f"x = {point}: Concave Down")
else:
print(f"x = {point}: Inflection Point")
# 输出:
# x = 4/3 - sqrt(7)/3: Concave Down
# x = sqrt(7)/3 + 4/3: Concave Up
3. 泰勒展开
泰勒展开是一种利用导数来近似函数的方法。泰勒公式可以表示为:
f
(
x
)
=
f
(
a
)
+
f
′
(
a
)
(
x
−
a
)
+
f
′
′
(
a
)
2
!
(
x
−
a
)
2
+
f
′
′
′
(
a
)
3
!
(
x
−
a
)
3
+
⋯
f(x) = f(a) + f'(a)(x-a) + \frac{f''(a)}{2!}(x-a)^2 + \frac{f'''(a)}{3!}(x-a)^3 + \cdots
f(x)=f(a)+f′(a)(x−a)+2!f′′(a)(x−a)2+3!f′′′(a)(x−a)3+⋯
其中 f ′ ( a ) f'(a) f′(a), f ′ ′ ( a ) f''(a) f′′(a), f ′ ′ ′ ( a ) f'''(a) f′′′(a) 等是函数在点 a a a 处的各阶导数。
from sympy import factorial
# 定义泰勒展开的阶数
n = 4
# 定义泰勒展开的中心点
a = 0
# 泰勒展开
taylor_expansion = sum([diff(f, x, i).subs(x, a) / factorial(i) * (x - a)**i for i in range(n+1)])
print("Taylor Expansion:", taylor_expansion)
# 输出:
# Taylor Expansion: -7 + 3*x - 4*x**2 + x**3
以上就是导数在求极值、判断凹凸性和进行泰勒展开方面的应用。这些应用在数学分析和工程问题中非常常见,也是理解函数行为的关键工具。
2.2.4 偏导数
偏导数是多元微积分中的一个基本概念,它描述了多元函数关于其中一个变量的变化率,同时保持其他变量不变。偏导数在许多领域都有重要的应用,尤其是在工程学、物理学、经济学等领域中,用来分析和建模涉及多个变量的情况。
偏导数的定义
对于一个多变量函数
f
(
x
1
,
x
2
,
…
,
x
n
)
f(x_1, x_2, \ldots, x_n)
f(x1,x2,…,xn),函数关于变量
x
i
x_i
xi 的偏导数表示为:
∂
f
∂
x
i
\frac{\partial f}{\partial x_i}
∂xi∂f
它表示在其他变量保持不变的情况下,函数
f
f
f 关于
x
i
x_i
xi 的变化率。
偏导数的直观理解
- 方向导数: 偏导数可以看作是函数在特定方向上的变化率。
- 切平面: 对于三维空间中的函数 z = f ( x , y ) z = f(x, y) z=f(x,y),偏导数提供了函数在某一点的切平面的斜率。
偏导数的计算
- 直接计算: 将其他变量视为常数,对目标变量求导。
- 链式法则: 当涉及复合函数时,可以使用链式法则来计算偏导数。
例子
假设我们有一个函数 f ( x , y ) = x 2 + x y + y 2 f(x, y) = x^2 + xy + y^2 f(x,y)=x2+xy+y2。
- 计算关于
x
x
x 的偏导数:
∂ f ∂ x = 2 x + y \frac{\partial f}{\partial x} = 2x + y ∂x∂f=2x+y - 计算关于
y
y
y 的偏导数:
∂ f ∂ y = x + 2 y \frac{\partial f}{\partial y} = x + 2y ∂y∂f=x+2y
偏导数的应用
- 梯度: 梯度向量包含所有偏导数组成的向量,它指向函数增加最快的方向。
- 优化问题: 在多元函数中寻找极值点时,偏导数为零的点可能是极小值点或极大值点。
- 物理学: 在描述物理现象时,偏导数用于描述随时间和空间变化的量,如热传导方程、波动方程等。
Python示例代码
下面是一个使用 Python 和 SymPy 库来计算偏导数的示例代码:
import sympy as sp
# 定义符号变量
x, y = sp.symbols('x y')
# 定义函数
f = x**2 + x*y + y**2
# 计算偏导数
df_dx = sp.diff(f, x)
df_dy = sp.diff(f, y)
# 输出偏导数
print("∂f/∂x =", df_dx)
print("∂f/∂y =", df_dy)
运行上面的代码时,输出将是:
∂f/∂x = 2*x + y
∂f/∂y = x + 2*y
这表明函数 f ( x , y ) = x 2 + x y + y 2 f(x, y) = x^2 + xy + y^2 f(x,y)=x2+xy+y2 关于 x x x 的偏导数为 2 x + y 2x + y 2x+y,关于 y y y 的偏导数为 x + 2 y x + 2y x+2y。
2.3 梯度(Gradient)
2.3.1 梯度的含义与Python求解
在数学分析中,梯度是一个非常重要的概念,特别是在多元微积分中。梯度通常应用于实值函数 f ( x 1 , x 2 , … , x n ) f(x_1, x_2, \ldots, x_n) f(x1,x2,…,xn),其中 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1,x2,…,xn 是 n n n 个变量。梯度向量由该函数在某一点上关于各个变量的偏导数组成,并且它指示了函数在该点处增长最快的方向。
对于一个二元函数
f
(
x
,
y
)
f(x,y)
f(x,y),其梯度可以表示为:
∇
f
(
x
,
y
)
=
(
∂
f
∂
x
,
∂
f
∂
y
)
\nabla f(x,y) = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right)
∇f(x,y)=(∂x∂f,∂y∂f)
对于一个
n
n
n-元函数
f
(
x
1
,
x
2
,
…
,
x
n
)
f(x_1, x_2, \ldots, x_n)
f(x1,x2,…,xn),其梯度可以表示为:
∇
f
(
x
1
,
x
2
,
…
,
x
n
)
=
(
∂
f
∂
x
1
,
∂
f
∂
x
2
,
…
,
∂
f
∂
x
n
)
\nabla f(x_1, x_2, \ldots, x_n) = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n}\right)
∇f(x1,x2,…,xn)=(∂x1∂f,∂x2∂f,…,∂xn∂f)
梯度的几何意义是,如果我们在函数的图象上某一点沿着梯度的方向移动一小段距离,则函数值会增加最多。此外,梯度的方向与等值线(或等值面)垂直。这意味着如果你站在地面上一个函数值表示海拔高度的位置,那么梯度的方向就是你必须走的方向才能最快地上升到更高的地方。
在实际应用中,梯度经常用于优化问题,比如在梯度下降算法中用来找到函数的最小值。
示例:
from sympy import Matrix
# 定义梯度函数
def gradient(f, variables):
return Matrix([diff(f, var) for var in variables])
# 梯度
z = symbols('z') # x/y类似,上文中给出了
h = x**2 + y**2 + z**2
grad_h = gradient(h, [x, y, z])
print("Gradient:", grad_h) # 输出: Gradient: Matrix([
# [2*x],
# [2*y],
# [2*z]])
2.3.2 常见函数梯度公式
下面是几个常见函数的梯度公式:
一、多元线性函数
对于一个多元线性函数
f
(
x
1
,
x
2
,
…
,
x
n
)
=
a
1
x
1
+
a
2
x
2
+
…
+
a
n
x
n
+
b
f(x_1, x_2, \ldots, x_n) = a_1 x_1 + a_2 x_2 + \ldots + a_n x_n + b
f(x1,x2,…,xn)=a1x1+a2x2+…+anxn+b,其梯度为:
∇
f
=
(
∂
f
∂
x
1
,
∂
f
∂
x
2
,
…
,
∂
f
∂
x
n
)
=
(
a
1
,
a
2
,
…
,
a
n
)
\nabla f = \left(\frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, \ldots, \frac{\partial f}{\partial x_n}\right) = (a_1, a_2, \ldots, a_n)
∇f=(∂x1∂f,∂x2∂f,…,∂xn∂f)=(a1,a2,…,an)
二、多项式函数
对于一个二元多项式函数
f
(
x
,
y
)
=
a
x
2
+
b
y
2
+
c
x
y
+
d
x
+
e
y
+
f
f(x, y) = ax^2 + by^2 + cxy + dx + ey + f
f(x,y)=ax2+by2+cxy+dx+ey+f,其梯度为:
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
=
(
2
a
x
+
c
y
+
d
,
2
b
y
+
c
x
+
e
)
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right) = (2ax + cy + d, 2by + cx + e)
∇f=(∂x∂f,∂y∂f)=(2ax+cy+d,2by+cx+e)
三、指数函数
对于一个二元指数函数
f
(
x
,
y
)
=
e
a
x
+
b
y
f(x, y) = e^{ax + by}
f(x,y)=eax+by,其梯度为:
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
=
(
a
e
a
x
+
b
y
,
b
e
a
x
+
b
y
)
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right) = (ae^{ax + by}, be^{ax + by})
∇f=(∂x∂f,∂y∂f)=(aeax+by,beax+by)
四、对数函数
对于一个二元对数函数
f
(
x
,
y
)
=
ln
(
x
2
+
y
2
)
f(x, y) = \ln(x^2 + y^2)
f(x,y)=ln(x2+y2),其梯度为:
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
=
(
2
x
x
2
+
y
2
,
2
y
x
2
+
y
2
)
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right) = \left(\frac{2x}{x^2 + y^2}, \frac{2y}{x^2 + y^2}\right)
∇f=(∂x∂f,∂y∂f)=(x2+y22x,x2+y22y)
五、三角函数
对于一个二元正弦函数
f
(
x
,
y
)
=
sin
(
x
+
y
)
f(x, y) = \sin(x + y)
f(x,y)=sin(x+y),其梯度为:
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
=
(
cos
(
x
+
y
)
,
cos
(
x
+
y
)
)
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right) = (\cos(x + y), \cos(x + y))
∇f=(∂x∂f,∂y∂f)=(cos(x+y),cos(x+y))
对于一个二元余弦函数
f
(
x
,
y
)
=
cos
(
x
−
y
)
f(x, y) = \cos(x - y)
f(x,y)=cos(x−y),其梯度为:
∇
f
=
(
∂
f
∂
x
,
∂
f
∂
y
)
=
(
−
sin
(
x
−
y
)
,
sin
(
x
−
y
)
)
\nabla f = \left(\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}\right) = (-\sin(x - y), \sin(x - y))
∇f=(∂x∂f,∂y∂f)=(−sin(x−y),sin(x−y))
六、复合函数
对于一个复合函数
f
(
x
,
y
)
=
g
(
h
(
x
,
y
)
)
f(x, y) = g(h(x, y))
f(x,y)=g(h(x,y)),其中
g
g
g 和
h
h
h 都是可以求导的,其梯度为:
∇
f
=
(
g
′
(
h
(
x
,
y
)
)
⋅
∂
h
∂
x
,
g
′
(
h
(
x
,
y
)
)
⋅
∂
h
∂
y
)
\nabla f = \left(g'(h(x, y)) \cdot \frac{\partial h}{\partial x}, g'(h(x, y)) \cdot \frac{\partial h}{\partial y}\right)
∇f=(g′(h(x,y))⋅∂x∂h,g′(h(x,y))⋅∂y∂h)
2.4 雅可比矩阵(Jacobian matrix)和 黑塞矩阵(Hessian matrix)
雅可比矩阵(Jacobian matrix)和黑塞矩阵(Hessian matrix)是多变量微积分中的重要概念,用于描述多元函数在某一点处的变化情况。
雅可比矩阵是向量值函数的偏导数矩阵。黑塞矩阵是二阶偏导数矩阵,常用于寻找函数的局部极值点。
2.4.1 雅可比矩阵
雅可比矩阵描述了一个多元函数在某一点处的一阶偏导数。对于一个从 R n \mathbb{R}^n Rn 映射到 R m \mathbb{R}^m Rm 的函数 f : R n → R m f: \mathbb{R}^n \to \mathbb{R}^m f:Rn→Rm,其中 f = ( f 1 , f 2 , … , f m ) f = (f_1, f_2, \ldots, f_m) f=(f1,f2,…,fm),雅可比矩阵 J f J_f Jf 在点 ( x 1 , x 2 , … , x n ) (x_1, x_2, \ldots, x_n) (x1,x2,…,xn)处定义为:
J f ( x 1 , x 2 , … , x n ) = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ⋯ ∂ f 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ f m ∂ x 1 ∂ f m ∂ x 2 ⋯ ∂ f m ∂ x n ] J_f(x_1, x_2, \ldots, x_n) = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_m}{\partial x_1} & \frac{\partial f_m}{\partial x_2} & \cdots & \frac{\partial f_m}{\partial x_n} \end{bmatrix} Jf(x1,x2,…,xn)= ∂x1∂f1∂x1∂f2⋮∂x1∂fm∂x2∂f1∂x2∂f2⋮∂x2∂fm⋯⋯⋱⋯∂xn∂f1∂xn∂f2⋮∂xn∂fm
2.4.2 黑塞矩阵
黑塞矩阵描述了一个标量函数在某一点处的所有二阶偏导数。对于一个从 R n \mathbb{R}^n Rn 映射到 R \mathbb{R} R 的函数 f : R n → R f: \mathbb{R}^n \to \mathbb{R} f:Rn→R,黑塞矩阵 H f H_f Hf 在点 ( x 1 , x 2 , … , x n ) (x_1, x_2, \ldots, x_n) (x1,x2,…,xn) 处定义为:
H f ( x 1 , x 2 , … , x n ) = [ ∂ 2 f ∂ x 1 2 ∂ 2 f ∂ x 1 ∂ x 2 ⋯ ∂ 2 f ∂ x 1 ∂ x n ∂ 2 f ∂ x 2 ∂ x 1 ∂ 2 f ∂ x 2 2 ⋯ ∂ 2 f ∂ x 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ 2 f ∂ x n ∂ x 1 ∂ 2 f ∂ x n ∂ x 2 ⋯ ∂ 2 f ∂ x n 2 ] H_f(x_1, x_2, \ldots, x_n) = \begin{bmatrix} \frac{\partial^2 f}{\partial x_1^2} & \frac{\partial^2 f}{\partial x_1 \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_1 \partial x_n} \\ \frac{\partial^2 f}{\partial x_2 \partial x_1} & \frac{\partial^2 f}{\partial x_2^2} & \cdots & \frac{\partial^2 f}{\partial x_2 \partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 f}{\partial x_n \partial x_1} & \frac{\partial^2 f}{\partial x_n \partial x_2} & \cdots & \frac{\partial^2 f}{\partial x_n^2} \end{bmatrix} Hf(x1,x2,…,xn)= ∂x12∂2f∂x2∂x1∂2f⋮∂xn∂x1∂2f∂x1∂x2∂2f∂x22∂2f⋮∂xn∂x2∂2f⋯⋯⋱⋯∂x1∂xn∂2f∂x2∂xn∂2f⋮∂xn2∂2f
如果函数 f f f 的二阶偏导数都是连续的,则黑塞矩阵是对称的,即 ∂ 2 f ∂ x i ∂ x j = ∂ 2 f ∂ x j ∂ x i \frac{\partial^2 f}{\partial x_i \partial x_j} = \frac{\partial^2 f}{\partial x_j \partial x_i} ∂xi∂xj∂2f=∂xj∂xi∂2f。
2.4.3 Python 示例
接下来,我们将使用 sympy
库来计算给定函数的雅可比矩阵和黑塞矩阵。让我们假设有一个函数
f
(
x
,
y
)
=
x
2
+
x
y
+
y
2
f(x, y) = x^2 + xy + y^2
f(x,y)=x2+xy+y2。
import sympy as sp
# 定义符号变量
x, y = sp.symbols('x y')
# 定义函数 f(x, y)
f = x**2 + x*y + y**2
# 计算雅可比矩阵
# 对于一个标量函数 f(x, y),雅可比矩阵实际上就是它的梯度
df_dx = sp.diff(f, x)
df_dy = sp.diff(f, y)
jacobian_matrix = sp.Matrix([df_dx, df_dy])
# 计算黑塞矩阵
d2f_dx2 = sp.diff(df_dx, x)
d2f_dy2 = sp.diff(df_dy, y)
d2f_dxdy = sp.diff(df_dx, y)
d2f_dydx = sp.diff(df_dy, x)
hessian_matrix = sp.Matrix([[d2f_dx2, d2f_dxdy], [d2f_dydx, d2f_dy2]])
# 输出结果
print("雅可比矩阵 J_f:")
print(jacobian_matrix)
print("\n黑塞矩阵 H_f:")
print(hessian_matrix)
运行这段代码后,会得到以下结果:
雅可比矩阵 J_f:
Matrix([
[2*x + y],
[x + 2*y]])
黑塞矩阵 H_f:
Matrix([
[2, 1],
[1, 2]])
这表明对于给定的函数 f ( x , y ) = x 2 + x y + y 2 f(x, y) = x^2 + xy + y^2 f(x,y)=x2+xy+y2,雅可比矩阵和黑塞矩阵分别为:
J f = [ 2 x + y x + 2 y ] , H f = [ 2 1 1 2 ] J_f = \begin{bmatrix} 2x + y \\ x + 2y \end{bmatrix}, \quad H_f = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix} Jf=[2x+yx+2y],Hf=[2112]
2.4.4 应用举例
雅可比矩阵和黑塞矩阵在数学、工程学、物理学以及计算机科学等多个领域都有广泛的应用。下面是它们的一些主要应用领域:
雅可比矩阵的应用
-
变换与坐标映射
- 在多维空间中的坐标变换时,雅可比矩阵提供了从一个坐标系到另一个坐标系的转换关系。
- 在数值积分中,如计算多重积分时,雅可比行列式被用来改变积分变量,从而简化积分问题。
-
机器人学
- 在机器人运动学中,雅可比矩阵用于描述机器人关节速度与末端执行器线速度和角速度之间的关系。
- 这有助于解决正向和逆向运动学问题,即根据关节角度确定末端执行器的位置或反之亦然。
-
优化算法
- 在非线性优化问题中,雅可比矩阵用于梯度下降等方法中,帮助找到函数的最小值。
- 在约束优化中,拉格朗日乘子法也用到了雅可比矩阵来表示约束条件。
-
动力学分析
- 在多体系统动力学中,雅可比矩阵用于计算系统的动力学特性,如力和加速度的关系。
-
机器学习
- 在神经网络训练过程中,反向传播算法利用雅可比矩阵来更新权重和偏差,以最小化损失函数。
黑塞矩阵的应用
-
优化算法
- 在二次规划和牛顿法等优化算法中,黑塞矩阵提供了函数在某一点处的曲率信息,用于加速收敛过程。
- 黑塞矩阵的特征值可用于判断局部极小点或极大点的存在性。
-
数值稳定性分析
- 在数值分析中,黑塞矩阵用于分析算法的稳定性,尤其是在处理非线性方程组时。
-
统计学
- 在最大似然估计中,黑塞矩阵的逆给出了参数估计的标准误差。
- 在贝叶斯统计中,黑塞矩阵用于近似后验分布。
-
经济学
- 在经济学中,黑塞矩阵用于评估生产函数的凹凸性,这对于理解成本最小化或收益最大化问题至关重要。
-
控制理论
- 在控制理论中,黑塞矩阵用于稳定性分析,特别是在线性化系统模型时。
-
物理模拟
- 在物理模拟中,黑塞矩阵可以用来分析系统的稳定性和响应特性。
雅可比矩阵和黑塞矩阵是强大的工具,它们能够提供关于多变量函数的局部变化和曲率的信息。这些信息对于理解和解决各种实际问题非常有用。无论是进行复杂的工程设计还是开发先进的机器学习算法,这些矩阵都是不可或缺的组成部分。
应用举例:牛顿法
牛顿法是一种迭代优化算法,用于寻找函数的局部极小点。它基于泰勒展开的思想,在每一步都使用目标函数的一阶和二阶导数信息来逼近函数。
牛顿法的基本步骤:
- 初始化:选择一个初始点 x 0 x_0 x0。
- 迭代:对于每个
k
=
0
,
1
,
2
,
…
k=0, 1, 2, \ldots
k=0,1,2,…
- 计算一阶导数(梯度) g k = ∇ f ( x k ) g_k = \nabla f(x_k) gk=∇f(xk) 和二阶导数(黑塞矩阵) H k = ∇ 2 f ( x k ) H_k = \nabla^2 f(x_k) Hk=∇2f(xk)。
- 解线性方程组 H k s k = − g k H_k s_k = -g_k Hksk=−gk 来找到搜索方向 s k s_k sk。
- 沿着搜索方向 s k s_k sk 更新 x k + 1 = x k + α s k x_{k+1} = x_k + \alpha s_k xk+1=xk+αsk,其中 α \alpha α 是步长,可以通过某种策略确定,比如精确线搜索或不精确线搜索。
- 终止条件:当梯度足够小或者达到预设的最大迭代次数时停止。
黑塞矩阵的作用:
- 曲率信息:黑塞矩阵提供了函数在当前点的曲率信息,这有助于确定搜索方向。
- 加速收敛:通过使用黑塞矩阵,牛顿法可以在每次迭代中更快地接近极小点。这是因为牛顿法考虑了目标函数的二阶导数,从而更准确地逼近了函数的行为。
- 局部极小点的判定:如果黑塞矩阵在某点处正定(所有特征值大于零),则该点是局部极小点;如果负定,则是局部极大点;如果既不是正定也不是负定,则可能是鞍点。
示例
为了更好地理解牛顿法如何使用黑塞矩阵,我们可以考虑一个简单的例子:
假设我们要最小化函数 f ( x ) = x 2 + 2 x + 1 f(x) = x^2 + 2x + 1 f(x)=x2+2x+1。首先,我们计算一阶和二阶导数:
- f ′ ( x ) = 2 x + 2 f'(x) = 2x + 2 f′(x)=2x+2
- f ′ ′ ( x ) = 2 f''(x) = 2 f′′(x)=2
牛顿法的迭代公式为 x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) x_{k+1} = x_k - \frac{f'(x_k)}{f''(x_k)} xk+1=xk−f′′(xk)f′(xk)。
如果我们从 x 0 = 0 x_0 = 0 x0=0 开始,第一次迭代将是:
- f ′ ( x 0 ) = 2 f'(x_0) = 2 f′(x0)=2
- f ′ ′ ( x 0 ) = 2 f''(x_0) = 2 f′′(x0)=2
- x 1 = 0 − 2 2 = − 1 x_1 = 0 - \frac{2}{2} = -1 x1=0−22=−1
我们可以看到,即使只经过一次迭代,我们也已经接近了函数的最小值点 x = − 1 x = -1 x=−1。(对于这个函数而言,无论从哪个初始点开始,都只需要一次迭代)
Python 示例
接下来,我们使用 Python 实现一个简单的牛顿法来最小化一个一维函数 f ( x ) = x 2 + 2 x + 1 f(x) = x^2 + 2x + 1 f(x)=x2+2x+1。
import numpy as np
def f(x):
return x**2 + 2*x + 1
def df(x):
return 2*x + 2
def d2f(x):
return 2
def newton_method(f, df, d2f, x0, tol=1e-6, max_iter=100):
x_k = x0
for i in range(max_iter):
grad = df(x_k)
hessian = d2f(x_k)
# 如果黑塞矩阵为零,避免除以零
if hessian == 0:
raise ValueError("Hessian is zero; cannot proceed.")
# 更新 x_k
x_k -= grad / hessian
# 终止条件
if abs(grad) < tol:
break
return x_k, i
x0 = 0 # 初始点
x_min, num_iters = newton_method(f, df, d2f, x0)
print("Minimum point found at x =", x_min)
print("Number of iterations:", num_iters)
这段代码将输出最小值点和所需的迭代次数。对于这个简单的例子,我们期望找到的最小值点是 x = − 1 x = -1 x=−1。
2.5 积分(Integration)
积分是微积分的一个基本概念,用于计算函数在某区间内的累积效果。积分可以分为不定积分和定积分两种类型。
2.5.1 不定积分与定积分
不定积分是求函数的原函数的过程,即找到一个函数
F
(
x
)
F(x)
F(x) 使得它的导数
F
′
(
x
)
=
f
(
x
)
F'(x) = f(x)
F′(x)=f(x)。不定积分通常写作:
∫
f
(
x
)
d
x
=
F
(
x
)
+
C
\int f(x) \, dx = F(x) + C
∫f(x)dx=F(x)+C
其中
C
C
C 是积分常数。
定积分是计算函数
f
(
x
)
f(x)
f(x) 在区间
[
a
,
b
]
[a, b]
[a,b] 内的累积效果,即求函数在该区间下的面积。定积分通常写作:
∫
a
b
f
(
x
)
d
x
\int_{a}^{b} f(x) \, dx
∫abf(x)dx
定积分的结果是一个数值,代表函数
f
(
x
)
f(x)
f(x) 在区间
[
a
,
b
]
[a, b]
[a,b] 上的累积效果。
接下来,我们编写 Python 代码来计算一个函数的不定积分和定积分。
import sympy as sp
# 定义符号变量
x = sp.symbols('x')
# 定义函数
f = x**2
# 计算不定积分
indefinite_integral = sp.integrate(f, x)
# 计算定积分
definite_integral = sp.integrate(f, (x, 0, 1))
# 输出结果
print("Indefinite integral:", indefinite_integral)
print("Definite integral from 0 to 1:", definite_integral)
- 我们首先导入
sympy
并定义符号变量x
。 - 定义一个函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2。
- 使用
sympy.integrate
函数来计算不定积分和定积分。 - 输出结果。
运行这段代码,你将得到如下输出:
Indefinite integral: x**3/3
Definite integral from 0 to 1: 1/3
这表明函数 f ( x ) = x 2 f(x) = x^2 f(x)=x2 的不定积分是 x 3 3 + C \frac{x^3}{3} + C 3x3+C,其中 C C C 是积分常数。定积分 ∫ 0 1 x 2 d x \int_{0}^{1} x^2 \, dx ∫01x2dx 的结果是 1 3 \frac{1}{3} 31。
2.5.2 基本积分公式及代码
下面列出了一些常见的积分公式及其结果。这些积分公式涵盖了基本的函数类型,包括幂函数、指数函数、对数函数、三角函数等。这些公式对于解决实际问题非常有用。
-
幂函数
- ∫ x n d x = x n + 1 n + 1 + C \int x^n \, dx = \frac{x^{n+1}}{n+1} + C ∫xndx=n+1xn+1+C, n ≠ − 1 n \neq -1 n=−1
- ∫ 1 x d x = ln ∣ x ∣ + C \int \frac{1}{x} \, dx = \ln|x| + C ∫x1dx=ln∣x∣+C
-
指数函数
- ∫ e x d x = e x + C \int e^x \, dx = e^x + C ∫exdx=ex+C
- ∫ a x d x = a x ln ( a ) + C \int a^x \, dx = \frac{a^x}{\ln(a)} + C ∫axdx=ln(a)ax+C, a > 0 , a ≠ 1 a > 0, a \neq 1 a>0,a=1
-
对数函数
- ∫ ln ( x ) d x = x ln ( x ) − x + C \int \ln(x) \, dx = x \ln(x) - x + C ∫ln(x)dx=xln(x)−x+C
-
三角函数
- ∫ sin ( x ) d x = − cos ( x ) + C \int \sin(x) \, dx = -\cos(x) + C ∫sin(x)dx=−cos(x)+C
- ∫ cos ( x ) d x = sin ( x ) + C \int \cos(x) \, dx = \sin(x) + C ∫cos(x)dx=sin(x)+C
- ∫ tan ( x ) d x = − ln ∣ cos ( x ) ∣ + C \int \tan(x) \, dx = -\ln|\cos(x)| + C ∫tan(x)dx=−ln∣cos(x)∣+C
- ∫ sec 2 ( x ) d x = tan ( x ) + C \int \sec^2(x) \, dx = \tan(x) + C ∫sec2(x)dx=tan(x)+C
- ∫ csc 2 ( x ) d x = − cot ( x ) + C \int \csc^2(x) \, dx = -\cot(x) + C ∫csc2(x)dx=−cot(x)+C
- ∫ sec ( x ) tan ( x ) d x = sec ( x ) + C \int \sec(x)\tan(x) \, dx = \sec(x) + C ∫sec(x)tan(x)dx=sec(x)+C
- ∫ csc ( x ) cot ( x ) d x = − csc ( x ) + C \int \csc(x)\cot(x) \, dx = -\csc(x) + C ∫csc(x)cot(x)dx=−csc(x)+C
-
反三角函数
- ∫ 1 1 − x 2 d x = arcsin ( x ) + C \int \frac{1}{\sqrt{1-x^2}} \, dx = \arcsin(x) + C ∫1−x21dx=arcsin(x)+C
- ∫ 1 1 + x 2 d x = arctan ( x ) + C \int \frac{1}{1+x^2} \, dx = \arctan(x) + C ∫1+x21dx=arctan(x)+C
-
特殊函数
- ∫ 1 x 2 + a 2 d x = 1 a arctan ( x a ) + C \int \frac{1}{x^2+a^2} \, dx = \frac{1}{a}\arctan\left(\frac{x}{a}\right) + C ∫x2+a21dx=a1arctan(ax)+C
- ∫ 1 x 2 − a 2 d x = ln ∣ x + x 2 − a 2 ∣ + C \int \frac{1}{\sqrt{x^2-a^2}} \, dx = \ln|x+\sqrt{x^2-a^2}| + C ∫x2−a21dx=ln∣x+x2−a2∣+C
下面我将给出使用 sympy
来计算一些基本积分的示例代码。
import sympy as sp
# 定义符号变量
x = sp.symbols('x')
# 定义函数
functions = [
x**2,
1/x,
sp.exp(x),
sp.log(x),
sp.sin(x),
sp.cos(x),
sp.tan(x),
1/(1 + x**2),
1/(sp.sqrt(1 - x**2)),
1/(sp.sqrt(x**2 - 1)),
sp.sec(x) * sp.tan(x),
sp.csc(x) * sp.cot(x),
sp.log(x) * x,
]
# 计算不定积分
integrals = [sp.integrate(f, x) for f in functions]
# 输出结果
for i, integral in enumerate(integrals):
print(f"Integral of {functions[i]}: {integral}")
运行这段代码,你将得到如下输出:
Integral of x**2: x**3/3
Integral of 1/x: log(x)
Integral of exp(x): exp(x)
Integral of log(x): x*log(x) - x
Integral of sin(x): -cos(x)
Integral of cos(x): sin(x)
Integral of tan(x): -log(cos(x))
Integral of 1/(x**2 + 1): atan(x)
Integral of 1/sqrt(1 - x**2): asin(x)
Integral of 1/sqrt(x**2 - 1): log(x + sqrt(x**2 - 1))
Integral of sec(x)*tan(x): sec(x)
Integral of csc(x)*cot(x): -csc(x)
Integral of x*log(x): x**2*log(x)/2 - x**2/4
这些积分结果涵盖了上述列出的一些常见积分公式。
2.5.3 积分的应用
积分在数学、物理学、工程学等领域中有广泛的应用。下面以表格的形式列举一些主要的应用领域和具体应用场景。
应用领域 | 具体应用场景 |
---|---|
物理学 | - 计算物体的位移、速度和加速度 - 确定力的作用效果(如功、能量) - 计算质心和转动惯量 |
工程学 | - 计算流体动力学中的压力分布 - 电路理论中的电流和电压关系 - 材料力学中的应力和应变分布 |
经济学 | - 计算消费者剩余和生产者剩余 - 分析成本函数和收益函数 |
生物学 | - 计算生长曲线和种群动态 - 药物浓度随时间的变化 |
几何学 | - 计算平面图形的面积和体积 - 计算曲线长度和曲面面积 |
概率论与统计学 | - 计算连续随机变量的概率密度函数 - 计算累积分布函数 |
信号处理 | - 计算信号的能量和功率 - 分析傅里叶变换中的频谱 |
热力学 | - 计算热量的传递和能量的变化 - 分析热机效率 |
控制理论 | - 计算系统的响应和稳定性 - 分析系统的频率响应 |
金融学 | - 计算复利和折现值 - 分析股票价格的变动趋势 |
以数学领域为例
在数学领域,积分有着广泛的应用,特别是在几何、微分方程、概率论等方面。下面我将详细介绍一些具体的数学应用实例:
几何学
-
计算平面图形的面积
- 矩形:虽然不需要积分,但作为基础,我们知道矩形的面积是长乘以宽。
- 三角形:同样不需要积分,但三角形的面积是底乘以高除以2。
- 圆:我们可以使用积分来证明圆的面积公式
A
=
π
r
2
A = \pi r^2
A=πr2。
- 例如,我们可以将圆看作是由无数个无限细的扇形组成,每个扇形都可以近似为一个直角三角形,从而使用积分求出圆的总面积。
- 不规则形状:对于边界由函数描述的不规则形状,我们可以使用定积分来计算面积。
-
计算曲线下方的面积
- 对于任意函数 f ( x ) f(x) f(x),我们可以使用定积分 ∫ a b f ( x ) d x \int_{a}^{b} f(x) \, dx ∫abf(x)dx 来计算 y = f ( x ) y=f(x) y=f(x) 与 x = a x=a x=a、 x = b x=b x=b 和 x x x 轴围成的区域的面积。
-
计算旋转体的体积
- 圆盘法:当我们沿着垂直于旋转轴的方向切开一个旋转体时,每个横截面都是一个圆盘。我们可以使用定积分 ∫ a b π [ f ( x ) ] 2 d x \int_{a}^{b} \pi [f(x)]^2 \, dx ∫abπ[f(x)]2dx 来计算体积。
- 外壳法:如果旋转体不适合使用圆盘法,则可以使用外壳法。在这种情况下,我们计算每个薄壳的体积,并通过定积分 ∫ a b 2 π x f ( x ) d x \int_{a}^{b} 2\pi x f(x) \, dx ∫ab2πxf(x)dx 来计算总体积。
-
计算曲线长度
- 对于参数化的曲线 C C C,其长度可以通过定积分 ∫ a b ( d x d t ) 2 + ( d y d t ) 2 d t \int_{a}^{b} \sqrt{\left(\frac{dx}{dt}\right)^2 + \left(\frac{dy}{dt}\right)^2} \, dt ∫ab(dtdx)2+(dtdy)2dt 来计算,其中 t t t 是参数。
-
计算平行截面的体积
- 当一个立体的截面面积随高度变化时,我们可以使用定积分 ∫ a b A ( y ) d y \int_{a}^{b} A(y) \, dy ∫abA(y)dy 来计算体积,其中 A ( y ) A(y) A(y) 是高度 y y y 处的截面面积。
微分方程
-
初值问题
- 对于初值问题 d y d x = f ( x , y ) \frac{dy}{dx} = f(x, y) dxdy=f(x,y),给定初始条件 y ( x 0 ) = y 0 y(x_0) = y_0 y(x0)=y0,我们可以使用积分来求解 y ( x ) y(x) y(x)。
-
边值问题
- 边值问题涉及到在不同点上的函数值,例如 d 2 y d x 2 = f ( x , y , y ′ ) \frac{d^2y}{dx^2} = f(x, y, y') dx2d2y=f(x,y,y′),给定 y ( x 0 ) = y 0 y(x_0) = y_0 y(x0)=y0 和 y ( x 1 ) = y 1 y(x_1) = y_1 y(x1)=y1,我们可以使用积分方法求解 y ( x ) y(x) y(x)。
-
线性微分方程
- 一阶线性微分方程 d y d x + p ( x ) y = q ( x ) \frac{dy}{dx} + p(x)y = q(x) dxdy+p(x)y=q(x) 可以通过积分因子法求解。
- 高阶线性微分方程也可以通过积分求解相应的特解和通解。
概率论
-
概率密度函数
- 如果随机变量 X X X 的概率密度函数为 f ( x ) f(x) f(x),则 X X X 在区间 [ a , b ] [a, b] [a,b] 内的概率 P ( a ≤ X ≤ b ) P(a \leq X \leq b) P(a≤X≤b) 可以通过定积分 ∫ a b f ( x ) d x \int_{a}^{b} f(x) \, dx ∫abf(x)dx 来计算。
-
期望值
- 随机变量 X X X 的期望值 E [ X ] E[X] E[X] 可以通过积分 ∫ − ∞ ∞ x f ( x ) d x \int_{-\infty}^{\infty} x f(x) \, dx ∫−∞∞xf(x)dx 来计算,其中 f ( x ) f(x) f(x) 是 X X X 的概率密度函数。
-
方差
- 随机变量 X X X 的方差 V a r [ X ] Var[X] Var[X] 可以通过积分 ∫ − ∞ ∞ ( x − E [ X ] ) 2 f ( x ) d x \int_{-\infty}^{\infty} (x - E[X])^2 f(x) \, dx ∫−∞∞(x−E[X])2f(x)dx 来计算。
-
联合分布
- 对于两个随机变量 X X X 和 Y Y Y 的联合概率密度函数 f ( x , y ) f(x, y) f(x,y),我们可以通过积分来计算边缘分布、条件分布等。
2.6 拉格朗日乘子(Lagrange multipliers)
拉格朗日乘子法(Lagrange multipliers method)是一种在数学优化中用于求解带有等式约束条件的最优化问题的方法。这种方法特别适用于当我们要最大化或最小化一个函数(目标函数),同时该函数受到一个或多个等式约束的情况。
2.6.1 概念
考虑一个函数
f
(
x
,
y
)
f(x, y)
f(x,y) 要在满足某个等式约束
g
(
x
,
y
)
=
c
g(x, y) = c
g(x,y)=c 的条件下达到极值(最大值或最小值)。拉格朗日乘子法通过引入一个新的变量(称为拉格朗日乘子)
λ
\lambda
λ 来构造一个新的函数
L
L
L,即所谓的拉格朗日函数(Lagrangian function):
L
(
x
,
y
,
λ
)
=
f
(
x
,
y
)
−
λ
(
g
(
x
,
y
)
−
c
)
L(x, y, \lambda) = f(x, y) - \lambda (g(x, y) - c)
L(x,y,λ)=f(x,y)−λ(g(x,y)−c)
然后我们寻找
L
L
L 的临界点,也就是
L
L
L 的偏导数等于零的点。这意味着我们需要解下列方程组:
∂
L
∂
x
=
0
∂
L
∂
y
=
0
∂
L
∂
λ
=
0
\begin{align*} \frac{\partial L}{\partial x} &= 0 \\ \frac{\partial L}{\partial y} &= 0 \\ \frac{\partial L}{\partial \lambda} &= 0 \end{align*}
∂x∂L∂y∂L∂λ∂L=0=0=0
这些方程组给出了原问题可能的解。
2.6.2 例子
假设我们要找到函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 在约束 g ( x , y ) = x + y = 1 g(x, y) = x + y = 1 g(x,y)=x+y=1 下的极小值。
-
构造拉格朗日函数:
L ( x , y , λ ) = x 2 + y 2 − λ ( x + y − 1 ) L(x, y, \lambda) = x^2 + y^2 - \lambda (x + y - 1) L(x,y,λ)=x2+y2−λ(x+y−1) -
求导数:
∂ L ∂ x = 2 x − λ = 0 ∂ L ∂ y = 2 y − λ = 0 ∂ L ∂ λ = − ( x + y − 1 ) = 0 \begin{align*} \frac{\partial L}{\partial x} &= 2x - \lambda = 0 \\ \frac{\partial L}{\partial y} &= 2y - \lambda = 0 \\ \frac{\partial L}{\partial \lambda} &= -(x + y - 1) = 0 \end{align*} ∂x∂L∂y∂L∂λ∂L=2x−λ=0=2y−λ=0=−(x+y−1)=0 -
解方程组:
从第一个和第二个方程可以得到 2 x = 2 y = λ 2x = 2y = \lambda 2x=2y=λ。因此 x = y x = y x=y。结合第三个方程 x + y = 1 x + y = 1 x+y=1,我们可以解得 x = y = 1 2 x = y = \frac{1}{2} x=y=21 和 λ = 1 \lambda = 1 λ=1。 -
验证:
将 x = 1 2 x = \frac{1}{2} x=21 和 y = 1 2 y = \frac{1}{2} y=21 代入原始函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 得到 f ( 1 2 , 1 2 ) = 1 4 + 1 4 = 1 2 f(\frac{1}{2}, \frac{1}{2}) = \frac{1}{4} + \frac{1}{4} = \frac{1}{2} f(21,21)=41+41=21。
这表明在给定的约束下,函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 的最小值为 1 2 \frac{1}{2} 21。
代码示例
接下来,我们编写 Python 代码来解决问题:
import sympy as sp
# 定义符号变量
x, y, lmbda = sp.symbols('x y lambda')
# 定义目标函数
f = x**2 + y**2
# 定义约束条件
g = x + y - 1
# 构造拉格朗日函数
L = f - lmbda * g
# 计算拉格朗日函数的梯度
grad_L = [sp.diff(L, var) for var in (x, y, lmbda)]
# 解梯度为零的方程组
solution = sp.solve(grad_L, (x, y, lmbda))
# 输出解
print("Solution:", solution)
代码解析
- 我们首先导入
sympy
并定义符号变量x
,y
, 和lmbda
。 - 定义目标函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 和约束函数 g ( x , y ) = x + y − 1 g(x, y) = x + y - 1 g(x,y)=x+y−1。
- 构造拉格朗日函数 L L L。
- 计算拉格朗日函数关于
x
,y
, 和lmbda
的偏导数。 - 使用
sympy.solve
函数来解这个方程组。 - 输出解。
运行上述代码,你将得到如下输出:
Solution: {lambda: 1, x: 1/2, y: 1/2}
这表明在给定的约束下,函数 f ( x , y ) = x 2 + y 2 f(x, y) = x^2 + y^2 f(x,y)=x2+y2 的最小值发生在 x = y = 0.5 x = y = 0.5 x=y=0.5 处,且拉格朗日乘子为 1。
2.6.3 扩展到多个变量和多个约束
对于更复杂的问题,我们可以有多个变量和多个约束条件。例如,如果我们有两个变量
x
,
y
x, y
x,y 和两个约束
g
1
(
x
,
y
)
=
c
1
g_1(x, y) = c_1
g1(x,y)=c1 和
g
2
(
x
,
y
)
=
c
2
g_2(x, y) = c_2
g2(x,y)=c2,则拉格朗日函数可以写为:
L
(
x
,
y
,
λ
1
,
λ
2
)
=
f
(
x
,
y
)
−
λ
1
(
g
1
(
x
,
y
)
−
c
1
)
−
λ
2
(
g
2
(
x
,
y
)
−
c
2
)
L(x, y, \lambda_1, \lambda_2) = f(x, y) - \lambda_1(g_1(x, y) - c_1) - \lambda_2(g_2(x, y) - c_2)
L(x,y,λ1,λ2)=f(x,y)−λ1(g1(x,y)−c1)−λ2(g2(x,y)−c2)
此时需要解的方程组为:
∂
L
∂
x
=
0
∂
L
∂
y
=
0
∂
L
∂
λ
1
=
0
∂
L
∂
λ
2
=
0
\begin{align*} \frac{\partial L}{\partial x} &= 0 \\ \frac{\partial L}{\partial y} &= 0 \\ \frac{\partial L}{\partial \lambda_1} &= 0 \\ \frac{\partial L}{\partial \lambda_2} &= 0 \end{align*}
∂x∂L∂y∂L∂λ1∂L∂λ2∂L=0=0=0=0
通过解这个方程组,我们可以找到满足所有约束条件的候选点,进而确定原问题的解。
示例代码
下面我将展示如何使用 sympy
来解决带有多个变量和多个约束的最优化问题。
假设我们有一个函数 f ( x , y , z ) = x 2 + y 2 + z 2 f(x, y, z) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2,并且有两个等式约束条件: g 1 ( x , y , z ) = x + y + z = 1 g_1(x, y, z) = x + y + z = 1 g1(x,y,z)=x+y+z=1 和 g 2 ( x , y , z ) = x 2 + y 2 − z = 0 g_2(x, y, z) = x^2 + y^2 - z = 0 g2(x,y,z)=x2+y2−z=0。我们的目标是在满足这两个约束的情况下找到 f ( x , y , z ) f(x, y, z) f(x,y,z) 的最小值。
import sympy as sp
# 定义符号变量
x, y, z, lmbda1, lmbda2 = sp.symbols('x y z lambda1 lambda2')
# 定义目标函数
f = x**2 + y**2 + z**2
# 定义约束条件
g1 = x + y + z - 1
g2 = x**2 + y**2 - z
# 构造拉格朗日函数
L = f - lmbda1 * g1 - lmbda2 * g2
# 计算拉格朗日函数的梯度
grad_L = [sp.diff(L, var) for var in (x, y, z, lmbda1, lmbda2)]
# 解梯度为零的方程组
solution = sp.solve(grad_L, (x, y, z, lmbda1, lmbda2))
# 输出解
print("Solution:", solution)
代码解析
- 我们首先导入
sympy
并定义符号变量x
,y
,z
,lmbda1
, 和lmbda2
。 - 定义目标函数 f ( x , y , z ) = x 2 + y 2 + z 2 f(x, y, z) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2 和两个约束函数 g 1 ( x , y , z ) = x + y + z − 1 g_1(x, y, z) = x + y + z - 1 g1(x,y,z)=x+y+z−1 和 g 2 ( x , y , z ) = x 2 + y 2 − z g_2(x, y, z) = x^2 + y^2 - z g2(x,y,z)=x2+y2−z。
- 构造拉格朗日函数 L L L。
- 计算拉格朗日函数关于
x
,y
,z
,lmbda1
, 和lmbda2
的偏导数。 - 使用
sympy.solve
函数来解这个方程组。 - 输出解。
运行这段代码,你将得到如下输出:
Solution: [(3/4 - sqrt(13)*I/4, 3/4 + sqrt(13)*I/4, -1/2, 0, 1), (3/4 + sqrt(13)*I/4, 3/4 - sqrt(13)*I/4, -1/2, 0, 1), (-1/2 + sqrt(3)/2, -1/2 + sqrt(3)/2, 2 - sqrt(3), 7 - 11*sqrt(3)/3, 3 - 5*sqrt(3)/3), (-sqrt(3)/2 - 1/2, -sqrt(3)/2 - 1/2, sqrt(3) + 2, 11*sqrt(3)/3 + 7, 5*sqrt(3)/3 + 3)]
输出分析
上述输出中,包含了一些复数解和实数解。这是因为 sympy
默认会返回所有的解,包括复数解。在实际应用中,我们通常只关注实数解,因为复数解通常不具有物理意义。让我们重新分析输出并提取实数解。
输出包含了四个解:
- ( 3 / 4 − 13 i / 4 , 3 / 4 + 13 i / 4 , − 1 / 2 , 0 , 1 ) (3/4 - \sqrt{13}i/4, 3/4 + \sqrt{13}i/4, -1/2, 0, 1) (3/4−13i/4,3/4+13i/4,−1/2,0,1)
- ( 3 / 4 + 13 i / 4 , 3 / 4 − 13 i / 4 , − 1 / 2 , 0 , 1 ) (3/4 + \sqrt{13}i/4, 3/4 - \sqrt{13}i/4, -1/2, 0, 1) (3/4+13i/4,3/4−13i/4,−1/2,0,1)
- ( − 1 / 2 + 3 / 2 , − 1 / 2 + 3 / 2 , 2 − 3 , 7 − 11 3 / 3 , 3 − 5 3 / 3 ) (-1/2 + \sqrt{3}/2, -1/2 + \sqrt{3}/2, 2 - \sqrt{3}, 7 - 11\sqrt{3}/3, 3 - 5\sqrt{3}/3) (−1/2+3/2,−1/2+3/2,2−3,7−113/3,3−53/3)
- ( − 3 / 2 − 1 / 2 , − 3 / 2 − 1 / 2 , 3 + 2 , 11 3 / 3 + 7 , 5 3 / 3 + 3 ) (-\sqrt{3}/2 - 1/2, -\sqrt{3}/2 - 1/2, \sqrt{3} + 2, 11\sqrt{3}/3 + 7, 5\sqrt{3}/3 + 3) (−3/2−1/2,−3/2−1/2,3+2,113/3+7,53/3+3)
前两个解包含复数,因此我们可以排除它们。剩下的两个解都是实数解,我们可以进一步分析它们。
分析实数解
我们重点关注实数解:
- ( − 1 / 2 + 3 / 2 , − 1 / 2 + 3 / 2 , 2 − 3 , 7 − 11 3 / 3 , 3 − 5 3 / 3 ) (-1/2 + \sqrt{3}/2, -1/2 + \sqrt{3}/2, 2 - \sqrt{3}, 7 - 11\sqrt{3}/3, 3 - 5\sqrt{3}/3) (−1/2+3/2,−1/2+3/2,2−3,7−113/3,3−53/3)
- ( − 3 / 2 − 1 / 2 , − 3 / 2 − 1 / 2 , 3 + 2 , 11 3 / 3 + 7 , 5 3 / 3 + 3 ) (-\sqrt{3}/2 - 1/2, -\sqrt{3}/2 - 1/2, \sqrt{3} + 2, 11\sqrt{3}/3 + 7, 5\sqrt{3}/3 + 3) (−3/2−1/2,−3/2−1/2,3+2,113/3+7,53/3+3)
我们可以计算这两个解对应的函数值 f ( x , y , z ) = x 2 + y 2 + z 2 f(x, y, z) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2 来判断哪个是最小值。
# 计算每个解对应的函数值
function_values = []
for sol in solution:
if all(val.is_real for val in sol[:3]):
x_val, y_val, z_val = sol[:3]
func_val = f.subs({x: x_val, y: y_val, z: z_val})
function_values.append((func_val, sol))
# 排序函数值,找出最小值对应的解
function_values.sort(key=lambda x: x[0])
# 输出最小值对应的解
min_solution = function_values[0][1]
print("Minimum value:", function_values[0][0])
print("Minimum value evalf:", function_values[0][0].evalf())
print("Minimum solution:", min_solution)
运行这段代码,你将得到如下输出:
Minimum value: (2 - sqrt(3))**2 + 2*(-1/2 + sqrt(3)/2)**2
Minimum value evalf: 0.339745962155614
Minimum solution: (-1/2 + sqrt(3)/2, -1/2 + sqrt(3)/2, 2 - sqrt(3), 7 - 11*sqrt(3)/3, 3 - 5*sqrt(3)/3)
这表明在给定的约束下,函数 f ( x , y , z ) = x 2 + y 2 + z 2 f(x, y, z) = x^2 + y^2 + z^2 f(x,y,z)=x2+y2+z2 的最小值为 ( 2 − s q r t ( 3 ) ) 2 + 2 ∗ ( − 1 / 2 + s q r t ( 3 ) / 2 ) 2 (2 - sqrt(3))^2 + 2*(-1/2 + sqrt(3)/2)^2 (2−sqrt(3))2+2∗(−1/2+sqrt(3)/2)2,此时对应的解为 ( − 1 / 2 + 3 / 2 , − 1 / 2 + 3 / 2 , 2 − 3 ) (-1/2 + \sqrt{3}/2, -1/2 + \sqrt{3}/2, 2 - \sqrt{3}) (−1/2+3/2,−1/2+3/2,2−3)。
这就是使用 sympy
来求解带有多个变量和多个约束的最优化问题的完整示例。需要注意的是,拉格朗日乘子法只提供了候选解,还需要进一步检查这些解是否确实是最大值或最小值,可以通过二次导数检验或者直观地考虑问题背景来判断。