基于问题的方程求解工作流
注意
Optimization Toolbox™ 提供两种求解方程的方法。本主题描述基于问题的方法。基于求解器的优化问题设置描述基于求解器的方法。
要求解方程组,请执行以下步骤。
使用
eqnproblem
创建一个方程问题对象。问题对象是一个容器,您可以在其中定义方程。方程问题对象将定义问题和问题变量中存在的任何边界。例如,创建一个方程问题。
prob = eqnproblem;
使用
optimvar
创建命名变量。优化变量是用于描述方程的符号变量。在变量定义中包含任何边界。例如,创建一个名为
'x'
的 15×3 变量数组,其下界为0
,上界为1
。x = optimvar('x',15,3,'LowerBound',0,'UpperBound',1);
使用问题变量定义方程。例如:
sumeq = sum(x,2) == 1; prob.Equations.sumeq = sumeq;
注意
如果您的非线性函数不是由多项式、有理式和初等函数(如
exp
)组成的,可以使用fcn2optimexpr
将其转换为优化表达式。请参阅将非线性函数转换为优化表达式和优化变量和表达式支持的运算。如有必要,在方程中包含额外参数作为工作区变量;请参阅在基于问题的方法中传递额外的参数。
对于非线性问题,将初始点设置为结构体,其字段是优化变量名称。例如:
x0.x = randn(size(x)); x0.y = eye(4); % Assumes y is a 4-by-4 variable
使用
solve
求解问题。sol = solve(prob); % Or, for nonlinear problems, sol = solve(prob,x0)
除了这些基本步骤之外,您还可以在求解问题之前使用 show
或 write
来回顾问题定义。使用 optimoptions
设置 solve
的选项,如 更改默认求解器或选项 中所述。
警告
基于问题的方法不支持在目标函数、非线性等式和非线性不等式中使用复数值。如果某函数计算具有复数值,即使是作为中间值,最终结果也可能不正确。
注意
一个优化问题中的所有名称必须具有唯一性。具体来说,所有变量名称、目标函数名称和约束函数名称都不能相同。
有关具有多项式的基本方程求解示例,请参阅基于问题求解多项式非线性方程组。对于一般的非线性示例,请参阅基于问题求解非线性方程组。有关更多扩展示例,请参阅非线性方程组。
另请参阅
fcn2optimexpr
| optimvar
| solve
| optimoptions
| eqnproblem
| show
| write