非线性系统与约束
解决方程与不等式约束
fsolve
解决了非线性方程组。但是,它不允许你包括任何约束,甚至绑定约束。所以你怎么能解决非线性方程组当你有限制吗?
一个解决方案,满足你的约束不能保证存在。事实上,这个问题可能没有任何解决方案,甚至不满足你的约束。然而,存在的一些技巧来帮助你寻找解决方案,满足你的约束。金宝搏官方网站
为了说明的技术,考虑如何解决方程
的组件 必须是负的。方程有四个解决方案:金宝搏官方网站
只有一个解决方案满足约束条件,即 。
的fbnd
辅助函数在这个例子计算
数值。
使用不同的开始点
一般来说,一个系统的
方程
变量有孤立的解决方案,这意味着每个解决方案没有金宝搏官方网站附近的邻居,也是解决方案。所以,寻找一个解决方案的一种方法,满足一些约束是生成一个初始点的数量x0
,然后运行fsolve
在每一个开始x0
。
对于这个示例,寻找解决方程系统 ,10个随机点是正态分布的均值为0 100和标准偏差。
rng默认的%的再现性N = 10;%随机尝试10点开始分= 100 * randn (N, 2);%初始点行分溶液= 0 (N, 2);%分配解决方案选择= optimoptions (“fsolve”,“显示”,“关闭”);为k = 1: N溶液(k,:) = fsolve (@fbnd, pts (k,:),选择);%找到解决方案金宝搏官方网站结束
列出解决方金宝搏官方网站案,满足约束。
idx =溶液(:1)> = 0 &溶液(:,2)> = 0;disp(溶液(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];选择= optimoptions (@fsolve,“显示”,“关闭”,…“算法”,“trust-region-dogleg”);x1 = fsolve (x0, @fbnd选择)
x1 =1×2-1.0000 - -2.0000
选择。算法=“信赖域”;x2 = fsolve (x0, @fbnd选择)
x2 =1×2-1.0000 - 20.0000
选择。算法=“levenberg-marquardt”;x3 = fsolve (x0, @fbnd选择)
x3 =1×20.9523 - 8.9941
这里,所有三个算法寻找不同的解决方案相同的初始点。金宝搏官方网站没有一个满足约束。报告的“解决方案”x3
甚至不是一个解决方案,但只是一个局部平稳点。
使用lsqnonlin
与范围
lsqnonlin
试图减少组件的平方和向量函数
。因此,它试图解决方程
。同时,lsqnonlin
接受绑定约束。
制定问题的例子lsqnonlin
并解决它。
磅= (0,0);rng默认的x0 = 100 * randn (2, 1);[x, res] = lsqnonlin (x0, @fbnd磅)
局部最小值。优化完成因为梯度的大小小于最优值的宽容。
x =2×110.0000 - 20.0000
res = 2.4783 e-25
在这种情况下,lsqnonlin
收敛于解满足约束。您可以使用lsqnonlin
随着全球优化工具箱MultiStart
解算器自动搜索多个初始点。看到MultiStart使用lsqcurvefit或lsqnonlin(全局优化工具箱)。
集方程和不等式fmincon
约束
你可以用这个问题和使用fmincon
如下:
给一个恒定的目标函数,如
@ (x) 0
,其计算结果为0x
。设置
fsolve
目标函数的非线性等式约束fmincon
。给任何其他限制
fmincon
语法。
的fminconstr
辅助函数在这个例子实现了非线性约束。解决约束问题。
磅= (0,0);%下界约束rng默认的%的初始点x0 = 100 * randn (2, 1);选择= 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] = fminconstr c (x) = [];%没有非线性不等式测查= fbnd (x);% fsolve目标是fmincon非线性等式约束结束