Lingo函数

Posted lgxo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lingo函数相关的知识,希望对你有一定的参考价值。

目录


算术运算符

^	乘方
*	乘
/	除
+	加
-	减

逻辑运算符

逻辑运算符主要用于集循环函数的条件表达式中,来控制在函数中哪些集成员被包含,哪些被排斥。在创建稀疏集时用在成员资格过滤器中。
共9种逻辑运算符

#not#	否定该操作数的逻辑值, #not#是一个一元运算符。
#eq#	若两个运算数相等,则为 true, 否则为 flase。
#ne#	若两个运算数不相等,则为 true, 否则为 flase。
#gt#	若左边的运算数严格大于右边的运算数,则为 true, 否则为 flase。
#ge#	若左边的运算数大于或等于右边的运算数,则为 true, 否则为 flase。
#lt#	若左边的运算数严格小于右边的运算数,则为 true, 否则为 flase。
#le#	若左边的运算数小于或等于右边的运算数,则为 true, 否则为 flase。
#and#	仅当两个参数都为 true 时,结果为 true,否则为 false。
#or#	仅当两个参数都为 false 时,结果为 false,否则为 true。

关系运算符

在 Lingo 中,关系运算符主要用在模型中来指定一个表达式的左边是否等于、小于等于或者大于等于右边,形成模型的一个约束条件。关系运算符与逻辑运算符 #eq#、#le#、#ge# 截然不同,逻辑运算符仅仅判断一个关系是否被满足,满足为真,不满为假。
Lingo 有三种关系运算符:"="、"<="和">="。Lingo中还能用"<“表示小于等于关系,”>"表示大于等于关系。Lingo 并不支持严格小于和严格大于关系运算符。


数学函数

Lingo 提供了大量的标准数学函数:

@abs(x)	返回 x 的绝对值
@sin(x)	返回 x 的正弦值,x 采用弧度制
@cos(x)	返回 x 的余弦值,x 采用弧度制
@tan(x)	返回 x 的正切值,x 采用弧度制
@exp(x)	返回常数 e 的 x 次幂
@log(x)	返回 x 的自然对数
@lgm(x)	返回 x 的 gamma 函数的自然对数
@mod(x, y)	返回 x 的除以 y 的余数
@sign(x)	如果 x<0 返回 -1;如果 x>0 返回 1;如果 x=0 返回0
@floor(x)	返回 x 的整数部分。当 x>=0 时,返回不超过 x 的最大整数;当 x<0 时,返回不低于 x 的最小整数
@smax(x1, x2, ···, xn)	返回 x1, x2, ···, xn 中的最大值
@smin(x1, x2, ···, xn)	返回 x1, x2, ···, xn 中的最小值

变量界定函数

变量界定函数实现对变量取值范围的附加限制,共4种:

@bin(x)	限制 x 为 0 或 1
@bnd(L, x, U)	限制 L <= x <= U
@free(x)	取消对变量 x 的默认下界为 0 的限制,即 x 可以取任意实数
@gin(x)	限制 x 为整数

在默认情况下,Lingo 规定变量是非负的,也就是说下界为 0,上界为 + ∞ +\\infty +
@free取消了默认的下界为 0 的限制,使变量也可以取负值。
@bnd用于设定一个变量的上下界,它也可以取消默认下界为 0 的约束。


集循环函数

@for:	该函数用来产生对集成员的约束
@sum:	该函数返回遍历指定的集成员的一个表达式的和。
@min 和 @max:	返回指定的集成员的一个表达式的最小值和最大值。

例:求向量[5, 1, 3, 4, 6, 10]前5个数的最小值,后3个数的最大值。

model:

data:
	N = 6;
enddata

sets:
	number/1 .. N/:x;
endsets

data:
	x = 5 1 3 4 6 10;
enddata

	minv = @min(number(I) | I #le#5: x);
	maxv = @max(number(I) | I #ge#N-2: x);

end

概率函数

  1. @pbn(p, n, x)
    二项分布的累积分布函数。当 n 和(或)x 不是整数时,用线性插值法进行计算。
  2. @pcx(n, x)
    自由度为 n 的 χ 2 \\chi^2 χ2 分布的累积分布函数。
  3. @peb(a, x)
    当到达负荷为 a ,服务系统有 x 个服务器且允许无穷排队时的 Erlang 繁忙概率。
  4. @pel(a, x)
    当到达负荷为 a ,服务系统有 x 个服务器且不允许排队时的 Erlang 繁忙概率。
  5. @pfd(n, d, x)
    自由度为 n 和 d 的 F 分布的累积分布函数。
  6. @pfs(a, x, c)
    当负荷上限为 a,顾客数为 c,平行服务器数量为 x 时,有限源的 Poisson 服务系统的等待或返修顾客数的期望值。a 是顾客数乘以平均服务时间,再除以平均返修时间。当 c 和(或)x 不是整数时,采用线性插值进行计算。
  7. @phg(pop, g, n, x)
    超几何(Hypergeometric)分布的累积分布函数。pop 表示产品总数,g 是正品数。从所有产品中任意取出 n (n ≤ \\le pop) 件。pop、g、n 和 x 都可以是非整数,这里采用线性插值进行计算。
  8. @ppl(a, x)
    Poisson 分布的线性损失函数,即返回 max (0, z-x) 的期望值,其中随机变量 z 服从均值为 a 的 Poisson 分布。
  9. @pps(a, x)
    均值为 a 的 Poisson 分布的累积分布函数。当 x 不是整数时,采用线性插值进行计算。
  10. @psl(x)
    单位正态线性损失函数,即返回 max (0, z-x) 的期望值,其中随机变量 z 服从标准正态分布。
  11. @psn(x)
    标准正态分布的累积分布函数。
  12. @ptd(n, x)
    自由度为 n 的 t 分布的累积分布函数。
  13. @qrand(seed)
    产生服从(0, 1)区间的伪随机数。@qrand 只允许在模型的数据部分使用,它将用伪随机数填满集属性。通常,声明一个 m × n m\\times n m×n 的二维表,m 表示运行实验的次数,n 表示每次实验所需的随机数的个数。在行内,随机数是独立分布的;在行间,随机数是非常均匀的。这些随机数是用“分层取样”的方法产生的。

例:

model:

data:
	M = 4; N = 2; seed = 1234567;
enddata

sets:
	rows /1 .. M/;
	cols /1 .. N/;
	table(rows, cols): x;
endsets

data:
	X = @qrand(seed);
enddata

end
  1. @rand(seed)
    返回 0 和 1 间的伪随机数,依赖于指定的种子 seed。典型用法是lingo U(I + 1) = @rand(U(I))。注意:如果 seed 不变,那么产生的随机数也不变。

例:利用 @rand 产生 15 个标准正态分布的随机数和自由度为 2 的 t 分布的随机数。

model:

!产生一列正态分布和 t 分布的随机数;
sets:
	series /1 .. 15/: u, znorm, zt;
endsets

!第一个均匀分布随机数是任意的;
	u(1) = @rand(.1234);
	!产生其余的均匀分布的随机数;
	@for(series(I) | I #GT# 1: u(I) = @rand(u(I - 1)));

	@for(	series(I):
		!正态分布随机数;
		@psn(znorm(I)) = u(I);
		!和自由度为 2 的 t 分布随机数;
		@ptd(2, zt(I)) = u(I);
		!znorm 和 zt 可以是负数;
		@free(znorm(I)); @free(zt(I))	);

end

集操作函数

LIngo 提供了几个函数帮助处理集。

  1. @in(set_name, primitive_index_1 [, primitive_index_2, …])
    如果元素在指定集中,返回 1,否则返回 0。

例:全集为 I I I,B是 I I I的一个子集,C是B的补集。

sets:
	I /x1 .. x4/: x;
	B(I) /x2/: y;
	c(I) | #not# @in(B, &1): z;
endsets
  1. @index([set_name, ] primitive_set_element)
    该函数返回在集 set_name 中原始集成员 primitive_set_element 的索引。如果 set_name 被忽略,那么 Lingo 将返回与 primitive_set_element 匹配的第一个原始集成员的索引。如果找不到,则产生一个错误。

例:如何确定集成员(B, Y)属于派生集 S3。

sets:
	S1 /A B C/;
	S2 /X Y Z/;
	S3 (S1, S2) /A X, A Z, B Y, C X/;
endsets
L = @in(S3, @index(S1, B), @index(S2, Y));

看下面的例子,表明有时为 @index 指定集是必要的。

例:

sets:
	girls /debble, sue, alice/;
	boys /bob, joe, sue, fres/;
endsets

I1 = @index(sue);
I2 = @index(boys, sue);
  1. @wrap(index, limit)
    该函数返回 j = index - k*limit,其中 k 是一个整数,取适当值保证 j 落在区间 [1, limit] 内。该函数在循环、多阶段计划编制中特别有用。
  2. @size(set_name)
    该函数返回集 set_name 的成员个数。在模型中明确给出集大小时最好使用该函数。它的使用使模型更加数据独立,集大小改变时也更易维护。

以上是关于Lingo函数的主要内容,如果未能解决你的问题,请参考以下文章

Lingo函数

Lingo函数

备战数学建模8-LINGO从入门到熟练掌握

Lingo 基本使用

在Lingo中使用集合

用lingo导入excel数据生成矩阵并对元素进行累加怎么敲代码