lingo

遇到线性规划和非线性规划的问题时,用matlab解比较复杂。

1 基本界面与解方程

基本界面

ctrl+鼠标滚轮:对界面放大缩小

解x+1=2的方程:先输入“x+1=2;”,然后点击“solve”

解方程

方程以分号结束,所有符号必须是英文输入,+,-,*,/。

2*x+1=1;其中“*”不可以省略。

lingo变量

lingo默认所有变量大于等于0,因而非负条件不用写;

遇到一个变量可以小于0,用到一个函数@free,来使其定义域为R;

lingo不区分大小写;

变量均由字母数字下划线组成,且字母在首位。

注意:矩阵x中的第一个元素是x(1)。

线性规划基础

一个线性规划中只含一个目标函数。(两个及以上是多目标线性规划,lingo无法直接求解,需要将多个目标转为1个);

球目标函数中的最大值和最小值用max=...和min...来表示;

以“!”开头以“;”结尾;

线性规划和非线性规划的本质区别是目标函数是否线性,其余一致,故不需要专门区分。

注:非线性规划求解十分困难,难以得到全局最优解,故需要将非线性转化为线性。

集合vs矩阵工厂

生产矩阵

程序:
sets:
factory/1..6/:a,b;

plant/1..3/:x,y;

endsets

以上程序的解释:factory和plant是制造矩阵的两家不同工厂;

/1..6/说明是1x6的矩阵;

其中矩阵工厂factory的名字和a,b的名字都是随便起的;

生产完矩阵之后,工厂和矩阵之间脱开联系;

sets:和endsets表示矩阵工厂的生产起止。

给矩阵赋值

程序:

sets:
factory/1..6/:a,b;

plant/1..3/:x,y;

endsets

data:

a=1,2,3,4,5,6;

b=6.0,2.0,3.0,1.0,5.0,4.0;

x=10,20,30;

enddata

注:多赋值少赋值都会报错;

不是每个矩阵都要赋值,有些矩阵是我们要求解的变量;

可以赋整数和小数(不能赋分数以及直接在赋值的地方做运算);

data:enddata表示矩阵赋值的起止。

循环与求和

for循环

@for(gc(i):s=a(i)*x(i));

解释:for循环,括起整行语句,因为s=aixi,i=1,2,3,4,5 相当于5个约束条件;

for循环内部先写工厂,告诉for循环几次,之后再接上约束条件;

此处的i可写可不写,也可以换成j,k...;

如果出现二维矩阵工厂,则需要写上i和j。

sum求和

@sum(gc(i):x(i))=5000;

解释:sum求和,不可以括起完整的约束条件,因为一般的求和结构是:x1+x2+x3+x4+x5=5000;

sum求和内部先写工厂,以告诉sum求和几次,之后再接上约束条件。

for和sum出现的标志

约束条件后面有i=1,2,3,4,5,一定在最外层套上for;

约束条件前面是\sum,一定在中间加上sum。

程序:

model:

sets:
factory/
1..6/:a,b;

plant/1..3/:x,y;

endsets

data:

a=1,2,3,4,5,6;

b=6.0,2.0,3.0,1.0,5.0,4.0;

x=10,20,30;

enddata

max=s;

@for(gc(i):s=a(i)*x(i));

@sum(gc(i):x(i))=5000;

end

注:使用矩阵工厂创建矩阵后,整个程序需要用model:end包起来。

工厂合并

程序:

sets:

factory/1..6/:a;

plant/1..8/:d;

cooperation(factory,plant):c,x;

endsets

data:
c=6,5,8,8,2,4,3,4

    4,9,5,6,5,4,4,5

  ...(省略3行)

    5,5,1,2,3,4,2,6;

其中c是(6,8).

注:cooperation是随便起的名字。

逻辑运算符和内置函数

关系运算符:

lingo中只有“=”,“>=”,“<=”这三种运算符,没有单独的“>”,“<”,即输入“<”lingo则识别为“<=”.

若想严格表达A大于B,可以通过以下方式实现。

程序:

B=10;

e=0.000001;

A-e>B;

其中e的值取决于我们所需要的精度。

逻辑运算符:

分为两种,用于两个数字之间或者两个逻辑表达式之间。

两个数字之间:

#eq#:equal,两个对象相等为真;

#ne#:不相等为真;

#gt#:左边大于右边为真;

#ge#:左边大于等于右边为真;

#lt#:左边小于右边为真;

#le#:左边小于等于右边为真;

两个逻辑表达式之间:

#not#:单目运算符,表示取反;

#and#:左右两边均正确才为真;

#or#:左右两边均错误才为假。

逻辑运算符唯一出现的位置:

1 for循环和sum求和;

2 if判断中(分段函数)。

例如:

y=@sum(fac(i)|i#ge#5:a(i));

lingo内置函数

if判断

y=@if(x#le#500,4*x,@if(x#gt#1000,1500+2*x,500+3*x));

特别提醒:尽量少用if。

变量定界函数

@bin(x):限制x只能取0或1;

@gin(x):限制x只能为整数;

@bnd(a,x,b):限制x在a,b之间闭区间;

@free(x):定义域自由。

数学函数

@sin(x);@log(x):返回自然对数值,其他底数用换底公式;@sigh(x):返回x的符号值;@floor(x):返回x的整数部分;@smax(x1,x2,x3,x4,x5):返回其中最大值(不常用)。

集合操作函数

@for(factory:a>0);

@sum(factory:a);

@prod(factory:a);:求积;

@max(factory:a);:求最大值;

@in(factory:a);:判断常数c是否在矩阵中;

@size(factory:a);:返回矩阵大小。

你可能感兴趣的:(matlab,开发语言)