主要内容

带约束的非线性系统

解不等式约束方程

fsolve解一个非线性方程组。但是,它不允许包含任何约束,甚至是绑定约束。那么当你有约束条件的时候你怎么解非线性方程组呢?

不能保证满足约束条件的解决方案一定存在。事实上,这个问题可能没有任何解决方案,甚至不满足您的约束条件。但是,有一些技术可以帮助您搜索满足约束条件的解决方案。

为了说明这些技术,请考虑如何求解这些方程

F 1 x x 1 + 1 1 0 - x 1 1 + x 2 2 1 + x 2 2 + x 2 F 2 x x 2 + 2 2 0 - x 2 1 + x 1 2 1 + x 1 2 + x 1

其中的成分 x 必须是负的。该方程有四个解:

x - 1 - 2 x 1 0 - 2 x - 1 2 0 x 1 0 2 0

只有一个解满足约束条件,即 x 1 0 2 0

fbnd的辅助功能此示例结束计算 F x 数值。

使用不同的起点

一般来说,一个系统 N 方程 N 变量有孤立的解,这意味着每个解没有邻近的也是解的邻居。寻找满足约束条件的解的一种方法是生成一些初始点x0,然后跑fsolve在每一个开始x0

对于这个例子,寻找方程组的解 F x 0 ,取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试图使向量函数中各分量的平方和最小化 F x .因此,它试图解这个方程 F x 0 .同时,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从起点解决问题。

辅助函数

此代码创建fbndhelper函数。

函数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));结束

此代码创建fminconstrhelper函数。

函数[c,ceq] = fminconstr(x) c = [];%无非线性不等式测查= fbnd (x);fsolve目标是fmincon非线性等式约束结束

另请参阅

||

相关的话题

Baidu
map