本文将介绍如何使用Python求解多元函数条件极值

一、Numpy和Scipy

要求解多元函数的条件极值,需要使用到Python的Numpy和Scipy库。

import numpy as np
from scipy.optimize import minimize

Numpy库用于处理多维数组和矩阵运算;Scipy库提供了许多数学优化方面的函数,其中minimize函数可以求解多元函数的极值。

首先,我们需要定义一个多元函数并将其封装成一个Python函数:

def f(x):
    return x[0]**2 + x[1]**2

上面这个函数是一个简单的二次函数,它的参数是一个长度为2的列表x,返回值是x[0]和x[1]的平方之和。

下面我们使用minimize函数求解这个函数的条件极值,比如限制条件是x[0]+x[1]=1:

def constraint(x):
    return x[0] + x[1] - 1
    
cons = {'type': 'eq', 'fun': constraint}
x0 = np.array([0.5, 0.5])
res = minimize(f, x0, constraints=cons)

上面的代码中,我们首先定义了一个约束函数constraint,这个函数返回值是x[0]+x[1]-1,表示约束条件。然后,我们使用一个字典cons来定义限制类型是’eq’(等式约束),限制函数是constraint。接着,我们定义了初始值x0为[0.5, 0.5],然后使用minimize函数(第一个参数是我们要求解的函数f,第二个参数是初始值x0,第三个参数是存放限制条件的字典cons)来求解条件极值,并将结果存放在res变量中。

最后,我们使用print函数输出求解结果:

print(res)

运行这段代码,我们可以得到求解结果:

     fun: 0.25
     jac: array([0.5, 0.5])
 message: 'Optimization terminated successfully.'
    nfev: 3
     nit: 1
    njev: 1
  status: 0
 success: True
       x: array([0.5, 0.5])

其中,’fun’字段是函数的最小值,’x’字段是使函数最小值的参数。

二、带限制的复杂函数

上面的例子都是一个很简单的函数,没有太多的实际应用意义。下面,我们来看一个带限制的复杂函数:

def f(x):
    return -(x[0] + x[1] + x[2])

def constraint1(x):
    return x[0]**2 + x[1]**2 + x[2]**2 - 25
    
def constraint2(x):
    return x[0] * x[1] * x[2] - 7.5

cons = [{'type': 'ineq', 'fun': constraint1}, {'type': 'eq', 'fun': constraint2}]
x0 = np.array([1, 1, 1])
res = minimize(f, x0, constraints=cons)
print(res)

上面这个函数是一个三元函数,我们要求它的最大值。它有两个限制条件,第一个限制条件是x[0]**2+x[1]**2+x[2]**2<=25,第二个限制条件是x[0]*x[1]*x[2]-7.5=0。

我们同样使用minimize函数来进行求解,不同的是,这次我们将两个限制条件都存放在一个字典列表cons中,第一个限制条件类型是’ineq’(不等式约束),第二个限制条件类型是’eq’(等式约束)。

最后,我们得到的求解结果是最大值为-10.506…,使其最大值的参数是[1.5, 1.5, 1.5]。

三、使用Sympy库进行求解

除了使用Scipy库进行求解外,还可以使用Sympy库进行求解。

首先,我们需要定义一个符号函数:

from sympy import *
init_printing()

x, y = symbols('x y')
f = x**2 + y**2

上面的代码中,我们定义了两个符号变量x和y,并使用symbols函数将其转换成为符号变量。

然后,我们可以使用sympy.diff函数来求取函数的偏导数(用于求取极值点):

fx = diff(f, x)
fy = diff(f, y)

等式函数的式子则可以使用sympy.Eq函数定义:

g = Eq(x + y - 1, 0)

接下来,我们将方程组联立起来:

eqs = [fx, fy, g]

最后,我们使用sympy.solve函数求解方程组:

sol = solve(eqs)
print(sol)

运行这段代码,我们可以得到求解结果:

{x: 1/2, y: 1/2}

其中,x和y分别是函数的极值点在x轴和y轴上的位置。

四、小结

本文介绍了如何使用Python和Scipy库或Sympy库来求解多元函数的条件极值问题。我们还以一个带限制的复杂函数作为例子,来说明在实际问题中如何使用这些库来进行求解。总之,这些库都拥有强大的优化功能,可以满足大部分优化问题的求解需要。