使用 Optimization Toolbox 进行基于问题的优化
使用自然语法来定义和求解优化问题、最小二乘问题以及非线性方程组。
| 1.定义问题 |
|---|
按照基于问题的工作流,首先使用 示例: assignmentProb = optimproblem responseProb = optimproblem initialStateProb = eqnproblem |
| 2.定义变量 |
|---|
使用 示例: x = optimvar("x");
y = optimvar("y");
employees = ["a","b","c"];
tasks = ["t1","t2","t3"];
assign = optimvar("assign",employees,tasks,"LowerBound",0,"UpperBound",1,"Type","integer")
|
| 3.定义要在目标、约束和方程中使用的表达式 | |
|---|---|
使用支持的运算直接指定 示例: response = -3*(y - x.^3 - x).^2 - (x - 4/3).^2; totalCost = sum(sum(cost.*assign)); sumByEmployee = sum(assign,2); sumByTask = sum(assign,1); |
使用 示例: a = 4; xyfcn = @(x,y,a)gamma(y)*a*x.^2; xyexpr = fcn2optimexpr(xyfcn,x,y,a); |
| 4.定义目标 | |
|---|---|
设置优化方向。使用标量 |
示例: responseProb.ObjectiveSense = "maximize"; responseProb.Objective = response; assignmentProb.ObjectiveSense = "minimize"; assignmentProb.Objective = totalCost; |
| 5.定义约束和方程 |
|---|
将 示例: responseProb.Constraints.ellipse = x.^2/2 + y.^2/4 <= 1; responseProb.Constraints.xyconstr = xyexpr >= 1; assignmentProb.Constraints.oneTaskPerEmployee = sumByTask <= 1; assignmentProb.Constraints.oneEmployeePerTask = sumByEmployee == 1; initialStateProb.Equations.eq1 = x*cos(y) + y*sin(x) == 1/2; initialStateProb.Equations.eq2 = exp(-exp(-(x + y))) == y*(1 + x^2); |
| 6.审核 | |
|---|---|
使用 show 和 showbounds 进行显示。使用 write 和 writebounds 写入到一个文件。
|
使用工作区浏览器查看。
|
| 7.求解和分析 | |
|---|---|
求解问题;对于非线性问题,需要提供初始点。 示例: x0.x = 0; x0.y = 0; [sol,fval,exitflag] = solve(responseProb,x0)
|
使用优化选项进行求解。 示例: o = optimoptions(assignmentProb,"MaxTime",10); sol = solve(assignmentProb,"Options",o) 进阶操作
|