2026a

# EquationProblem


非线性方程组

函数库: TyOptimization

# 说明

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

提示

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

# 创建结构体

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

警告

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

# 属性

Equations — 问题方程
NamedTuple() (默认) | OptimizationEquality | 以 OptimizationEquality 作为字段的具名元组

问题方程,指定为 OptimizationEquality 或以 OptimizationEquality 作为字段的具名元组。

示例: @fcn2expr(sum(x.^2,2) == 4,x),其中 x 是 OptimizationVariable。

Description — 问题标签
"" (默认) | 字符串

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

示例: "Problem 1"

Variables — 问题中的优化变量
OptimizationVariable

问题中的优化变量,指定为 OptimizationVariable 构成的向量。

# 示例

基于问题求解非线性方程组

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

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

using TyOptimization
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, 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

点开始求解问题。对于基于问题的方法,将初始点指定为具名元组,并将变量名称作为元组的字段。对于此问题,只有一个变量,即 x。

x0 = (;x = [0 0])
sol,fval,exitflag = Solve(prob,x0)
sol = 
(x = [0.3532465619167724, 0.6060820265081073],)

fval = 
2-element Vector{Float64}:
 -2.406924060061044e-7
 -3.8257579881850745e-8

exitflag =
1

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

eq1 = @fcn2expr(exp(-exp(-(x[1] + x[2]))),x) == x[2]*(1 + x[1]^2)
eq2 = @fcn2expr(x[1]*cos(x[2]) + x[2]*sin(x[1]),x) == 1/2

# 另请参阅

eqnproblem | optimvar | OptimizationEquality | @fcn2expr