上一篇
SymPy简介与安装
SymPy是一个纯Python编写的符号计算库,用于代数运算、微积分、离散数学等数学领域。与数值计算库不同,SymPy能够进行精确的符号计算并保留数学表达式形式。
安装SymPy: 使用pip安装SymPy非常简单,只需在命令行中运行:
pip install sympy
一元函数求极值
求解一元函数极值的基本步骤:
- 定义符号变量和函数表达式
- 计算函数的一阶导数
- 求解导数为零的方程,得到临界点
- 使用二阶导数判断临界点的极值类型
- 计算函数在临界点的取值
示例:求函数 f(x) = x³ - 6x² + 9x + 1 的极值
from sympy import symbols, diff, solve, Eq
# 定义符号变量和函数
x = symbols('x')
f = x**3 - 6*x**2 + 9*x + 1
# 计算一阶导数
f_prime = diff(f, x)
# 求导数为零的点
critical_points = solve(Eq(f_prime, 0), x)
# 计算二阶导数
f_double_prime = diff(f_prime, x)
# 判断极值类型并计算函数值
results = []
for point in critical_points:
# 计算二阶导数值
second_deriv_value = f_double_prime.subs(x, point)
# 判断极值类型
if second_deriv_value > 0:
extremum_type = "极小值"
elif second_deriv_value < 0:
extremum_type = "极大值"
else:
extremum_type = "可能为鞍点,需进一步检查"
# 计算函数值
f_value = f.subs(x, point)
results.append((point, extremum_type, f_value))
# 输出结果
for point, etype, fval in results:
print(f"临界点 x = {point}: {etype}, f(x) = {fval}")
运行结果:
临界点 x = 1: 极大值, f(x) = 5
临界点 x = 3: 极小值, f(x) = 1
多元函数求极值
对于多元函数,求极值需要以下步骤:
- 定义多个符号变量和函数表达式
- 分别计算函数对各个变量的偏导数
- 求解所有偏导数同时为零的方程组,得到临界点
- 使用Hessian矩阵判断临界点的极值类型
- 计算函数在临界点的取值
示例:求函数 f(x, y) = x³ + y³ - 3x - 12y + 20 的极值
from sympy import symbols, diff, solve, Eq, Matrix
# 定义符号变量
x, y = symbols('x y')
f = x**3 + y**3 - 3*x - 12*y + 20
# 计算偏导数
f_x = diff(f, x)
f_y = diff(f, y)
# 求解临界点
critical_points = solve([Eq(f_x, 0), Eq(f_y, 0)], (x, y))
# 计算二阶偏导数
f_xx = diff(f_x, x)
f_yy = diff(f_y, y)
f_xy = diff(f_x, y)
# 构建Hessian矩阵
hessian = Matrix([[f_xx, f_xy], [f_xy, f_yy]])
# 分析每个临界点
results = []
for point in critical_points:
# 解包临界点
x_val, y_val = point
# 计算Hessian矩阵在临界点的行列式值
det_hessian = hessian.det().subs({x: x_val, y: y_val})
# 计算f_xx在临界点的值
f_xx_val = f_xx.subs({x: x_val, y: y_val})
# 判断极值类型
if det_hessian > 0:
if f_xx_val > 0:
extremum_type = "极小值"
else:
extremum_type = "极大值"
elif det_hessian < 0:
extremum_type = "鞍点"
else:
extremum_type = "不确定"
# 计算函数值
f_value = f.subs({x: x_val, y: y_val})
results.append((x_val, y_val, extremum_type, f_value))
# 输出结果
for x_val, y_val, etype, fval in results:
print(f"临界点 ({x_val}, {y_val}): {etype}, f(x,y) = {fval}")
运行结果:
临界点 (1, 2): 鞍点, f(x,y) = 28
临界点 (1, -2): 极大值, f(x,y) = 36
临界点 (-1, 2): 极小值, f(x,y) = 20
临界点 (-1, -2): 鞍点, f(x,y) = 28
实际应用场景
SymPy求极值在多个领域有广泛应用:
经济学:利润最大化
企业利润函数:P(x) = R(x) - C(x),其中R(x)为收入函数,C(x)为成本函数
P(x) = 50x - 0.1x² - (1000 + 10x)
物理学:势能最小化
分子势能函数:V(r) = D(1 - e^{-a(r-r₀)})²
V(r) = 4ε[(σ/r)^12 - (σ/r)^6] (Lennard-Jones势能函数)
工程学:优化设计
圆柱体最小表面积:给定体积V,求半径r和高度h使表面积最小
S(r,h) = 2πr² + 2πrh 约束条件:πr²h = V
发表评论