📑 查看全课大纲(第 27 / 93 节)
- 1.概论和集合的定义
- 2.逼疯康托的实数集理论
- 3.常用不等式与映射
- 4.函数及特殊函数
- 5.序列极限的定义
- 6.序列极限的性质与夹逼定理
- 7.重要极限
- 8.无穷小量,无穷大量和一组重要的阶的比较关系
- 9.聚点原理
- 10.函数极限及其性质
- 11.重要极限与等价无穷小
- 12.连续函数
- 13.导数的概念(那些年,扛起牛顿的胡克)
- 14.定义法求导
- 15.函数四则运算的导数与反函数求导法则
- 16.复合函数,隐函数,参数式求导
- 17.不定式求导之“洛必达与伯努利的师生情”
- 18.一阶微分
- 19.高阶导数
- 20.高阶微分
- 21.罗尔中值定理与拉格朗日中值定理
- 22.柯西空降科学院遭排挤
- 23.泰勒公式与泰勒的克妻属性
- 24.利用泰勒展开唯一性定理计算泰勒展开
- 25.泰勒公式的余项估计
- 26.极值问题与导数
- 27.函数凹凸性
- 28.无卵用的渐近线与函数作图
- 29.不定积分的定义
- 30.第一换元法
- 31.第二换元法
- 32.分部积分法
- 33.有理式积分
- 34.三角替换
- 35.定积分的概念
- 36.定积分的性质与积分中值定理
- 37.变上限定积分
- 38.微积分基本定理之“高斯教你如何优雅地装逼”
- 39.定积分的换元法
- 40.奇偶函数与周期函数的定积分
- 41.曲线求长与不可求长曲线(海岸线居然算不出长度?)
- 42.旋转体体积
- 43.旋转体侧面积
- 44.极坐标下图形的面积(数学系常用表白曲线)
- 45.欧式空间
- 46.点列极限,开集与闭集
- 47.多元函数的定义
- 48.多元函数的极限
- 49.多元连续函数
- 50.一阶偏导数
- 51.高阶偏导数
- 52.全微分
- 53.方向导数与梯度
- 54.链式法则
- 55.一阶全微分形式的不变性与高阶微分
- 56.多元函数的泰勒公式
- 57.隐函数存在定理与逆映射存在定理
- 58.多元函数的极值
- 59.矩阵基础知识
- 60.行列式的定义与特殊矩阵的行列式
- 61.行列式的性质
- 62.行列式按k行展开
- 63.线性方程组初步与高斯消元法
- 64.齐次线性方程组与Cramer法则
- 65.线性空间
- 66.线性相关与线性无关
- 67.向量组的秩
- 68.矩阵的秩与线性方程组有解的充要条件
- 69.齐次线性方程组的解集结构
- 70.非齐次线性方程组解集结构
- 71.基与维数
- 72.矩阵的乘法
- 73.特殊矩阵
- 74.矩阵乘积的秩与行列式
- 75.矩阵的逆
- 76.正交矩阵
- 77.矩阵对角化与特征值特征向量
- 78.实对称矩阵对角化
- 79.二次型与正定矩阵
- 80.LU分解
- 81.Cholesky分解
- 82.SVD分解
- 83.线搜索
- 84.步长
- 85.最速下降法和牛顿法
- 86.共轭梯度法
- 87.拟牛顿法
- 88.无约束优化
- 89.若干知识点补充(一)
- 90.若干知识点补充(二)
- 91.凸优化问题
- 92.对偶问题(一)
- 93.对偶问题(二)
函数凹凸性
约 35 分钟
函数的凹凸性
小象实战讲义 · 人工智能数学基础
在数学分析中,函数的凹凸性是描述函数图像弯曲方向的重要性质。理解凹凸性不仅有助于我们直观把握函数图形的形状,更是后续学习最优化理论(如凸优化)的基石。本节我们将从几何和代数两个角度定义凹凸性,并学习如何判断一个函数的凹凸性,最后通过几个著名不等式来展示凸函数的强大应用。
💡 核心导读
本节你将掌握:
- 几何定义:理解凸函数与凹函数在图像上的直观特征——连接图像上任意两点的线段位于图像上方还是下方。
- 代数判定:掌握利用一阶导数的单调性或二阶导数的正负来判断函数凹凸性的方法。
- 琴生不等式:学习凸函数的核心性质,即函数值的加权平均不小于平均值的函数值。
- 经典应用:了解如何利用凸函数性质证明均值不等式、赫尔德不等式等重要结论。
凸函数与凹函数的几何定义
我们先从最直观的几何图像入手。考虑定义在区间 上的函数 。
凸函数:如果对于区间 上任意两点 以及任意实数 ,都有: 则称 是 上的凸函数(或下凸函数)。
几何解释:在函数图像上取两点 和 ,连接这两点的线段上的点可以表示为 。凸函数的定义意味着,对于任意 和 之间的点,其对应的函数值 总是不高于连接两点线段上对应点的纵坐标。简单说,就是“弦在图像之上”。
凹函数:如果将上述不等式的不等号反向,即: 则称 是 上的凹函数(或上凸函数)。其几何意义是“弦在图像之下”。
一个形象的记忆方法是联想二次函数:开口向上的抛物线(如 )是凸函数;开口向下的抛物线(如 )是凹函数。
非凸非凹函数:大部分函数并非在整个定义域上都是凸的或凹的。例如,正弦函数 在某些区间是凸的,在某些区间是凹的,整体上既非凸也非凹。
凸集与凸函数的关联
凸性的概念不仅限于函数,还适用于集合。
凸集:在二维或高维空间中,如果一个集合 满足:连接其中任意两点的线段上的所有点仍然属于 ,则称 为凸集。
- 例如:圆盘、正方形、整个平面都是凸集。
- 非凸集:月牙形、有缺口的圆环等不是凸集,因为你能找到两点,其连线的一部分落在了集合外部。
凸函数与凸集的关系:一个函数 是凸函数,等价于其上方图(epigraph)是一个凸集。函数 的上方图定义为: 即函数图像及其上方的所有点构成的区域。凸函数的定义保证了其上方图中任意两点的连线仍在区域内,因此上方图是凸集。这统一了函数凸性与集合凸性的概念。
凹凸性的代数判定定理
从定义直接判断函数凹凸性往往比较困难。幸运的是,对于可导函数,我们有更实用的判定方法。
定理(一阶导数判定法):设函数 在区间 上连续且可导。则 是 上的凸函数的充分必要条件是,其导函数 在 上单调不减(非严格递增)。
证明思路:
- 必要性(凸 单调不减):任取 。根据凸函数的定义,可以构造差商不等式,并令分割点趋于端点,利用极限的夹逼性,最终得到 。
- 充分性( 单调不减 凸):任取 。对区间 和 分别应用拉格朗日中值定理,得到两个中值点 。由 单调不减可知 ,这等价于差商不等式,进而可以推导出琴生不等式,即凸函数的定义。
如果函数二阶可导,我们有更简洁的判定条件。
定理(二阶导数判定法):设函数 在区间 上二阶可导。
- 若在 上恒有 ,则 是 上的凸函数。
- 若在 上恒有 ,则 是 上的凹函数。
说明:这是因为 意味着 单调不减,从而由一阶判定法可知 是凸函数。反之亦然。对于严格凹凸性,要求 在 的任意子区间上不恒为零。
特例:线性函数 的二阶导数为零,它既是凸函数也是凹函数,因为连接其上任意两点的线段与函数图像本身重合。
琴生不等式及其应用
琴生不等式是凸函数定义的直接推广,也是凸函数理论中最核心的不等式。
定理(琴生不等式):设 是区间 上的凸函数,则对任意 和任意满足 的权重 ,有: 如果 是严格凸函数,且 不全相等,则上述不等式严格成立。对于凹函数,不等号方向相反。
证明:采用数学归纳法。
- 奠基:当 时,即为凸函数的定义,成立。
- 归纳:假设 时不等式成立。考虑 的情况。令 for ,则 。于是: 证毕。
琴生不等式有广泛的应用,下面我们用它来证明两个著名的不等式。
应用一:均值不等式
对于 个正数 ,有: 左边是调和平均,中间是几何平均,右边是算术平均。当且仅当所有 相等时取等号。
证明思路(利用凸函数):考虑函数 for ,并定义 。可以证明 是单调递增函数。注意到 是调和平均, 是几何平均, 是算术平均。由 的单调性立得 ,即均值不等式。证明 单调增的关键是证明其对数导数非负,而这可以通过验证函数 是凸函数并应用琴生不等式来完成。
应用二:赫尔德不等式与柯西-施瓦茨不等式
赫尔德不等式:设 , 且 ,则:
柯西-施瓦茨不等式:是赫尔德不等式在 时的特例: 其几何意义是向量内积不大于模长的乘积,即 ,等价于夹角余弦的绝对值不大于1。
证明思路(利用凸函数):考虑函数 ,可以证明其在 上是凹函数(因为二阶导 )。对其应用琴生不等式(注意凹函数不等号方向),并巧妙选取 和 ,经过代数整理即可得到赫尔德不等式。
import numpy as np
import matplotlib.pyplot as plt
# 示例1:验证函数的凹凸性及二阶导数判定
print("示例1:验证函数的凹凸性")
x = np.linspace(-2, 2, 400)
f_convex = x**2 # 凸函数,二阶导为2 > 0
f_concave = -x**2 # 凹函数,二阶导为-2 < 0
f_linear = 2*x + 1 # 线性函数,二阶导为0,既凸又凹
f_non = np.sin(x) # 非凸非凹函数
fig, axes = plt.subplots(2, 2, figsize=(10, 8))
functions = [f_convex, f_concave, f_linear, f_non]
titles = ['凸函数: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mi>x</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">f(x)=x^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8141em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>', '凹函数: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><msup><mi>x</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">f(x)=-x^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>', '线性函数: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mn>2</mn><mi>x</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">f(x)=2x+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">2</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>', '非凸非凹: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>sin</mi><mo></mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(x)=\sin(x)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop">sin</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span>']
for ax, func, title in zip(axes.flat, functions, titles):
ax.plot(x, func, lw=2)
# 在图像上取两点并连线,直观展示凹凸性
x1, x2 = -1.5, 1.5
y1, y2 = func[np.abs(x - x1).argmin()], func[np.abs(x - x2).argmin()]
ax.plot([x1, x2], [y1, y2], 'r--', alpha=0.6, label='弦')
ax.fill_between(x, func, func.min()-1, alpha=0.1) # 浅色填充下方区域,帮助观察“上方图”
ax.set_title(title)
ax.legend()
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
# 示例2:数值验证琴生不等式(以凸函数exp(x)为例)
print("\n示例2:数值验证琴生不等式 for f(x)=exp(x)")
np.random.seed(42)
n = 5
x_vals = np.random.uniform(0, 2, n) # 随机生成n个点
t_vals = np.random.dirichlet(np.ones(n), size=1)[0] # 随机生成一组和为1的权重
f = np.exp
lhs = f(np.sum(t_vals * x_vals)) # f(∑ t_i x_i)
rhs = np.sum(t_vals * f(x_vals)) # ∑ t_i f(x_i)
print(f"随机点 x_i: {x_vals}")
print(f"随机权重 t_i: {t_vals}")
print(f"f(∑ t_i x_i) = exp({np.sum(t_vals * x_vals):.4f}) = {lhs:.4f}")
print(f"∑ t_i f(x_i) = {rhs:.4f}")
print(f"验证:{lhs:.4f} <= {rhs:.4f} 是否成立? {lhs <= rhs + 1e-10}") # 添加微小容差
# 示例3:验证均值不等式和柯西-施瓦茨不等式
print("\n示例3:验证均值不等式与柯西-施瓦茨不等式")
a = np.array([1.0, 2.0, 3.0, 4.0, 5.0])
b = np.array([5.0, 4.0, 3.0, 2.0, 1.0])
# 均值不等式
harmonic_mean = len(a) / np.sum(1.0 / a)
geometric_mean = np.prod(a) ** (1.0/len(a))
arithmetic_mean = np.mean(a)
print(f"数组 a: {a}")
print(f"调和平均 H = {harmonic_mean:.4f}")
print(f"几何平均 G = {geometric_mean:.4f}")
print(f"算术平均 A = {arithmetic_mean:.4f}")
print(f"验证 H <= G <= A: {harmonic_mean <= geometric_mean + 1e-10 and geometric_mean <= arithmetic_mean + 1e-10}")
# 柯西-施瓦茨不等式
lhs_cs = np.dot(a, b)
rhs_cs = np.linalg.norm(a, 2) * np.linalg.norm(b, 2)
print(f"\n数组 a: {a}, 数组 b: {b}")
print(f"内积 a·b = {lhs_cs:.4f}")
print(f"||a|| * ||b|| = {rhs_cs:.4f}")
print(f"验证 |a·b| <= ||a|| ||b||: {np.abs(lhs_cs) <= rhs_cs + 1e-10}")📝 动手练一练
判断凹凸性:判断下列函数在指定区间上的凹凸性,并说明理由。 a) ,在 上。 b) ,在 上。 c) ,在 上。
参考答案: a) 凹函数。因为 在 上恒成立。 b) 非凸非凹。因为 ,在 上 (凹),在 上 (凸),在整个 上既非凸也非凹。 c) 凸函数。因为 在 上恒成立。
应用琴生不等式:已知 在 上是凸函数(请自行验证)。利用琴生不等式证明:对于正数 ,有 (即算术平均不小于几何平均)。 提示:在琴生不等式 中,取 ,并令所有权重 。
参考答案: 取 ,代入琴生不等式: 两边同时乘以 (注意不等号方向改变): 由于 是单调递增函数,因此: 证毕。
本章小结
本节我们深入探讨了函数的凹凸性,这是分析函数图形和优化问题的重要工具。
要点回顾:
- 几何本质:凸函数“弦在图像上”,凹函数“弦在图像下”。这与凸集(连接集合内任意两点的线段仍在集合内)的概念紧密相连。
- 判定方法:对于可导函数,一阶导数单调不减是凸函数的充要条件。对于二阶可导函数,直接检查二阶导数的正负即可: 凸, 凹。
- 核心性质:琴生不等式是凸函数的代数特征,它表明函数值的加权平均不小于平均值的函数值。这个不等式是证明许多重要结论的利器。
- 经典应用:利用凸函数性质和琴生不等式,可以优雅地证明均值不等式、赫尔德不等式和柯西-施瓦茨不等式。
行动清单:
- 可视化练习:任选几个常见函数(如 ),用绘图工具画出其图像,并取两点连线,直观感受其凹凸性。
- 判定练习:找几个复杂一点的函数,练习使用二阶导数判定法判断其在给定区间上的凹凸性。
- 不等式推导:尝试独立完成用琴生不等式证明算术-几何平均不等式的推导过程,加深对凸函数应用的理解。
— 小象教研组
- 第6章讲义:泰勒公式(PDF · 5.1MB)下载
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加课程顾问,免费获取网盘下载链接
微信扫码添加顾问