灵敏度分析



文章目录

  • 灵敏度分析
  • 前言
  • 一、灵敏度是什么?
  • 1.概念
  • 2.灵敏度的应用
  • 二、一个通俗的例子对灵敏度分析的解释
  • 三、灵敏度分析的方法
  • 四、灵敏度分析的具体实例
  • 五、总结
  • 引用



前言

在数学建模的评价类问题中,灵敏度分析是一个重量级的评价方法,尤其是针对规划问题,是一定要在建模后对模型进行灵敏度分析的,用来检验模型的稳定性。


本文主要介绍了灵敏度分析的概念和如何对我们建立的模型进行灵敏度分析,最后,我们通过一个例题来具体讲解灵敏度分析的操作方法。

一、灵敏度是什么?

1.概念

灵敏度分析是研究与分析一个系统(或模型)的状态或输出变化对系统参数或周围条件变化的敏感程度的方法。在最优化方法中经常利用灵敏度分析来研究原始数据不准确或发生变化时最优解的稳定性。通过灵敏度分析还可以决定哪些参数对系统或模型有较大的影响。因此,灵敏度分析几乎在所有的运筹学方法以及在对各种方案进行评价时都是很重要的。

2.灵敏度的应用

投入产出法中灵敏度分析

可以用来研究采取某一项重大经济政策后将会对国民经济的各个部门产生怎样的影响。例如,美国政府曾经利用投入产出表研究了提高职工工资10%对国民经济各部门商品价格的影响。研究的结果表明,在职工工资增加10%时,建筑业产品的价格将上涨7%,农产品的价格将上涨1.3%,其余各部门产品价格将上涨1.3~7%不等,生活费用将上升3.8%,职工的实际得益为6.2%。

方案评价中灵敏度分析

可以用来确定评价条件发生变化时备选方案的价值是否会发生变化或变化多少。例如,在利用评价表进行评价时,需要确定每一个分目标的权重系数和各分目标的评分数。这中间或多或少地会存在当事人的主观意识,不同的人可能会有截然不同的价值观念。因此就必须考虑当分配的权重系数或评分数在某一个范围内变化时,评价的结果将会产生怎样的变化。

定货批量的灵敏度分析

在分析整批间隔进货模型中,经济订货批量Q可用下式计算:

python 敏感度分析 python灵敏度分析_python 敏感度分析
式中python 敏感度分析 python灵敏度分析_算法_02为单位时间需求量,python 敏感度分析 python灵敏度分析_算法_03为每次订货的固定费用,python 敏感度分析 python灵敏度分析_线性代数_04为单位时间内每单位物资的保管费。它们一般都是根据统计资料估算的,与实际情况有所出入,需要进行灵敏度分析。用python 敏感度分析 python灵敏度分析_算法_05python 敏感度分析 python灵敏度分析_算法_06python 敏感度分析 python灵敏度分析_线性代数_07和Q分别表示实际的需求量、订货量、保管费和调整后的经济订货批量。python 敏感度分析 python灵敏度分析_算法_08python 敏感度分析 python灵敏度分析_python 敏感度分析_09,python 敏感度分析 python灵敏度分析_python 敏感度分析_10python 敏感度分析 python灵敏度分析_python 敏感度分析_11分别代表需求量、订货量、保管费和经济订货批量的相对变化值,即:
python 敏感度分析 python灵敏度分析_python 敏感度分析_12
通过计算后可得
代入具体的数值后便可用上式说明 python 敏感度分析 python灵敏度分析_算法_08python 敏感度分析 python灵敏度分析_python 敏感度分析_09python 敏感度分析 python灵敏度分析_python 敏感度分析_10对订货批量的综合影响程度。

二、一个通俗的例子对灵敏度分析的解释

一头牛重200斤,每天增重5斤,饲料每天花费45元。牛的市场价是每斤65元,但目前行情不好,每天下降1元,求出这头牛的最佳销售时间。

这是一个很简单的单变量优化问题。求这头牛的最佳销售时间,就是求卖出价格最高的时间,为了求出这个时间,我们假设:

销售时间 python 敏感度分析 python灵敏度分析_算法_16

牛的重量 python 敏感度分析 python灵敏度分析_权重_17

牛的价格 python 敏感度分析 python灵敏度分析_权重_18

饲料花费 python 敏感度分析 python灵敏度分析_算法_19

卖出牛的收益 python 敏感度分析 python灵敏度分析_python 敏感度分析_20

净收益 python 敏感度分析 python灵敏度分析_算法_21

于是有, python 敏感度分析 python灵敏度分析_权重_22 ,其中, python 敏感度分析 python灵敏度分析_权重_23python 敏感度分析 python灵敏度分析_算法_24

python 敏感度分析 python灵敏度分析_线性代数_25…………………………………(1)

容易得出当 python 敏感度分析 python灵敏度分析_权重_26 时,python 敏感度分析 python灵敏度分析_算法_21取最大值13320元。

其实,大多数情况下,问题到这里就已划上句号。但现实生活中,稍微细心一点,我们会发现,在上述模型的参数中,牛的重量,当前市场价格、每天饲料钱3个参数都是很容易测量的,即确定性较大,但牛的生长率和市场价格的下降率2个参数则不是那么好确定,例子中虽然规定了市场价格下降率python 敏感度分析 python灵敏度分析_python 敏感度分析_28元/天,但实际中,每天的 python 敏感度分析 python灵敏度分析_数学建模_29 都是不一样的。于是我们会有一个疑惑——是不是对于所有的市场价格下降率,这个模型都适用?

为了消除疑惑,我们分别随便选取原下降率(1元/天)周围的几个数python 敏感度分析 python灵敏度分析_数学建模_30来进行研究。

根据公式(1),分别得出 [公式] ,得下图:

python 敏感度分析 python灵敏度分析_算法_31


从图中可以看出,牛最佳卖出时间 python 敏感度分析 python灵敏度分析_算法_16 随着市场价格下降率 python 敏感度分析 python灵敏度分析_数学建模_29的变化而变化,这时候我们称:牛的卖出最佳时间 python 敏感度分析 python灵敏度分析_线性代数_34 对市场价格下降率 python 敏感度分析 python灵敏度分析_线性代数_35

但是究竟有多敏感,就要进行灵敏度分析(敲黑板!!!划重点!!!)。

灵敏度分析,就是将市场价格下降率 python 敏感度分析 python灵敏度分析_线性代数_35作为未知参数,计算最佳卖出时间 python 敏感度分析 python灵敏度分析_线性代数_34python 敏感度分析 python灵敏度分析_线性代数_35关系。这时候,将例子中的“每天下降1元”改成“每天下降 python 敏感度分析 python灵敏度分析_数学建模_29

python 敏感度分析 python灵敏度分析_数学建模_40

python 敏感度分析 python灵敏度分析_算法_21python 敏感度分析 python灵敏度分析_算法_16

python 敏感度分析 python灵敏度分析_权重_43

python 敏感度分析 python灵敏度分析_数学建模_44的点为

python 敏感度分析 python灵敏度分析_权重_45

至此,我们已经得到了一种灵敏性关系——python 敏感度分析 python灵敏度分析_算法_46 关系,绘制 python 敏感度分析 python灵敏度分析_算法_46 关系图如下:

python 敏感度分析 python灵敏度分析_python 敏感度分析_48


公式(2)和上图的意义在于——作为牛贩子,我能确定一个 python 敏感度分析 python灵敏度分析_线性代数_49 关系,确保我在不同 python 敏感度分析 python灵敏度分析_线性代数_35 下,都能确定最佳卖牛时间 python 敏感度分析 python灵敏度分析_线性代数_34 。当 python 敏感度分析 python灵敏度分析_python 敏感度分析_52 时,最佳卖出时间就由公式(2)给出;当 python 敏感度分析 python灵敏度分析_数学建模_53 时, python 敏感度分析 python灵敏度分析_线性代数_54 ,这会导致python 敏感度分析 python灵敏度分析_数学建模_55 是一个始终下降的曲线,这意味着,最佳卖牛时间为 python 敏感度分析 python灵敏度分析_数学建模_56 ,也就是说,一旦市场价格下降率 python 敏感度分析 python灵敏度分析_数学建模_53,需要当天就把牛卖掉,这时候饲养牛已经没有任何经济价值了。

然而,在实际使用中,我们更多地是将这种灵敏性关系表示成相对改变量或百分比改变的形式。例如, python 敏感度分析 python灵敏度分析_数学建模_29 的10%的下降,导致了 python 敏感度分析 python灵敏度分析_算法_16 的38%的增加。如果 python 敏感度分析 python灵敏度分析_算法_16 的改变量为 python 敏感度分析 python灵敏度分析_python 敏感度分析_61 ,则 python 敏感度分析 python灵敏度分析_算法_16 的相对改变量为 python 敏感度分析 python灵敏度分析_权重_63 ,百分比改变量为python 敏感度分析 python灵敏度分析_算法_64,如果python 敏感度分析 python灵敏度分析_数学建模_29 改变了 python 敏感度分析 python灵敏度分析_数学建模_66 ,导致 python 敏感度分析 python灵敏度分析_算法_16python 敏感度分析 python灵敏度分析_python 敏感度分析_61 的改变量,则相对改变量的比值为python 敏感度分析 python灵敏度分析_权重_63python 敏感度分析 python灵敏度分析_线性代数_70 的比值,令 python 敏感度分析 python灵敏度分析_python 敏感度分析_71 ,由导数定义,有
python 敏感度分析 python灵敏度分析_python 敏感度分析_72
业内,称极限值python 敏感度分析 python灵敏度分析_权重_73就是 python 敏感度分析 python灵敏度分析_算法_16python 敏感度分析 python灵敏度分析_数学建模_29灵敏性,记为 python 敏感度分析 python灵敏度分析_权重_76

灵敏性有啥用?

比如,在这个例子中,有
python 敏感度分析 python灵敏度分析_线性代数_77

在点 python 敏感度分析 python灵敏度分析_python 敏感度分析_28python 敏感度分析 python灵敏度分析_权重_26

python 敏感度分析 python灵敏度分析_线性代数_80

也就是说,在点python 敏感度分析 python灵敏度分析_python 敏感度分析_81=python 敏感度分析 python灵敏度分析_线性代数_82若市场价格下降率 python 敏感度分析 python灵敏度分析_线性代数_35 增加 1%,则最佳卖牛时间 python 敏感度分析 python灵敏度分析_线性代数_34

本例仅分析了市场价格下降率 [公式] 和最佳卖牛时间 [公式]的灵敏性关系,但可能还存在其他的关系,比如牛的重量增长率和最佳卖牛时间 [公式]的关系等,灵敏性分析的成功需要分析者具有较好的判断力,通常我们不需要对模型中的每个参数都进行灵敏性分析,只需要选择那些有较大不确定性的参数进行灵敏性分析即可。

如何判断灵敏度分析的效果?
先摆出结果:

如果你改变了系统参数后,引起这个模型(公式)输出的变化的程度不大,则说明你的模型稳定性较强(即灵敏性较差),反之则反!

用上述例子说明,

python 敏感度分析 python灵敏度分析_线性代数_85


python 敏感度分析 python灵敏度分析_数学建模_29 改变了1%, python 敏感度分析 python灵敏度分析_算法_16 仅下降3.5%,这个改变很小,这就可以说明模型较为稳定;若 python 敏感度分析 python灵敏度分析_数学建模_29 改变了1%, python 敏感度分析 python灵敏度分析_算法_16

三、灵敏度分析的方法

有多种方法可以进行敏感性分析:

主要有两种分析灵敏度的方法:

局部敏感性分析
全局敏感性分析
局部灵敏度分析是基于 (偏)导数 的分析。该方法适用于简单的成本函数,不适用于复杂模型,因为多数复杂模型目标函数不总连续。

局部敏感度分析是一项 一次性 (OAT)技术,可以一次分析一个参数对成本函数的影响,同时保持其他参数不变。

全局灵敏度分析通常使用蒙特卡洛技术实现。这种方法使用了一组全局样本来探索设计空间。

四、灵敏度分析的具体实例

【例】 一家彩电制造商计划推出两种新产品:一种19英寸液晶平板电视机,制造商建议零售价为339美元;另一种21英寸液晶平板电视机,零售价为399美元。公司付出的成本为19英寸彩电每台195美元,21英寸彩电每台225美元,还要加上400000美元的固定成本。在竞争的销售市场中,每年售出的彩电数量会影响彩电的平均售价。据统计,对每种类型的彩电,每多售出一台,平均销售价格会下降1美分。而且19英寸彩电的销售会影响21英寸彩电的销售,反之亦然。据估计,每售出一台21英寸彩电,19英寸彩电的平均售价会下降0.3美分,而每售出一台19英寸彩电,21英寸彩电的平均售价会下降0.4美分。问题是:每种彩电应该各生产多少台?
解:
采用处理数学建模问题的五步方法来解决这个问题。
第一步:提出问题。列出一张变量表。

表3.1 彩电问题第一步的结果

变量

x1=19英寸彩电每年的售出数量/台

x2=21英寸彩电每年的售出数量/台

p1=19英寸彩电每年的销售价格/美元

p2=21英寸彩电每年的销售价格/美元

c=生产彩电的成本/(美元/年)

r=彩电销售的收入/(美元/年)

f=彩电销售的利润/(美元/年)

假设

python 敏感度分析 python灵敏度分析_算法_95

目标

python 敏感度分析 python灵敏度分析_算法_95的最大值

第二步:选择一个建模方法。本问题视为无约束多变量最优化问题。
第三步:根据第二步中选择的建模方法推导模型的公式。

python 敏感度分析 python灵敏度分析_算法_95
python 敏感度分析 python灵敏度分析_python 敏感度分析_98为求最大值的目标函数,python 敏感度分析 python灵敏度分析_算法_99为决策变量。现在问题转化为在区域
python 敏感度分析 python灵敏度分析_python 敏感度分析_100
上对
python 敏感度分析 python灵敏度分析_线性代数_101
求最大值。

第四步:求解模型。

python 敏感度分析 python灵敏度分析_算法_102

python 敏感度分析 python灵敏度分析_权重_103


最后的步骤是用通俗易懂的语言回答问题。简单地说,这家公司可以通过生产4735台19英寸彩电和7043台21英寸彩电来获得最大利润,每年获得的净利润为553641.025美元。每台19英寸彩电的平均售价为270.52元,每台21英寸彩电的平均售价为309.63元。生产的总支出为2908000元,相应的利润率为19%。这些结果显示了这是有利可图的,因此建议这家公司应该实行推出新产品的计划。


那么这样问题结束了吗?
对于数学建模而言,我们光建立模型是远远不够的,我们需要验证我们的模型是否稳定。
下面我们针对本题进行灵敏度分析:

上面所得出的结论是以表中所做的假设为基础的。应该对我们关于彩电市场和生产过程所做的假设进行灵敏度分析,以保证结果具有稳健性。我们主要关心的是决策变量 和 的值,因为公司要据此来确定生产量。

python 敏感度分析 python灵敏度分析_线性代数_104


python 敏感度分析 python灵敏度分析_权重_105


python 敏感度分析 python灵敏度分析_数学建模_106


python 敏感度分析 python灵敏度分析_线性代数_107

python 敏感度分析 python灵敏度分析_python 敏感度分析_108


python 敏感度分析 python灵敏度分析_python 敏感度分析_109


python 敏感度分析 python灵敏度分析_算法_110


python 敏感度分析 python灵敏度分析_权重_111


python 敏感度分析 python灵敏度分析_权重_112


python 敏感度分析 python灵敏度分析_python 敏感度分析_113


python 敏感度分析 python灵敏度分析_线性代数_114


python 敏感度分析 python灵敏度分析_线性代数_115


python 敏感度分析 python灵敏度分析_数学建模_116


python 敏感度分析 python灵敏度分析_线性代数_117


python 敏感度分析 python灵敏度分析_算法_118


python 敏感度分析 python灵敏度分析_算法_119

灵敏度分析代码如下(示例):

%灵敏度分析的Matlab程序如下:
clc, clear, close all, format long g
syms x1 x2 a %定义符号变量
f=(339-a*x1-0.003*x2)*x1+(399-0.004*x1-0.01*x2)*x2-(400000+195*x1+225*x2)
f=simplify(f) %化简目标函数
f1=diff(f,x1), f2=diff(f,x2)  %求目标函数关于x1,x2的偏导数
[x10,x20]=solve(f1,f2)  %求驻点
pretty(x10), pretty(x20)  %以书写习惯的方式显示
subplot(121), fplot(x10,[0.002,0.02]), title('')  %画x1关于a的曲线
xlabel('$a$','Interpreter','Latex')
ylabel('$x_1$','Interpreter','Latex','Rotation',0)
subplot(122), fplot(x20,[0.002,0.02]), title('')  %画x2关于a的曲线
xlabel('$a$','Interpreter','Latex')
ylabel('$x_2$','Interpreter','Latex','Rotation',0)
dx1=diff(x10,a), dx10=subs(dx1,a,0.01), dx10=double(dx10)
sx1a=dx10*0.01/4735
dx2=diff(x20,a), dx20=subs(dx2,a,0.01), dx20=double(dx20)
sx2a=dx20*0.01/7043  
F=subs(f,{x1,x2},{x10,x20}) %求关于a的目标函数
F=simplify(F)  %对目标函数进行化简
figure, fplot(F,[0.002,0.02]), title('')
xlabel('$a$','Interpreter','Latex')
ylabel('$y$','Interpreter','Latex','Rotation',0)
Sya=-4735^2*0.01/553641
f3=subs(f,{x1,x2,a},{4735,7043,0.011}); f3=double(f3)  %计算近似最优利润
f4=subs(F,a,0.011); f4=double(f4)  %计算最优利润
delta=(f4-f3)/f4  %计算利润的相对误差

五、总结

很爽啊,尤其是最后用图片不用打字,哈哈哈哈...... 反正灵敏度分析这个东西并不难理解,数学原理也比较贴近生活,代码也比较易懂,但却相当重要。运筹学的灵敏度分析的纯代数解法,我将在《线性规划的实例赏析》中提及。《线性规划的实例赏析》将会是这学期所学的规划类问题的最后一章blog了,从理论到实践,从纯数学原理到与代码相结合,这个过程本身是很有意思的。那么我队友也完成了非线性规划的博客,这样一来,我们建模小组的第一类规划问题就先接近尾声了。