How to| 进行约束非线性优化
优化问题的一个重要子集是约束非线性优化,这时的函数为非线性,参数值被限制在某些区域. Wolfram 语言能够解决这类问题以及其它各种优化问题.
一个简单的优化问题是求
的最大值,并使得点
在以原点为圆心的单位圆内. Maximize 的第一个参数将函数和约束置于一个列表中;第二个参数列出变量:
sol = Maximize[{y^2 - x, x^2 + y^2 ≤ 1}, {x, y}]这个输出是一个列表,第一个元素是得到的最大值;第二个元素 sol[[2]] 是给出这个最大值的独立变量值的规则列表. 符号 sol[[2]] 是 Part[sol,2] 的缩写形式:
sol[[2]]通过将解代回原始问题,可以检查结果是否满足约束条件. 要这样做,将 /.sol[[2]] 跟在原始问题后面. 符号 /. 是 ReplaceAll 的缩写形式:
{y^2 - x, x^2 + y^2 ≤ 1} /. sol[[2]]Minimize[{Cos[x] + x / 2, 0 < x < 10}, x]可以用 N 看到结果的小数近似:
N[%]如果您的目标是得到数值结果,从一开始就使用数值版本的 NMinimize 和 NMaximize 会更加有效. 注意NMinimize 和 NMaximize 使用数值算法,给出的结果可能会不属于全局最优解:
NMinimize[{Cos[x] + x / 2, 0 < x < 10}, x]Maximize 和 Minimize 对要优化的表达式进行符号式分析,给出经证实的全局最优. 如果您的表达式不能通过符号技术分析,NMaximize 和 NMinimize 将更加有用和高效.
这是一个不能使用 Maximize 和 Minimize 的简单表达式,因为 NIntegrate 当参数
非数时不进行计算:
NIntegrate[Cos[q x] / q, {x, 0, 4Pi}]这是一个该表达式的函数,您可以使用 NMinimize. 参数上的 ?NumericQ 可以防止函数在
非数值时计算 NIntegrate . ? 是 PatternTest 的缩写形式:
f[q_ ? NumericQ] := NIntegrate[Cos[q * x] / q, {x, 0, 4Pi}]可以使用 NMinimize 和 NMaximize 来实现数值优化. 第二个参数给出
两个始值来求斜率:
NMinimize[{f[q], q > 1}, {q, 1, 2}]NMinimize、NMaximize、Minimize 和 Maximize 求全局最小值或最大值. 有时更快的函数 FindMinimum 和 FindMaximum 求局部最小值或最大值:
FindMaximum[{100 / ((x - 1)^2 + (y - 4)^2 + 1) + 200 / ((x + 1)^2 + (y + 2)^2 + 1) }, {{x, 2}, y}]NMaximize[{ 100 / ((x - 1)^2 + (y - 4)^2 + 1) + 200 / ((x + 1)^2 + (y + 2)^2 + 1) }, {{x, 1, 2}, y}]一类常见的优化问题是求使得曲线和数据之间误差最小的参数. 这个例子调用 FindFit 来求这些数据点的二次拟合:
dat = {{0, -1.144}, {1, -0.924}, {2, 3.70}, {3, 12.72}, {4, 26.14}, {5, 43.96}};FindFit 的参数是数据、表达式、它的参数列表和变量. 这里对问题求解:
fit1 = FindFit[dat,
a(x - b)(x - c),
{a, b, c},
x]您可以添加约束. 例如,假设所有参数必须为正;将这些约束与表达式放在一个列表中:
fit2 = FindFit[dat,
{a(x - b)(x - c), a > 0, b > 0, c > 0},
{a, b, c},
x]Plot[{a(x - b)(x - c) /. fit1, a(x - b)(x - c) /. fit2}, {x, 0, 5},
Epilog -> (Map[Point, dat]), PlotStyle -> {Red, Blue}]