fmincon如何使非线性约束函数写成匿名函数的形式

fmincon命令中,可以将目标函数直接写成匿名函数的形式,但是一个匿名函数只有一个输出,而fmincon中的nonlcon写成m文件时是写成[c,ceq],c表示非线性不等式,ceq表示非线性等式。那么如何将约束函数nonlcon写成匿名函数呢,查阅matlab的help文档,查阅优化工具箱中对非线性约束Nonlinear Constraints的介绍,也可以通过fmincon帮助中对nonlcon参数的介绍链接进对Nonlinear Constraints的介绍。

Anonymous Nonlinear Constraint Functions

For information on anonymous objective functions, see Anonymous Function Objectives.

Nonlinear constraint functions must return two outputs. The first output corresponds to nonlinear inequalities, and the second corresponds to nonlinear equalities.

Anonymous functions return just one output. So how can you write an anonymous function as a nonlinear constraint?

The deal function distributes multiple outputs. For example, suppose your nonlinear inequalities are

Suppose that your nonlinear equality is

x2 = tanh(x1).

Write a nonlinear constraint function as follows:

c = @(x)[x(1)^2/9 + x(2)^2/4 - 1;
        x(1)^2 - x(2) - 1];
ceq = @(x)tanh(x(1)) - x(2);
nonlinfcn = @(x)deal(c(x),ceq(x));

To minimize the function cosh(x1) + sinh(x2) subject to the constraints in nonlinfcn, use fmincon:

obj = @(x)cosh(x(1))+sinh(x(2));
opts = optimset(‘Algorithm‘,‘sqp‘);
z = fmincon(obj,[0;0],[],[],[],[],[],[],nonlinfcn,opts)

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is
non-decreasing in feasible directions, to within the default
value of the function tolerance, and constraints were satisfied
to within the default value of the constraint tolerance.

z =
   -0.6530
   -0.5737

To check how well the resulting point z satisfies the constraints, use nonlinfcn:

[cout,ceqout] = nonlinfcn(z)

cout =
   -0.8704
   -0.0000

ceqout =
     -2.2204e-016

z indeed satisfies all the constraints to within the default value of the TolCon constraint tolerance, 1e-6.
时间: 2024-09-29 02:53:40

fmincon如何使非线性约束函数写成匿名函数的形式的相关文章

【c++】cout重载能不能写成成员函数,若能,写出函数原型,若不能,说明原因

// cout重载能不能写成成员函数,若能,写出函数原型,若不能,说明原因 #include <iostream> using namespace std; // cout做友元 class A; ostream& operator<<(ostream &out, const A &a); class A { friend ostream& operator<<(ostream &out, const A &a); pub

为什么基类的析构函数要写成虚函数?

为什么基类的析构函数要写成虚函数? 答:在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 代码说明如下 第一段代码: 1 #include<iostream> 2 using namespace std;   3    4 class ClxBase   5 {public:   6 ClxBase() {}   7 ~ClxBase() {cout << "Output from the destructor of class ClxB

JavaScript之 ------ 函数(一般函数、动态函数、匿名函数)

JavaScript之 ------ 函数(一般函数.动态函数.匿名函数) 函数 一.一般函数 1.格式: function 函数名(形式参数...) { 执行语句: return 返回值: } 函数是多条执行语句的封装体,只有被调用才会被运行. 注意:调用有参数的函数,但没有给其传值,函数一样可以运行,或者调用没有参数的函数,给其传值,该函数也一样运行. 说的简单点:只要写了函数名后面跟了一对小括号,该函数就会运行. 2.函数虽然定义时是声明成两个参数,但调用时却是可以传入任意个 例: ? 1

【JS教程07】事件属性及匿名函数

1.事件属性 元素上除了有样式,id等属性外,还有事件属性,常用的事件属性有鼠标点击事件属性(onclick),鼠标移入事件属性(mouseover),鼠标移出事件属性(mouseout),将函数名称赋值给元素事件属性,可以将事件和函数关联起来. <script type="text/javascript"> window.onload = function(){ var oBtn = document.getElementById('btn1'); oBtn.onclic

python之内置函数(二)与匿名函数、递归函数初识

一.内置函数(二)1.和数据结构相关(24)列表和元祖(2)list:将一个可迭代对象转化成列表(如果是字典,默认将key作为列表的元素).tuple:将一个可迭代对象转化成元组(如果是字典,默认将key作为元组的元素) 2.相关内置函数(2)reversed:将一个序列翻转,并返回此翻转序列的迭代器. *****slice:构造一个切片模板,用于列表的切片.*** 2-1.reversed()与列表的reverse()区分:列表的reverse()只能列表使用:列表.reverse(),对原列

python函数(6):内置函数和匿名函数

我们学了这么多关于函数的知识基本都是自己定义自己使用,那么我们之前用的一些函数并不是我们自己定义的比如说print(),len(),type()等等,它们是哪来的呢? 一.内置函数 由python内部定义好我们可以直接调用的函数就叫内部函数.python一共给我们68个内置函数: abs() dict() help() min() setattr() all() dir() hex() next() slice() any() divmod() id() object() sorted() as

python第五天:协程,匿名函数,递归函数,模块导入,re模块

上节回顾 函数对象 函数可以被当成数据来传递 def func(): pass 1.可以被引用.f=fun 2.可以当做参数传递给另外一个函数 3.可以作为函数的返回值 4.可以当做容器类型的元素 比如用户有10多个参数,我们不需要写10多个if判断.可以写一个字典. dic = {'func1':func1,'func2':func2} 调用个时候就用dic['func1']() 函数的嵌套 函数的嵌套可以分为两种:嵌套定义和嵌套调用. 嵌套调用:函数的执行过程中调用其他的函数,可以更加细化的

python——内置函数和匿名函数

内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这些函数有些我们已经用过了,有些我们还没用到过,还有一些是被封印了,必须等我们学了新知识才能解开封印的.那今天我们就一起来认识一下python的内置函数.这么多函数,我们该从何学起呢?     Built-in Functions     abs() dict() help() min() setat

Python— 匿名函数

匿名函数 匿名函数:为了解决那些功能很简单的需求而设计的  “一句话函数” #初始代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc = lambda n:n**n print(calc(10)) 上图是对calc这个匿名函数的分析 # 关于匿名函数格式的说明 函数名 = lambda 参数 :返回值(相当于函数体) # 参数可以有多个,用逗号隔开 # 匿名函数不管逻辑多复杂,只能写一行,且逻辑执行结束后的内容就是返回值 # 返回值和