主要内容

带约束的非线性系统

用不等式约束解方程

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

辅助函数

此代码创建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 = [];%无非线性不等式Ceq = fbnd(x);求解目标为非线性等式约束结束

另请参阅

||

相关的话题