How to| 进行约束非线性优化
优化问题的一个重要子集是约束非线性优化,这时的函数为非线性,参数值被限制在某些区域. Wolfram 语言能够解决这类问题以及其它各种优化问题.
一个简单的优化问题是求 的最大值,并使得点 在以原点为圆心的单位圆内. Maximize 的第一个参数将函数和约束置于一个列表中;第二个参数列出变量:
这个输出是一个列表,第一个元素是得到的最大值;第二个元素 sol[[2]] 是给出这个最大值的独立变量值的规则列表. 符号 sol[[2]] 是 Part[sol,2] 的缩写形式:
通过将解代回原始问题,可以检查结果是否满足约束条件. 要这样做,将 /.sol[[2]] 跟在原始问题后面. 符号 /. 是 ReplaceAll 的缩写形式:
可以用 N 看到结果的小数近似:
如果您的目标是得到数值结果,从一开始就使用数值版本的 NMinimize 和 NMaximize 会更加有效. 注意NMinimize 和 NMaximize 使用数值算法,给出的结果可能会不属于全局最优解:
Maximize 和 Minimize 对要优化的表达式进行符号式分析,给出经证实的全局最优. 如果您的表达式不能通过符号技术分析,NMaximize 和 NMinimize 将更加有用和高效.
这是一个不能使用 Maximize 和 Minimize 的简单表达式,因为 NIntegrate 当参数 非数时不进行计算:
这是一个该表达式的函数,您可以使用 NMinimize. 参数上的 ?NumericQ 可以防止函数在 非数值时计算 NIntegrate . ? 是 PatternTest 的缩写形式:
可以使用 NMinimize 和 NMaximize 来实现数值优化. 第二个参数给出 两个始值来求斜率:
NMinimize、NMaximize、Minimize 和 Maximize 求全局最小值或最大值. 有时更快的函数 FindMinimum 和 FindMaximum 求局部最小值或最大值: