遇到线性规划和非线性规划的问题时,用matlab解比较复杂。
ctrl+鼠标滚轮:对界面放大缩小
解x+1=2的方程:先输入“x+1=2;”,然后点击“solve”
方程以分号结束,所有符号必须是英文输入,+,-,*,/。
2*x+1=1;其中“*”不可以省略。
lingo默认所有变量大于等于0,因而非负条件不用写;
遇到一个变量可以小于0,用到一个函数@free,来使其定义域为R;
lingo不区分大小写;
变量均由字母数字下划线组成,且字母在首位。
注意:矩阵x中的第一个元素是x(1)。
一个线性规划中只含一个目标函数。(两个及以上是多目标线性规划,lingo无法直接求解,需要将多个目标转为1个);
球目标函数中的最大值和最小值用max=...和min...来表示;
以“!”开头以“;”结尾;
线性规划和非线性规划的本质区别是目标函数是否线性,其余一致,故不需要专门区分。
注:非线性规划求解十分困难,难以得到全局最优解,故需要将非线性转化为线性。
程序:
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(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(gc(i):x(i))=5000;
解释:sum求和,不可以括起完整的约束条件,因为一般的求和结构是:x1+x2+x3+x4+x5=5000;
sum求和内部先写工厂,以告诉sum求和几次,之后再接上约束条件。
约束条件后面有i=1,2,3,4,5,一定在最外层套上for;
约束条件前面是,一定在中间加上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));
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);:返回矩阵大小。