带约束的非线性系统
解不等式约束方程
fsolve
解一个非线性方程组。但是,它不允许包含任何约束,甚至是绑定约束。那么当你有约束条件的时候你怎么解非线性方程组呢?
不能保证满足约束条件的解决方案一定存在。事实上,这个问题可能没有任何解决方案,甚至不满足您的约束条件。但是,有一些技术可以帮助您搜索满足约束条件的解决方案。
为了说明这些技术,请考虑如何求解这些方程
其中的成分 必须是负的。该方程有四个解:
只有一个解满足约束条件,即 .
的fbnd
的辅助功能此示例结束计算
数值。
使用不同的起点
一般来说,一个系统
方程
变量有孤立的解,这意味着每个解没有邻近的也是解的邻居。寻找满足约束条件的解的一种方法是生成一些初始点x0
,然后跑fsolve
在每一个开始x0
.
对于这个例子,寻找方程组的解 ,取10个正态分布均值为0,标准差为100的随机点。
rng默认的%的再现性N = 10;尝试10个随机起点分= 100 * randn (N, 2);初始点是pts中的行溶液= 0 (N, 2);%分配解决方案选择= optimoptions (“fsolve”,“显示”,“关闭”);为k = 1:N soln(k,:) = fsolve(@fbnd,pts(k,:),opts);%找到解决方案结束
列出满足约束条件的解。
Idx = soln(:,1) >= 0 & soln(:,2) >= 0;disp(溶液(idx:))
000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
使用不同的算法
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,ceq] = fminconstr(x) c = [];%无非线性不等式测查= fbnd (x);fsolve目标是fmincon非线性等式约束结束