凸函数的定义、性质以及判别

    凸函数有很好的极值性质,这使其在非线性规划中占有重要的地位。凹函数与凸函数相似,凸函数具有全局极小值,凹函数具有全局极大值。因为两者很方便进行转换,我们以凸函数为例作介绍。

1. 凸函数的定义

    要定义凸函数,首先必须要对凸集有所了解。

    凸集  给定集合以及其中的任意两个元素,即,若对任意实数,恒有

                         

    则称为凸集。

    凸函数  设 为定义在n维欧氏空间 中某个凸集 上的函数,若对任意实数以及 中的任意两点,恒有

                        

    则称为定义在凸集上的凸函数。

            如对每一个以及上任意两点  ,恒有

                        

    则称为定义在凸集上的严格凸函数。

    线性函数既是凸函数又是凹函数,但都不是严格凸函数和严格凹函数。

2. 凸函数的性质

    性质1  设为定义在凸集上的凸函数,则对任意实数 ,函数 也是定义在凸集上的凸函数。

    性质2  设 都是定义在凸集上的凸函数,则函数也是定义在凸集上的凸函数。

    性质3  设为定义在凸集上的凸函数,则对任意实数,集合是凸集。

    性质4  设为定义在凸集上的凸函数,则的任一个极小点就是它在上的全局极小点,而且所有极小点的集合是凸集。


3. 凸函数的判别

    判断一个函数是否为凸函数,最基本的方法是使用其定义。但对可微函数,下面介绍的两个判定定理可能更为有效。

    一阶判定条件  设在凸集上具有一阶连续偏导数,则上凸函数的充分必要条件是,对中任意两点,恒有

                     

    二阶判定条件  设在开凸集上具有二阶连续偏导数,则上凸函数的充分必要条件是,的海赛矩阵上处处半正定。

### 凸集的定义性质 #### 定义 设 \( D \subseteq R^n \),如果对于所有的 \( x, y \in D \) 和所有满足 \( 0 \leqslant \lambda \leqslant 1 \) 的实数 \( \lambda \),都有: \[ \lambda x + (1-\lambda)y \in D \] 则称集合 \( D \) 是凸集[^1]。 #### 性质 - **交集性质**:有限个(或者无限个)凸集的交集为凸集。 - **缩放性质**:假设 \( D \) 是凸集,\( \beta \) 是一个实数,则下面的集合是凸集: \[ \beta * D=\{y | y=\beta * x, x \in D\} \] ### 凸函数定义性质 #### 定义 给定区间 \( I \subset R \),若对任何两个点 \( a,b \in I \) 及任意 \( t \in [0,1] \),有: \[ f(ta+(1-t)b)\le tf(a)+(1-t)f(b) \] 则称 \( f(x) \) 在 \( I \) 上为凸函数。这表示连接图像上任两点间的线段总位于这两点间部分图形之上[^5]。 对于多元函数而言,在其定义域内的每一点处都存在这样的不等关系也成立的话,该多变量函数即被视作凸函数[^3]。 #### 判别方法 通过计算二阶导数来判断一元函数是否为凸函数或凹函数。具体来说,当一个函数的一阶导数单调增加时,此函数为凸函数;反之亦然。更进一步地讲,如果某连续可微分函数在其整个定义区域内具有非负的二阶导数值,则它必然是一个严格意义上的凸函数[^2]。 ```python import numpy as np from sympy import symbols, diff def is_convex(f_str): """ Check if the given function string represents a convex function by evaluating its second derivative. :param f_str: A string representing mathematical expression of one variable 'x' :return: Boolean indicating whether the inputted function is convex or not """ x = symbols('x') try: # Convert string to SymPy symbolic object and compute derivatives func = eval(f_str) first_derivative = diff(func, x) second_derivative = diff(first_derivative, x) # Evaluate sign of second derivative over domain where it's defined test_points = [-10, -1, 0, 1, 10] signs = all([second_derivative.subs({x:test_point}) >= 0 for test_point in test_points]) return bool(signs) except Exception as e: print(e) return False print(is_convex('-np.log(x)')) # Example usage with concave log function negated into convex form ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值