求解非线性方程组
这个例子演示了如何使用面向问题的方法求解非线性方程组。
我们将使用[跳转的功能。jl]图书馆(https://github.com/jump-dev/JuMP ...jl)用于优化问题的制定和非线性优化的库Ipopt.jl。
安装库
如果您的环境中未安装最新版本的软件包 JuMP,取消注释并运行下面的单元格:
In [ ]:
Pkg.add(["Ipopt", "JuMP"])
In [ ]:
#Pkg.add("JuMP");
要在安装完成后启动新版本的库,请单击"个人帐户"按钮:
然后点击"停止"按钮:
通过单击"Start Engee"按钮重新启动会话:
任务说明
我们会找到解决方案的 和 对于下面介绍的非线性方程组,使用面向问题的方法:
\begin{cases}exp(-exp(-(x_1+x_2)))=x_2(1+x_1^2)\\x_1cos(x_2)+x_2sin(x_1)={\frac{{1}}{2}}\结束
连接图书馆
连接库 JuMP:
In [ ]:
using JuMP;
连接非线性求解器的库 Ipopt:
In [ ]:
using Ipopt;
创建优化任务
使用函数创建优化任务 Model() 并在括号中指定求解器的名称。:
In [ ]:
sys_prob = Model(Ipopt.Optimizer)
Out[0]:
创建变量 x 包含两个值 – 和 :
In [ ]:
@variable(sys_prob, x[1:2]);
使用宏设置第一个非线性条件 @NLconstraint:
In [ ]:
@NLconstraint(sys_prob, exp(-exp(-(x[1] + x[2]))) == x[2] * (1 + x[1]^2))
Out[0]:
使用宏设置第二个非线性条件 @NLconstraint:
In [ ]:
@NLconstraint(sys_prob, x[1] * cos(x[2]) + x[2] * sin(x[1]) == 1/2)
Out[0]:
为优化变量设置初始值有助于更有效地管理优化过程。 从点开始解决问题 [0,0]. 为此,请使用函数 set_start_value() 并设置初始值 $x_1$ 和 $x_2$:
In [ ]:
set_start_value(x[1], 0.0);
set_start_value(x[2], 0.0);
求解优化问题
解决优化问题:
In [ ]:
optimize!(sys_prob)
保存值 x 在变量中:
In [ ]:
sol_x = value.(x);
输出优化结果:
In [ ]:
println("Solution: x = ", sol_x)
我们为非线性方程组找到的解:
结论
在这个例子中,我们使用面向问题的方法找到了非线性方程组的解决方案。 我们用了图书馆 JuMP 用于我们的问题的公式化和非线性求解器的库 Ipopt 找到问题的解决方案。