带约束的非线性系统
用不等式约束解方程
fsolve
解一个非线性方程组。但是,它不允许您包含任何约束,甚至是绑定约束。那么当你有约束条件时你如何解一个非线性方程组呢?
满足约束条件的解决方案并不一定存在。事实上,这个问题可能没有任何解决方案,即使它不能满足您的约束条件。但是,有一些技术可以帮助您寻找满足约束条件的解决方案。金宝搏官方网站
为了说明这些技术,请考虑如何求解这些方程
的分量 必须是非负的。方程有四个解:金宝搏官方网站
只有一个解满足约束条件,即 .
的fbnd
的辅助函数。本例结束计算
数值。
使用不同的起点
一般来说,一个系统的
方程
变量有独立的解,这意味着每个解都没有相邻的解。金宝搏官方网站因此,寻找满足某些约束的解的一种方法是生成一些初始点x0
,然后运行fsolve
从每一个开始x0
.
在这个例子中,求方程组的解 ,取10个均值为0,标准差为100的正态分布随机点。
rng默认的%用于再现性N = 10;尝试10个随机起点pts = 100*randn(N,2);初始点是以点为单位的行soln = 0 (N,2);分配溶液Opts = optimoptions(“fsolve”,“显示”,“关闭”);为k = 1:N soln(k,:) = fsolve(@fbnd,pts(k,:),opts);找到解决方案金宝搏官方网站结束
列出满足约金宝搏官方网站束条件的解决方案。
Idx = soln(:,1) >= 0 & soln(:,2) >= 0;disp(溶液(idx:))
10.0000 20.0000 10.0000 20.0000 10.0000 20.0000 10.0000 20.0000 20.0000
使用不同的算法
fsolve
有三个算法。每一种都可以导致不同的解决方案。金宝搏官方网站
对于这个例子,取X0 = [1,9]
并检查每个算法返回的解。
X0 = [1,9];Opts = optimoptions(@fsolve,“显示”,“关闭”,...“算法”,“trust-region-dogleg”);X1 = fsolve(@fbnd,x0,opts)
x1 =1×2-1.0000 - -2.0000
选择。算法=“信赖域”;X2 = fsolve(@fbnd,x0,opts)
x2 =1×2-1.0000 - 20.0000
选择。算法=“levenberg-marquardt”;X3 = fsolve(@fbnd,x0,opts)
x3 =1×20.9523 - 8.9941
在这里,这三种算法都对相同的初始点找到了不同的解。金宝搏官方网站没有一个满足约束条件。报告的“解决方案”x3
它甚至不是一个解,而只是一个局部不动点。
使用lsqnonlin
与范围
lsqnonlin
试图最小化向量函数中各分量的平方和
.因此,它试图解这个方程
.同时,lsqnonlin
接受绑定约束。
的例题lsqnonlin
然后解出来。
Lb = [0,0];rng默认的X0 = 100*randn(2,1);[x,res] = lsqnonlin(@fbnd,x0,lb)
找到局部极小值。优化完成,因为梯度的大小小于最优性公差的值。
x =2×110.0000 - 20.0000
Res = 2.4783e-25
在这种情况下,lsqnonlin
收敛到满足约束条件的解。你可以使用lsqnonlin
使用全局优化工具箱MultiStart
求解器自动搜索多个初始点。看到MultiStart使用lsqcurvefit或lsqnonlin(全局优化工具箱).
设方程和不等式为fmincon
约束
你可以重新定义这个问题并使用fmincon
如下:
给出一个常数目标函数,例如
@ (x) 0
,每个的值都为0x
.设置
fsolve
目标函数作为非线性不等式约束fmincon
.给出通常情况下的其他约束条件
fmincon
语法。
的fminconstr
的辅助函数。本例结束实现非线性约束。解决约束问题。
Lb = [0,0];%下界约束rng默认的%可重复起始点X0 = 100*randn(2,1);Opts = optimoptions(@fmincon,“算法”,“内点”,“显示”,“关闭”);x = fmincon (@ (x) 0 x0 ,[],[],[],[], 磅,[],@fminconstr选择)
x =2×110.0000 - 20.0000
在这种情况下,fmincon
从起点解决问题。
辅助函数
此代码创建fbnd
helper函数。
函数F = fbnd F (x) (1) = (x (1) + 1) * (10 x (1)) * (1 + x (2) ^ 2) / (1 + x (2) ^ 2 + (2));F (2) = (x (2) + 2) * (20 x (2)) * (1 + x (1) ^ 2) / (1 + x (1) ^ 2 + x (1));结束
此代码创建fminconstr
helper函数。
函数[c,ceq] = fminconstr(x) c = [];%无非线性不等式Ceq = fbnd(x);求解目标为非线性等式约束结束