求解非线性方程组¶
本例演示如何使用基于问题的方法求解非线性方程组。
安装库¶
如果您的环境中没有安装最新版本的JuMP
软件包,请取消注释并运行下面的方框:
In [ ]:
Pkg.add(["Ipopt", "JuMP"])
In [ ]:
#Pkg.add("JuMP");
要在安装完成后启动新版本的程序库,请单击 "我的账户 "按钮:
然后点击 "停止 "按钮:
按下 "Start Engee "按钮重新启动会话:
任务描述¶
让我们采用问题导向法,为下面的非线性方程组找出解$x_1$ 和$x_2$ :
\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}}\end{cases}
连接库¶
连接图书馆JuMP
:
In [ ]:
using JuMP;
连接非线性求解器库Ipopt
:
In [ ]:
using Ipopt;
创建优化问题¶
使用函数Model()
创建一个优化问题,并在括号中指定求解器的名称:
In [ ]:
sys_prob = Model(Ipopt.Optimizer)
Out[0]:
创建一个变量x
,其中包含两个值 -$x_1$ 和$x_2$ :
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)
我们为非线性方程组找到的解:
$$x_1 = 0.35324661959670156$$ $$x_2 = 0.6060817366414603$$
结论¶
在本例中,我们采用了一种以问题为导向的方法,找到了一个非线性方程组的解。我们使用JuMP
库提出问题,并使用非线性求解器库Ipopt
找到问题的解决方案。