matlab数学公式迭代计算,Logistic三种迭代算法公式推导及matlab代码实现

Logistic曲线的参数估计

作者qq:2377389590欢迎探讨。

闲着无聊整理了一下课程设计的作业,老师给了我们数学模型,让我们根据数学模型原理写代码,因为小编从刚上大一就开始自学Matlab,《电力符合预测》这门课的老师以为我们三个班都会,其实三个班就是我一个人看懂并写出来了,最后三个班上交了一样的代码,幸好老师没有应为一样而我们挂科。聪明的小编,在此夸夸自己。废话少说,原理如下:

1844或1845年,比利时数学家Pierre François Verhulst提出了logistic方程,这是一个对S型曲线进行数学描述的模型。一百多年来,这个方程多次应用于一些特殊的领域建模与预测,例如单位面积内某种生物的数量、人口数量等社会经济指标、某种商品(例如手机)的普及率等。

logistic方程定义如下:

583ded42a65e6850781e07d38e981de9.gif                                                         (1)

其中,t通常表示时间变量, 为模型的参数;当趋势比较完整时   a>0  b<0  c>0;其曲线如图1所示:

a262341909e49aacc859c72119acb87f.png

根据1图和(1)方程式得:当

1349ebbb8af3d04af90fe7dac11f6db6.gif时,

b705b592c6d2eee3daabe478b430011a.gif ;当

41f8534f1230c706748cd44884b4ade0.gif 时,

861f8979fdcdb703bb355492b4f2d8e9.gif。为了研究Logistic曲线的增长特性,对(1)式求导一阶导数得:

cc57ae0c5643932dd82be4b9e6627bcc.gif

设xt(t=1, 2, …, n)为观测样本,对于logistic方程的参数,常规的估计方法有三种。

1.1、Yule算法:

bd670f2f03032b91599836de45e9bb62.gif                     (2)

根据式(1)有

18e6a5a7e04be97b9b8d219da1b3a5d8.gif,

45e8364fc8276b55cf4f7877eca923b7.gif,以及

e2115aae154e560c75c4df8aa5d47195.gif则式(2)变形为线性方程,

60c60ea2fef876474c92f8d7a7a9c0a1.gif利用普通最小二乘(OLS)方法可以得到这个方程参数的估计值,b和c的估计值也可以进一步得到。

为得到a的估计值,将式(1)变形为:

edf2049bb6504a02994382af033a1641.png

1.2、Rhodes算法:

根据式(1),有

ab3352a59e51ca4ff6f4024bae2d47e5.png

普通最小二乘(OLS)方法得到这个方程参数的估计值,并进一步得到b和c的估计值,然后利用式(3)-式(5)的方法得到a的估计值

1.3、Nair算法:

(2)式可以进一步写为:

1852cc7f86a7fa70e3439ebbecf40669.png

ac8e03b44f21146a76c5e57a287e943d.png

2.、matlab算法实现

中国1965-2011年CO2排放量(单位:亿吨)如表1所示:(备注:这是上课老师给的数据)

表1中国1965-2011年CO2排放量

1965

1966

1967

1968

1969

1970

1971

1972

1973

1974

480.9

522.0

468.8

469.5

573.8

737.8

869.8

933.7

977.2

997.7

1975

1976

1977

1978

1979

1980

1981

1982

1983

1984

1120.3

1176.1

1284.8

1422.1

1462.1

1499.7

1473.1

1539.2

1637.0

1771.0

1985

1986

1987

1988

1989

1990

1991

1992

1993

1994

1886.5

1994.6

2145.7

2292.0

2396.8

2387.0

2484.4

2580.8

2750.2

2915.7

1995

1996

1997

1998

1999

2000

2001

2002

2003

2004

3163.8

3231.9

3319.5

3319.6

3484.0

3550.6

3613.9

3833.1

4471.2

5283.0

2005

2006

2007

2008

2009

2010

2011

5803.2

6415.5

6797.9

7033.5

7636.3

8209.8

8979.1

用logistic方程模拟我国CO2排放量的变化趋势,分别用三种方法估计方程参数,并分别计算三种方法的MAPE及未来五年CO2排放量的预测结果。

2.1.Yule算法:

clear;clc;

%Yule算法

%author:zhuweijie

%E-mail:2377389590@qq.com

%date:2018-1-24

X=[480.9,522,468.8,469.5,573.8,737.8,869.8,933.7,977.2,...

997.7,1120.3,1176.1,1284.8,1422.1,1462.1,1499.7,...

1473.1,1539.2,1637,1771,1886.5,1994.6,2145.7,2292,...

2396.8,2387,2484.4,2580.8,2750.2,2915.7,3163.8,3231.9,...

3319.5,3319.6,3484.,3550.6,3613.9,3833.1,4471.2,5283,...

5803.2,6415.5,6797.9,7033.5,7636.3,8209.8,8979.1]

n=length(X)-1

for t=1:n

Z(t)=(X(t+1)-X(t))/X(t+1)

end

X1=[ones(46,1) X(1:n)']

Y=Z'

[B,Bint,r,rint,stats]=regress(Y,X1)% 最小二乘(OLS)

gamma=B(1,1)

beta=B(2,1)

b=log(1-gamma)

c=beta/(exp(b)-1)

a=exp((sum(log(1./X(1:n)-c))-n*(n+1)*b/2)/n)

XX=1965:2016

YY=1./(c+a*exp(b*([XX-1965])))

plot(XX,YY,'r-o')

hold on

plot(XX(1:length(X)),X,'g-^')

legend('预测值','实际值')

xlabel('年份');ylabel('CO_{2}排放量');

title('CO_{2}预测值和实际值曲线图(Yule法)')

set(gca,'XTick',[1965:2:2017])

grid on

format short;

forecast=YY(end-4:end)%CO2排放量的预测结果

MAPE=sum(abs(YY(1:n+1)-X)./X)/length(X)%平均相对差值

a,b,c

276644e400c39eb75121dc0fd6c9fdbd.png

2.2.Rhodes算法:

clear;clc;

%Rhodes算法:

%author:zhuweijie

%E-mail:2377389590@qq.com

%date:2018-1-24

X=[480.9,522,468.8,469.5,573.8,737.8,869.8,933.7,977.2,...

997.7,1120.3,1176.1,1284.8,1422.1,1462.1,1499.7,...

1473.1,1539.2,1637,1771,1886.5,1994.6,2145.7,2292,...

2396.8,2387,2484.4,2580.8,2750.2,2915.7,3163.8,3231.9,...

3319.5,3319.6,3484.,3550.6,3613.9,3833.1,4471.2,5283,...

5803.2,6415.5,6797.9,7033.5,7636.3,8209.8,8979.1]

n=length(X)-1

for t=1:n

Z(t)=1/X(t+1)

S(t)=1/X(t)

end

X1=[ones(46,1) S(1:n)']

Y=Z'

[B,Bint,r,rint,stats]=regress(Y,X1)% 最小二乘(OLS)

gamma=B(1,1)

beta=B(2,1)

b=log(beta)

c=gamma/(1-exp(b))

a=exp((sum(log(1./X(1:n+1)-c))-(n+1)*(n+2)*b/2)/(n+1))

XX=1965:2016

YY=1./(c+a*exp(b*([XX-1965])))

plot(XX,YY,'r-o')

hold on

plot(XX(1:length(X)),X,'k-^')

set(gca,'XTick',[1965:2:2017])

legend('预测值','实际值')

xlabel('年份');ylabel('CO_{2}排放量');

title('CO_{2}预测值和实际值曲线图(Rhodes法)')

grid on

format short;

forecast=YY(end-4:end)%CO2排放量的预测结果

MAPE=sum(abs(YY(1:n+1)-X)./X)/length(X)%平均相对差值

a,b,c

8abb01c4f49043f0de13d8aaa0b0382d.png

2.3.Nair算法:

clear;clc;

%Nair算法

%author:zhuweijie

%E-mail:2377389590@qq.com

%date:2018-1-24

X=[480.9,522,468.8,469.5,573.8,737.8,869.8,933.7,977.2,...

997.7,1120.3,1176.1,1284.8,1422.1,1462.1,1499.7,...

1473.1,1539.2,1637,1771,1886.5,1994.6,2145.7,2292,...

2396.8,2387,2484.4,2580.8,2750.2,2915.7,3163.8,3231.9,...

3319.5,3319.6,3484.,3550.6,3613.9,3833.1,4471.2,5283,...

5803.2,6415.5,6797.9,7033.5,7636.3,8209.8,8979.1]

n=length(X)-1

for t=1:n

Z(t)=1/X(t)-1/X(t+1)

S(t)=1/X(t)+1/X(t+1)

end

X1=[ones(46,1) S(1:n)']

Y=Z'

[B,Bint,r,rint,stats]=regress(Y,X1)% 最小二乘(OLS)

gamma=B(1,1)

beta=B(2,1)

b=log((1-beta)/(1+beta))

c=gamma*(1+exp(b))/(2*(exp(b)-1))

a=exp((sum(log(1./X(1:n)-c))-n*(n+1)*b/2)/n)

XX=1965:2016

YY=1./(c+a*exp(b*([XX-1965])))

plot(XX,YY,'r-o')

hold on

plot(XX(1:length(X)),X,'g-^')

legend('预测值','实际值')

xlabel('年份');ylabel('二氧化碳排放量');

title('二氧化碳预测值和实际值曲线图(Nair法)')

set(gca,'XTick',[1965:2:2017])

grid on

format short;

forecast=YY(end-4:end)%CO2排放量的预测结果

MAPE=sum(abs(YY(1:n+1)-X)./X)/length(X)%平均相对差值

a,b,c

8ef063f83b457ec0a2d531b19bb928c6.png

根据编程计算,三种方法参数估计的结果及MAPE如表1所示:

三种方法的参数估计结果及误差分析结果

a

b

c

MAPE

Yule算法

0.0020

-0.0580

-0.000024579

0.1141

Rhodes算法

0.0019

-0.0802

0.00010960

0.1259

Nair算法

0.0023

-0.0683

0.000016564

0.1271

三种方法对未来五年CO2排放量的预测结果(单位:百万吨)如表2所示:

中国CO2排放量的预测结果

2012

2013

2014

2015

2016

Yule算法

9167

9847

10587

11396

12282

Rhodes算法

6476.7

6624.9

6767.8

6905.3

7037.3

Nair算法

9050

9588

10152

10742

11359

如果想要最原始的文件和代码可以查看我上传的资源,源码下载地址

转载请备注

欢迎加群:707914447

505905.html

a22ab2662b1f08a30c973728b3a9c1bc.png

dff8ba95d11d03025fea3c414dcfd08e.png

47a6071f9a43f6911c1a926c3bac2bd9.png

7df6952978eceaf5777fb034be2b806c.png

64f328287da61c52114c3be4826c6446.png

0a042744e6e3595fefbaaf11ab6f9f9f.png

b31cb92009b293badefb8c1522d66efa.png

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
混沌映射粒子群算法是一种基于粒子群算法(Particle Swarm Optimization, PSO)和混沌映射的优化算法。它通过引入混沌映射来增加算法的随机性和搜索能力,从而提高了算法的收敛速度和全局搜索能力。 以下是混沌映射粒子群算法迭代过程的MATLAB代码示例: ```matlab % 设置算法参数 maxIter = 100; % 最大迭代次数 popSize = 50; % 粒子群大小 dim = 2; % 解向量维度 % 初始化粒子群位置和速度 pos = rand(popSize, dim); % 随机初始化位置 vel = zeros(popSize, dim); % 初始速度为0 % 初始化个体最佳位置和适应度 pBestPos = pos; % 初始个体最佳位置与当前位置相同 pBestFitness = zeros(popSize, 1); % 初始个体最佳适应度为0 % 初始化全局最佳位置和适应度 gBestPos = zeros(1, dim); % 初始全局最佳位置为0向量 gBestFitness = Inf; % 初始全局最佳适应度为无穷大 % 迭代优化过程 for iter = 1:maxIter % 计算适应度值 fitness = calculateFitness(pos); % 更新个体最佳位置和适应度 updateIndices = fitness < pBestFitness; pBestPos(updateIndices, :) = pos(updateIndices, :); pBestFitness(updateIndices) = fitness(updateIndices); % 更新全局最佳位置和适应度 [minFitness, minIndex] = min(pBestFitness); if minFitness < gBestFitness gBestPos = pBestPos(minIndex, :); gBestFitness = minFitness; end % 更新粒子速度和位置 w = 0.8; % 惯性权重 c1 = 2; % 学习因子1 c2 = 2; % 学习因子2 r1 = rand(popSize, dim); r2 = rand(popSize, dim); vel = w * vel + c1 * r1 .* (pBestPos - pos) + c2 * r2 .* (repmat(gBestPos, popSize, 1) - pos); pos = pos + vel; % 应用混沌映射 pos = chaosMapping(pos); end % 输出结果 disp(['最优解向量:', num2str(gBestPos)]); disp(['最优适应度值:', num2str(gBestFitness)]); % 计算适应度函数(示例) function fitness = calculateFitness(pos) % TODO: 根据具体问题定义适应度函数 % 这里假设适应度函数为解向量各分量的平方和 fitness = sum(pos.^2, 2); end % 混沌映射函数(示例) function pos = chaosMapping(pos) % TODO: 根据具体问题选择合适的混沌映射函数 % 这里假设使用Logistic混沌映射 r = 3.9; % 控制参数 x = pos(:, 1); y = pos(:, 2); for i = 1:length(x) for j = 1:100 % 迭代次数 x(i) = r * x(i) * (1 - x(i)); y(i) = r * y(i) * (1 - y(i)); end end pos(:, 1) = x; pos(:, 2) = y; end ``` 希望以上代码能够帮助到你!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值