Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

eqnproblem

创建方程问题

自 R2019b 起

说明

使用 eqnproblem 创建一个方程问题。

提示

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

示例

prob = eqnproblem 用默认属性创建一个方程问题。

示例

prob = eqnproblem(Name,Value) 使用一个或多个名称-值对组参数指定其他选项。例如,您可以在构造问题时使用 Equations 名称来指定方程。

示例

全部折叠

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

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 Expressions将非线性函数转换为优化表达式

x 是 2×2 矩阵时,方程

x3=[1234]

是多项式方程组。此处,x3 表示使用矩阵乘法的 x*x*x。您可以使用基于问题的方法轻松地构造和求解此方程组。

首先,将变量 x 定义为一个 2×2 矩阵变量。

x = optimvar('x',2,2);

使用 x 定义要求解的方程。

eqn = x^3 == [1 2;3 4];

用此方程创建一个方程问题。

prob = eqnproblem('Equations',eqn);

[1 1;1 1] 点开始求解问题。

x0.x = ones(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.
sol = struct with fields:
    x: [2x2 double]

检查解。

disp(sol.x)
   -0.1291    0.8602
    1.2903    1.1612

显示解的立方。

sol.x^3
ans = 2×2

    1.0000    2.0000
    3.0000    4.0000

输入参数

全部折叠

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: prob = eqnproblem('Equations',eqn)

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

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

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

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

数据类型: char | string

输出参数

全部折叠

方程问题,以 EquationProblem 对象形式返回。通常,要完成问题描述,您需要指定 prob.Equations,对于非线性方程,还需要指定初始点结构体。通过调用 solve 求解完整的问题。

警告

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

版本历史记录

在 R2019b 中推出