Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

EquationProblem

非线性方程组

说明

使用优化变量指定方程组,并使用 solve 求解该方程组。

提示

有关完整的工作流,请参阅Problem-Based Workflow for Solving Equations

创建对象

使用 eqnproblem 函数创建一个 EquationProblem 对象。通过创建 OptimizationEquality 对象并将它们设置为 EquationProblem 对象的 Equations 属性,将方程添加到问题中。

prob = eqnproblem;
x = optimvar('x');
eqn = x^5 - x^4 + 3*x == 1/2;
prob.Equations.eqn = eqn;

警告

基于问题的方法不支持目标函数、非线性等式或非线性不等式中使用复数值。如果某函数计算具有复数值,即使是作为中间值,最终结果也可能不正确。

属性

全部展开

问题方程,指定为 OptimizationEquality 数组或以 OptimizationEquality 数组作为字段的结构体。

示例: sum(x.^2,2) == 4

问题标签,指定为字符串或字符向量。该软件不使用 Description 进行计算。Description 是任意标签,您可以将其用于任意目的。例如,您可以共享、存档或呈现模型或问题,并在 Description 中存储关于模型或问题的描述性信息。

示例: "An iterative approach to the Traveling Salesman problem"

数据类型: char | string

此属性为只读

对象中的优化变量,指定为 OptimizationVariable 对象的结构体。

数据类型: struct

对象函数

optimoptions创建优化选项
prob2struct将优化问题或方程问题转换为求解器形式
show显示有关优化对象的信息
solve求解优化问题或方程问题
varindex将问题变量映射到基于求解器的变量索引
write保存优化对象描述

示例

全部折叠

要使用基于问题的方法求解非线性方程组

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

请首先将 x 定义为一个二元素优化变量。

x = optimvar('x',2);

创建第一个方程作为优化等式表达式。

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

同样,创建第二个方程作为优化等式表达式。

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

创建一个方程问题,并将这些方程放入该问题中。

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

检查此问题。

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp(-exp(-(x(1) + x(2)))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

[0,0] 点开始求解问题。对于基于问题的方法,将初始点指定为结构体,并将变量名称作为结构体的字段。对于此问题,只有一个变量,即 x

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

查看解点。

disp(sol.x)
    0.3532
    0.6061

不受支持的函数要求 fcn2optimexpr

如果方程函数不是由初等函数组成的,您必须使用 fcn2optimexpr 将函数转换为优化表达式。对于本示例:

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

请参阅Supported Operations for Optimization Variables and ExpressionsConvert Nonlinear Function to Optimization Expression

在 R2019b 中推出