How to| 进行约束非线性优化

优化问题的一个重要子集是约束非线性优化,这时的函数为非线性,参数值被限制在某些区域. Wolfram 语言能够解决这类问题以及其它各种优化问题.

一个简单的优化问题是求 的最大值,并使得点 在以原点为圆心的单位圆内. Maximize 的第一个参数将函数和约束置于一个列表中;第二个参数列出变量:

In[1]:=
Click for copyable input
Out[1]=

这个输出是一个列表,第一个元素是得到的最大值;第二个元素 是给出这个最大值的独立变量值的规则列表. 符号 Part[sol,2] 的缩写形式:

In[2]:=
Click for copyable input
Out[2]=

通过将解代回原始问题,可以检查结果是否满足约束条件. 要这样做,将 跟在原始问题后面. 符号 ReplaceAll 的缩写形式:

In[3]:=
Click for copyable input
Out[3]=

许多优化问题涉及到求一些函数的最小值:

In[4]:=
Click for copyable input
Out[4]=

可以用 N 看到结果的小数近似:

In[5]:=
Click for copyable input
Out[5]=
    

如果您的目标是得到数值结果,从一开始就使用数值版本的 NMinimizeNMaximize 会更加有效. 注意NMinimizeNMaximize 使用数值算法,给出的结果可能会不属于全局最优解:

In[1]:=
Click for copyable input
Out[1]=

MaximizeMinimize 对要优化的表达式进行符号式分析,给出经证实的全局最优. 如果您的表达式不能通过符号技术分析,NMaximizeNMinimize 将更加有用和高效.

这是一个不能使用 MaximizeMinimize 的简单表达式,因为 NIntegrate 当参数 非数时不进行计算:

In[2]:=
Click for copyable input
Out[2]=

这是一个该表达式的函数,您可以使用 NMinimize. 参数上的 ?NumericQ 可以防止函数在 非数值时计算 NIntegrate . PatternTest 的缩写形式:

In[3]:=
Click for copyable input

可以使用 NMinimizeNMaximize 来实现数值优化. 第二个参数给出 两个始值来求斜率:

In[4]:=
Click for copyable input
Out[4]=

NMinimizeNMaximizeMinimizeMaximize 求全局最小值或最大值. 有时更快的函数 FindMinimumFindMaximum 求局部最小值或最大值:

In[5]:=
Click for copyable input
Out[5]=
In[6]:=
Click for copyable input
Out[6]=
    

一类常见的优化问题是求使得曲线和数据之间误差最小的参数. 这个例子调用 FindFit 来求这些数据点的二次拟合:

In[1]:=
Click for copyable input

FindFit 的参数是数据、表达式、它的参数列表和变量. 这里对问题求解:

In[2]:=
Click for copyable input
Out[2]=

您可以添加约束. 例如,假设所有参数必须为正;将这些约束与表达式放在一个列表中:

In[3]:=
Click for copyable input
Out[3]=

这里比较两种拟合. 两者非常接近,但 很小时除外:

In[4]:=
Click for copyable input
Out[4]=