【2023年APMCM亚太杯C题】完整代码+结果分析+论文框架
2023年APMCM亚太杯C大学生数模竞赛C题
2023年APMCM亚太杯C题
完整代码+结果分析+论文框架
新能源汽车是指采用先进的技术原理、新技术和新结构,以非常规车用燃料为动力源(非常规车用燃料是指汽油和柴油以外的燃料),并集成了先进的汽车动力控制和驱动技术的汽车。新能源汽车包括四大类型:混合动力电动汽车、纯电动汽车、燃料电池电动汽车和其他新能源汽车。作为新能源汽车的一种,新能源电动汽车因其低污染、低能耗、可调节用电高峰等特性,近年来得到了快速发展。包括电动公交车和7座以下家用电动汽车在内的新能源电动汽车受到了全球消费者和政府的青睐。
2011年以来,中国政府积极推动新能源电动汽车的发展,并制定了一系列优惠政策。新能源电动汽车产业取得了巨大的发展,逐渐成为继 "中国高铁 "之后的又一个中国符号。
目前已经完成全部的代码以及论文框架,有需要的小伙伴欢迎留言哦
第一问
分析影响中国新能源电动汽车发展的主要因素,建立数学模型,并说明这些因素对中国新能源电动汽车发展的影响。
问题分析
题目要求建立数学模型分析影响中国新能源电动汽车发展的主要因素。在该问中,题目并没有要求对数据进行收集处理,可理解为倾向于主观分析的题目。故在进行求解时需要做到两个方面:一、利用系统化的评判方法(如AHP)对影响因素进行分析,避免完全主观得出结论缺少理论依据;二、在选择讨论的因素时应当围绕新能源汽车的“发展”,而不是仅局限于“销量”,在这个部分可对下文的模型建立进行铺垫。
技术文档
1 基于AHP的新能源汽车发展影响因素分析
1.1 AHP模型的构建
1.2 AHP模型的求解
代码
clc
clear
A=xlsread('AHP判断矩阵.xlsx');
[n,n] = size(A);
[V,D] = eig(A); %求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。
Max_eig = max(max(D));
[r,c]=find(D == Max_eig , 1);
disp('特征值法求权重的结果为:');
w=V(:,c) ./ sum(V(:,c));
disp( w )
% % % % % % % % % % % % %下面是计算一致性比例CR的环节% % % % % % % % % % % % %
CI = (Max_eig - n) / (n-1);
RI=[0 0.0001 0.52 0.89 1.12 1.26 1.36 1.41 1.46 1.49 1.52 1.54 1.56 1.58 1.59]; %注意哦,这里的RI最多支持 n = 15
% 这里n=2时,一定是一致矩阵,所以CI = 0,我们为了避免分母为0,将这里的第二个元素改为了很接近0的正数
CR=CI/RI(n);
disp('一致性指标CI=');disp(CI);
disp('一致性比例CR=');disp(CR);
if CR<0.10
disp('因为CR<0.10,所以该判断矩阵A的一致性可以接受!');
else
disp('注意:CR >= 0.10,因此该判断矩阵A需要进行修改!');
end
第二问
收集中国新能源电动汽车的行业发展数据,建立数学模型,描述并预测未来10年中国新能源电动汽车的发展。
问题分析
题目要求收集中国新能源电动汽车的行业发展数据,建立数学模型,描述并预测未来10年中国新能源电动汽车的发展。在本问中,可利用第一问所考虑的影响因素(例如销量、充电桩数量、相关专利数量等)对行业发展状态进行描述。同时,由题目中所述:“2011年以来,…”,说明本文所考虑的历史数据主要集中为2011年及以后的年度数据。此时,应当考虑可供参考的历史数据量较少,故不宜直接使用某一单一模型对未来数据进行预测。在本问中,可以考虑使用混合模型或集成模型对未来10年的数据进行预测。在得到预测数据后,可基于问题一所分析得的影响程度对各因素的影响进行基于权重的综合评价。
技术文档
2 基于自适应ARIMA-非线性回归模型的影响因素预测
在本章中,基于自适应ARIMA-非线性回归模型对表征新能源发展情况的三个因素未来十年的数值分别进行预测。并基于问题一中所构建的AHP模型求得的影响程度综合计算未来10年中国新能源电动汽车的发展情况。
2.1 ARIMA模型的建立
2.2 非线性回归模型的建立
2.3 自适应混合ARIMA-非线性回归模型的建立
ARIMA模型的求解
2.5 非线性回归模型的求解
代码
ARIMA.m
function [forData]=ARIMA(data,step)
ddata=data;
d=0;
while kpsstest(ddata)==1
ddata = diff(data);
d=d+1;
if d>3
break
end
end
% 数据平稳性测试
% adftest(data)
% kpsstest(data)
%
% % 一阶差分并平稳性检验
% ddata = diff(data);
% d1_adf = adftest(ddata);
% d1_kpss = kpsstest(ddata);
%% 计算pq取值
pmax = 3;
qmax = 3;
% d = 1;
[p q ]=findPQ(data,pmax,qmax,d);
%% 构建模型
% p = 3;q = 4;
Mdl = arima(p, d, q); %第二个变量值为1,即一阶差分
EstMdl = estimate(Mdl,data);
%% 模型预测
% step = 10; %预测多少期
[forData,YMSE] = forecast(EstMdl,step,'Y0',data);
%matlab2018及以下版本写为Predict_Y(i+1) = forecast(EstMdl,1,'Y0',Y(1:i));
% lower = forData - 1.96*sqrt(YMSE); %95置信区间下限
% upper = forData + 1.96*sqrt(YMSE); %95置信区间上限
figure
plot(1:length(data),data)
hold on
plot((length(data)+1):length(data)+step,forData)
hold on
hXLabel = xlabel('Year');
hYLabel = ylabel('Number of patents applied for by new energy vehicle enterprises');
set(gcf,'Color',[1 1 1])
% plot((length(data)+1):length(data)+step,lower)
% plot((length(data)+1):length(data)+step,upper)
%% 计算p和q的函数
function [p q] = findPQ(data,pmax,qmax,d)
data = reshape(data,length(data),1);
LOGL=zeros(pmax+1,qmax+1);
PQ=zeros(pmax+1,qmax+1);
for p=0:pmax
for q=0:qmax
model=arima(p,d,q);
[fit,~,logL]=estimate(model,data); %指定模型的结构
LOGL(p+1,q+1)=logL;
PQ(p+1,q+1)=p+q; %计算拟合参数的个数
end
end
LOGL=reshape(LOGL,(pmax+1)*(qmax+1),1);
PQ=reshape(PQ,(pmax+1)*(qmax+1),1);
m2 = length(data);
[aic,bic]=aicbic(LOGL,PQ+1,m2);
aic0 = reshape(aic,(pmax+1),(qmax+1));
bic0= reshape(bic,(pmax+1),(qmax+1));
aic1 = min(aic0(:));
index = aic1==aic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p0 = pp(index);
q0 = qq(index);
aic2 = min(bic0(:));
index = aic2==bic0;
[pp qq] = meshgrid(0:pmax,0:qmax);
p1 = pp(index);
q1 = qq(index);
if p0^2+q0^2> p1^2+q1^2
p = p1;
q = q1;
else
p = p0;
q = q0;
end
end
end
NR.m
clc
clear
data=xlsread('新能源车企申请专利数量');
table=data(1:end,2)';
refer_date=size(data,2); %参考期
step=10; %预测未来15期
%% 下面是回归
i=1;
%只获取有历史数据的阶段
lr_data=table;
%通过LR算法进行预测
[k]=polyfit(1:size(lr_data,2),lr_data,3);
x=[refer_date+1:refer_date+step];
for kk=1:length(x)
% forData(kk)=k(1)*x(kk).^4+k(2)*x(kk).^3+k(3)*x(kk).^2+k(4)*x(kk)+k(5);
forData(kk)=k(3)*x(kk).^3+k(2)*x(kk).^2+k(3)*x(kk)+k(4);
end
figure
plot(1:length(lr_data),lr_data)
hold on
plot((length(lr_data)):length(lr_data)+step,[lr_data(end) forData])
hold on
hXLabel = xlabel('Year');
hYLabel = ylabel('Number of patents applied forby new energy vehicle enterprises');
set(gcf,'Color',[1 1 1])
Q2_1.m
clc
c
lear
data=xlsread('新能源车企申请专利数量');
data=data(1:end-1,2);
step=1;
[forData]=ARIMA(data,step);
完成代码与论文获取
需要完整数据与思路的同学可以在评论问留言哦~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)