带约束的非线性方程组 -凯发k8网页登录
求解具有不等式约束的方程
fsolve
求解非线性方程组。但是,它不允许您包含任何约束,甚至是边界约束。那么,如何求解带约束的非线性方程组?
满足您的约束的解不一定存在。事实上,此问题可能没有任何解,哪怕是不满足约束的解。然而,有一些方法可以帮助您搜索满足约束的解。
为了说明这些方法,假设要设法求解以下方程
其中 的分量必须为非负值。这些方程有四个解:
只有一个解满足约束,即 。
位于此示例末尾的 fbnd
辅助函数会以数值方式计算 。
使用不同起点
一般情况下,包含 个变量、 个方程的方程组有孤立的解,这意味着每个解都没有同为解的邻点。因此,搜索满足某些约束的解的一种方法是生成多个初始点 x0
,然后从每个 x0
开始运行 fsolve
。
对于此示例,要寻找方程组 的解,请取 10 个随机点,这些点呈正态分布,均值为 0,标准差为 100。
rng default % for reproducibility n = 10; % try 10 random start points pts = 100*randn(n,2); % initial points are rows in pts soln = zeros(n,2); % allocate solution opts = optimoptions('fsolve','display','off'); for k = 1:n soln(k,:) = fsolve(@fbnd,pts(k,:),opts); % find solutions end
列出满足约束的解。
idx = soln(:,1) >= 0 & soln(:,2) >= 0; disp(soln(idx,:))
10.0000 20.0000 10.0000 20.0000 10.0000 20.0000 10.0000 20.0000 10.0000 20.0000
使用不同算法
fsolve
有三种算法。每种算法可能得到不同的解。
例如,采用 x0 = [1,9]
并检查每个算法返回的解。
x0 = [1,9]; opts = optimoptions(@fsolve,'display','off',... 'algorithm','trust-region-dogleg'); x1 = fsolve(@fbnd,x0,opts)
x1 = 1×2
-1.0000 -2.0000
opts.algorithm = 'trust-region';
x2 = fsolve(@fbnd,x0,opts)
x2 = 1×2
-1.0000 20.0000
opts.algorithm = 'levenberg-marquardt';
x3 = fsolve(@fbnd,x0,opts)
x3 = 1×2
0.9523 8.9941
此处,对于同一个初始点,三种算法得到的解各不相同。都不满足约束。报告的“解”x3
甚至不是解,而只是局部平稳点。
使用带边界的 lsqnonlin
lsqnonlin
尝试最小化向量函数 中各分量的平方和。因此,它尝试求解方程 。此外,lsqnonlin
接受边界约束。
针对 lsqnonlin
构造示例问题并对其求解。
lb = [0,0];
rng default
x0 = 100*randn(2,1);
[x,res] = lsqnonlin(@fbnd,x0,lb)
local minimum found. optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 2×1
10.0000
20.0000
res = 2.4783e-25
在本例中,lsqnonlin
收敛于满足约束的解。您可以结合使用 lsqnonlin
和 global optimization toolbox multistart
求解器,自动基于多个初始点进行搜索。请参阅multistart using lsqcurvefit or lsqnonlin (global optimization toolbox)。
将方程和不等式设置为 fmincon
约束
您可以按照以下方式重新表示问题并使用 fmincon
:
给出常数目标函数,如
@(x)0
,该函数对每个x
的计算结果为 0。将
fsolve
目标函数设置为fmincon
中的非线性等式约束。以通常的
fmincon
语法给出任何其他约束。
此示例末尾的 fminconstr
辅助函数实现非线性约束。求解约束问题。
lb = [0,0]; % lower bound constraint rng default % reproducible initial point x0 = 100*randn(2,1); opts = optimoptions(@fmincon,'algorithm','interior-point','display','off'); x = fmincon(@(x)0,x0,[],[],[],[],lb,[],@fminconstr,opts)
x = 2×1
10.0000
20.0000
在本例中,fmincon
从起点求解问题。
辅助函数
以下代码创建 fbnd
辅助函数。
function f = fbnd(x) f(1) = (x(1) 1)*(10-x(1))*(1 x(2)^2)/(1 x(2)^2 x(2)); f(2) = (x(2) 2)*(20-x(2))*(1 x(1)^2)/(1 x(1)^2 x(1)); end
以下代码创建 fminconstr
辅助函数。
function [c,ceq] = fminconstr(x) c = []; % no nonlinear inequality ceq = fbnd(x); % fsolve objective is fmincon nonlinear equality constraints end
另请参阅
| |