主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

EquationProblem

非线性方程系统

说明

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

提示

有关完整的工作流,请参阅基于问题的方程求解工作流

创建对象

使用 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

对象函数

evaluate计算问题中的优化表达式或目标和约束
issatisfied优化问题在一组点上的约束约束
optimoptions创建优化选项
prob2struct将优化问题或方程问题转换为求解器形式
show显示有关优化对象的信息
solve求解优化问题或方程问题
solvers确定优化问题或方程问题的默认和有效求解器
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.

<stopping criteria details>
sol = struct with fields:
    x: [2×1 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;

请参阅优化变量和表达式支持的运算将非线性函数转换为优化表达式

创建一组包含两个优化变量的方程。

x = optimvar("x");
y = optimvar("y");
prob = eqnproblem;
prob.Equations.eq1 = x^2 + y^2/4 == 2;
prob.Equations.eq2 = x^2/4 + 2*y^2 == 2;

x=1,y=1/2 开始解方程组。

x0.x = 1;
x0.y = 1/2;
sol = 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.

<stopping criteria details>
sol = struct with fields:
    x: 1.3440
    y: 0.8799

在点 x0sol 处求方程。

vars = optimvalues(prob,x=[x0.x sol.x],y=[x0.y sol.y]);
vals = evaluate(prob,vars)
vals = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0.9375 8.4322e-10]
    eq2: [1.2500 6.7431e-09]

第一个点 x0 对于方程 eq1eq2 都有非零值。第二点 sol 这些方程的值几乎为零,正如预期的那样,这是一个解。

使用 issatisfied 查找方程的满足度。

[satisfied details] = issatisfied(prob,vars)
satisfied = 1×2 logical array

   0   1

details = 
  1×2 OptimizationValues vector with properties:

   Variables properties:
      x: [1 1.3440]
      y: [0.5000 0.8799]

   Equation properties:
    eq1: [0 1]
    eq2: [0 1]

第一个点 x0 不是解,并且 satisfied 该点的 0。第二点 sol 是一个解,且该点的 satisfied1。方程属性表明,在第一点处两个方程都不满足,在第二点处两个方程均满足。

版本历史记录

在 R2019b 中推出

全部展开