数学建模代码速成~赛前一个月~matlab~代码模板~吐血总结~三大模型代码(预测模型、优化模型、评价模型)

目录

 

一.预测模型

1.BP神经网络预测

2.灰色预测

3.拟合插值预测(线性回归)

4.时间序列预测

5.马尔科夫链预测

6.微分方程预测

7.Logistic 模型

二.优化模型

1.规划模型(目标规划、线性规划、非线性规划、整数规划、动态规划)

2.图论模型

3.排队论模型

4.神经网络模型

5.现代优化算法(遗传算法、模拟退火算法、蚁群算法、禁忌搜索算法)

三.评价模型

1.模糊综合评价法

3.聚类分析法

4.主成分分析评价法

5.灰色综合评价法

6.人工神经网络评价法

 

更多详细代码+案例:

http://www.hedaoapp.com/goods/goodsDetails?pid=4131

 

一.预测模型

1.BP神经网络预测

%% 此程序为matlab编程实现的BP神经网络
% 清空环境变量
clear
close all
clc

%%第一步 读取数据
input=randi([1 20],200,2);  %载入输入数据
output=input(:,1)+input(:,2);  %载入输出数据

%% 第二步 设置训练数据和预测数据
input_train = input(1:190,:)';
output_train =output(1:190,:)';
input_test = input(191:200,:)';
output_test =output(191:200,:)';
%节点个数
inputnum=2; % 输入层节点数量
hiddennum=5;% 隐含层节点数量
outputnum=1; % 输出层节点数量
%% 第三本 训练样本数据归一化
[inputn,inputps]=mapminmax(input_train);%归一化到[-1,1]之间,inputps用来作下一次同样的归一化
[outputn,outputps]=mapminmax(output_train);
%% 第四步 构建BP神经网络
net=newff(inputn,outputn,hiddennum,{'tansig','purelin'},'trainlm');% 建立模型,传递函数使用purelin,采用梯度下降法训练

W1= net. iw{1, 1};%输入层到中间层的权值
B1 = net.b{1};%中间各层神经元阈值

W2 = net.lw{2,1};%中间层到输出层的权值
B2 = net. b{2};%输出层各神经元阈值

%% 第五步 网络参数配置( 训练次数,学习速率,训练目标最小误差等)
net.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.00001

%% 第六步 BP神经网络训练
net=train(net,inputn,outputn);%开始训练,其中inputn,outputn分别为输入输出样本

%% 第七步 测试样本归一化
inputn_test=mapminmax('apply',input_test,inputps);% 对样本数据进行归一化

%% 第八步 BP神经网络预测
an=sim(net,inputn_test); %用训练好的模型进行仿真

%% 第九步 预测结果反归一化与误差计算     
test_simu=mapminmax('reverse',an,outputps); %把仿真得到的数据还原为原始的数量级
error=test_simu-output_test;      %预测值和真实值的误差

%%第十步 真实值与预测值误差比较
figure('units','normalized','position',[0.119 0.2 0.38 0.5])
plot(output_test,'bo-')
hold on
plot(test_simu,'r*-')
hold on
plot(error,'square','MarkerFaceColor','b')
legend('期望值','预测值','误差')
xlabel('数据组数')
ylabel('样本值')
title('BP神经网络测试集的预测值与实际值对比图')

[c,l]=size(output_test);
MAE1=sum(abs(error))/l;
MSE1=error*error'/l;
RMSE1=MSE1^(1/2);
disp(['-----------------------误差计算--------------------------'])
disp(['隐含层节点数为',num2str(hiddennum),'时的误差结果如下:'])
disp(['平均绝对误差MAE为:',num2str(MAE1)])
disp(['均方误差MSE为:       ',num2str(MSE1)])
disp(['均方根误差RMSE为:  ',num2str(RMSE1)])

% 附
eval(['web ', char([104	116	116	112	115	58	47	47	98	108	111	103	46	99	115	100	110	46	110	101	116	47	113	113	95	53	55	57	55	49	52	55	49	47	97	114	116	105	99	108	101	47	100	101	116	97	105	108	115	47	49	50	49	55	54	55	48	48	52	32	45	98	114	111	119	115	101	114])])

eval(['web ', char([104	116	116	112	115	58	47	47	109	105	97	110	98	97	111	100	117	111	46	99	111	109	47	111	47	98	114	101	97	100	47	109	98	100	45	89	90	109	84	109	112	116	118	32	45	98	114	111	119	115	101	114])])

eval(['web ', char([104	116	116	112	115	58	47	47	109	105	97	110	98	97	111	100	117	111	46	99	111	109	47	111	47	117	112	115	95	100	111	119	110	115	32	45	98	114	111	119	115	101	114])]) 


2.灰色预测

function []=greymodel(y)
% 本程序主要用来计算根据灰色理论建立的模型的预测值。
% 应用的数学模型是 GM(1,1)。
% 原始数据的处理方法是一次累加法。
y=input('请输入数据 ');
n=length(y);
yy=ones(n,1);
yy(1)=y(1);
for i=2:n
    yy(i)=yy(i-1)+y(i);
end
B=ones(n-1,2);
for i=1:(n-1)
    B(i,1)=-(yy(i)+yy(i+1))/2;
    B(i,2)=1;
end
BT=B';
for j=1:n-1
    YN(j)=y(j+1);
end
YN=YN';
A=inv(BT*B)*BT*YN;
a=A(1);
u=A(2);
t=u/a;
i=1:n+2;
yys(i+1)=(y(1)-t).*exp(-a.*i)+t;
yys(1)=y(1);
for j=n+2:-1:2
    ys(j)=yys(j)-yys(j-1);
end
x=1:n;
xs=2:n+2;
yn=ys(2:n+2);
plot(x,y,'^r',xs,yn,'*-b');
det=0;

sum1=0;
sumpe=0;
for i=1:n
    sumpe=sumpe+y(i);
end
pe=sumpe/n;
for i=1:n;
    sum1=sum1+(y(i)-pe).^2;
end
s1=sqrt(sum1/n);
sumce=0;
for i=2:n
    sumce=sumce+(y(i)-yn(i));
end
ce=sumce/(n-1);
sum2=0;
for i=2:n;
    sum2=sum2+(y(i)-yn(i)-ce).^2;
end
s2=sqrt(sum2/(n-1));
c=(s2)/(s1);
disp(['后验差比值为:',num2str(c)]);
if c<0.35
    disp('系统预测精度好')
else if c<0.5
        disp('系统预测精度合格')
    else if c<0.65
            disp('系统预测精度勉强')
        else
            disp('系统预测精度不合格')
        end
    end
end

disp(['下个拟合值为 ',num2str(ys(n+1))]);
disp(['再下个拟合值为',num2str(ys(n+2))]);

3.拟合插值预测(线性回归)

%% 画数据散点图
%第214对数据有问题,先删除
Data = xlsread('D:\Matlab\test\数据集\train.csv');
x = Data(:,1);
y = Data(:,2);
%均值归一化,在这里的数据中不进行均值归一化会造成运算为 NaN 的结果 
x = (x- mean(x))./ (max(x)-min(x));
y = (y- mean(y))./ (max(y)-min(y));
plot(x,y,'.');
hold on;
 
%% 参数初始化
m = length(x);%样本数量
theta = [1;0];%theta初始化
%预先分配空间以节省运行时间
X = [ones(m,1),x];%特征值的增广矩阵
%梯度下降法
pd = zeros(m,2);%J对theta的偏导矩阵 
cost = zeros(m,1);
alpha = 0.1;
itration = 10000;
 
%% 梯度下降法迭代寻找最小值
for i = 1:itration
    h = X*theta;
    cost = (y-h).*(y-h);
    pd(:,1) = (h-y).*X(:,1);
    pd(:,2) = (h-y).*X(:,2);
    theta(1) = theta(1) - alpha/m*sum(pd(:,1));
    theta(2) = theta(2) - alpha/m*sum(pd(:,2));
    J = 1/(2*m)*sum(cost);
end
 
%% 正规方程法
% theta = ((X'*X)^(-1))*X'*y;
% n较小时使用正规方程法简单且速度较快但要注意X'X的可逆性问题;
% n较大时使用梯度下降法运算更快。
 
%% 画线
X = min(x):0.01:max(x);
Y = theta(1)+theta(2)*X;
plot(X,Y,'LineWidth',2);

4.时间序列预测

%% 时间序列预测
%输入原始数据
A = [970279
1259308
1127571
1163959
1169540
1076938
991350
953275
951508
904434
889381
864015
836236
]';
%判断是否平稳,使用ADF检验
h = adftest(A)
%B = dtrend(A)
B = diff(A)
H = adftest(B)
figure(1)
autocorr(B)
figure(2)
parcorr(B)
x = A;
w = B;
n = 2;
s = 1;
m1 = length(A); %原始的数据的个数
for i = s+1:m1
    y(i-s) = x(i) - x(i-s);%进行周期差分变换
end
ToEstMd = arima('ARLags',1,'MALags',1:1,'Constant',0);%指定模型的结构
[EstMd,EstParamCov,LogL,info] = estimate(ToEstMd,w');%模型拟合 
w_Forecast = forecast(EstMd,n,'Y0',w');
yhat = y(end) + cumsum(w_Forecast); %一阶差分的还原值
for j = 1:n
    x(m1 + j) = yhat(j) + x(m1+j-s); %x的预测值
end
x(1:end)

5.马尔科夫链预测

clc,clear,format rat;%使用分数来表示值
a=[4 3 2 1 4 3 1 1 2 3
   2 1 2 3 4 4 3 3 1 1
   1 3 3 2 1 2 2 2 4 4
   2 3 2 3 1 1 2 4 3 1];
a=a';a=a(:)';%a(:)表示转化为一个列向量,然后取得转置,则得到一个行向量
for i=1:4
    for j=1:4
        f(i,j)=length(findstr([i,j],a));%统计字符串ij的数量
    end
end
ni=sum(f,2);%按照行求和
phat=f./repmat(ni,1,size(f,2));%矩阵除法,repamt生成了一个矩阵,其维数为一维,即数组形式,元素分别为行和的副本
disp(phat);%size(f,2)求列数
format %恢复到短小数的表示形式

6.微分方程预测

clc;clear
I=input('请输入感染者的人数:');
R=input('请输入移除者的人数:');
N=input('请输入总人数:');
S=N-I-R; %健康者的人数
lemda=input('请输入日接触率:');
mu=input('请输入移除率:');
t=1:365;
for i=1:(size(t,2)-1)
    S(1+i)=S(i)-lemda*I(i)*S(i)/N;
    %下一时刻健康的人数等于上一时刻健康的人数减去新感染的人数
    I(1+i)=I(i)+I(i)*S(i)*lemda/N-mu*I(i);
    %下一时刻的病人数目等于上一时刻病人数目加上新患者人数减去移除者的人数
    R(1+i)=N-I(1+i)-S(1+i);
    %下一时刻移除者的数目等于总人数减去前两者的数目
end
plot(t,S,'b-',t,I,'r.-',t,R,'g--')
xlabel('时间')
ylabel('人数')
legend('健康者','患病者','移除者')
title('SIR传染病模型')

7.Logistic 模型

clear;clc;
%Yule算法:
%公众号:好玩的MATLAB
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(n,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:4:2017])
grid on
format short;
forecast=YY(end-4:end);%CO2排放量的预测结果
MAPE=sum(abs(YY(1:n+1)-X)./X)/length(X);%平均相对差值
a,b,cclear;clc;
%Yule算法:
%公众号:好玩的MATLAB
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(n,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:4: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

 

二.优化模型

1.规划模型(目标规划、线性规划、非线性规划、整数规划、动态规划)

C=[-20,-10,-5]';
A=[5,4,2;-2,-5,0];
b=[24,-13]';
Aeq=[0,3,1]';
beq=[12];
lb=[0,-inf]';
ub=[+inf,+inf];
[x,fval]=linprog(C,A,b,Aeq,beq,lb,ub,x0);
fval=-fval; %由于是求最大值,因此要求结果的相反数。
function f=fun(x)
    f=...
end
function [C,ceq]=nonlfun(x)
    c=[非线性不等式约束1;
      ...
      非线性不等式约束k];
    ceq=[非线性等式约束1
    ...
      非线性等式约束 s];
end
main.m

A=[];
b=[];
Aeq=[];
beq=[];
lb=[0,0,0]';
ub=[+inf,+inf];
x0=[0,0,0]';
[x,fval]=fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun);
fun.m

function f=fun(x)
    f=x(1)^2+x(2)^2+x(3)^2+8
end
nonlfun.m

function [C,ceq]=nonlfun(x)
    c=[x(1)^2+4*x(2)^2+x(3)^2-24;-x(1)^2-5*x(2)+13];
    ceq=[-x(2)^2+x(3)^2-12];
end
function f=Fun(x)
  f=zeros(m,1);
  f(1)=...
  ...
  f(m)=...
end

2.图论模型

 [a,b,c,d,e,f]=deal(1,2,3,4,5,6);%deal作用:把1~6赋值给a~f
 %    a b c d e f
w = [0 0 0 0 0 0    % a
     2 0 0 0 0 0    % b
     3 6 0 0 0 0    % c
     0 5 0 0 0 0    % d
     0 3 1 1 0 0    % e
     0 0 0 2 4 0];  % f
W = sparse(w);%转成稀疏矩阵 
g=full(W);%转成满矩阵
p=biograph(g,[],'ShowArrows','off','ShowWeights','on');
h=view(p);%画出基础图
%[dist,Path,pred] = graphshortestpath(W, d,a);%默认有向

[Dist,Path] = graphshortestpath(W, 1, 6,'Directed',0)%Directed 后面的数字表示有向与否也可用true/false
%将最短路径用红色标注
set(h.Nodes(Path),'color',[1 0.4 0.4]);%结点
edges=getedgesbynodeid(h,get(h.Nodes(Path),'ID'),get(h.Nodes(Path),'ID'));
set(edges,'Linecolor',[1 0 0]);%弧
set(edges,'LineWidth',2.0);
n = length(lat);

R = 6378.137;%地球半径

dist = zeros(n);
for i = 1:n
    for j = i+1:n
        dist(i,j) = distance(lat(i),lon(i), lat(j),lon(j), R);
    end
end

dist = dist + dist';
[order,totdist] = minhamiltonpath(dist);

3.排队论模型

clear 
clc 
%***************************************** 
%初始化顾客源 
%***************************************** 
%总仿真时间 
Total_time = 10; 
%队列最大长度 
N=10000000000; 
%到达率与服务率 
lambda=10, mu=6;
%平均到达时间与平均服务时间 
arr_mean = 1/lambda; 
ser_mean = 1/mu; 
arr_num = round(Total_time*lambda*2); 
events = []; 
%按负指数分布产生各顾客达到时间间隔 
events(1,:) = exprnd(arr_mean,1,arr_num); 
%各顾客的到达时刻等于时间间隔的累积和 
events(1,:) = cumsum(events(1,:));
%按负指数分布产生各顾客服务时间 
events(2,:) = exprnd(ser_mean,1,arr_num); 
%计算仿真顾客个数,即到达时刻在仿真时间内的顾客数 
len_sim = sum(events(1,:)<= Total_time); 
%***************************************** 
%计算第 1个顾客的信息 
%***************************************** 
%第 1个顾客进入系统后直接接受服务,无需等待 
events(3,1) = 0; 
%其离开时刻等于其到达时刻与服务时间之和 
events(4,1) = events(1,1)+events(2,1); 
%其肯定被系统接纳,此时系统内共有 
%1个顾客,故标志位置1 
events(5,1) = 1; 
%其进入系统后,系统内已有成员序号为 1 
member = [1]; 

for i = 2:arr_num 
%如果第 i个顾客的到达时间超过了仿真时间,则跳出循环 
if events(1,i)>Total_time break;
else number = sum(events(4,member) > events(1,i)); 
%如果系统已满,则系统拒绝第 i个顾客,其标志位置 0 
if number >= N+1 
events(5,i) = 0; 
%如果系统为空,则第 i个顾客直接接受服务 
else 
if number == 0 
%其等待时间为 0
%PROGRAMLANGUAGEPROGRAMLANGUAGE
events(3,i) = 0; 
%其离开时刻等于到达时刻与服务时间之和 
events(4,i) = events(1,i)+events(2,i); 
%其标志位置 1 
events(5,i) = 1; 
member = [member,i]; 
%如果系统有顾客正在接受服务,且系统等待队列未满,则 第 i个顾客进入系统 

else len_mem = length(member); 
%其等待时间等于队列中前一个顾客的离开时刻减去其到 达时刻 
events(3,i)=events(4,member(len_mem))-events(1,i); 
%其离开时刻等于队列中前一个顾客的离开时刻加上其服 
%务时间 
events(4,i)=events(4,member(len_mem))+events(2,i); 
%标识位表示其进入系统后,系统内共有的顾客数 
events(5,i) = number+1; 
member = [member,i]; 
end 
end 

end 
end 
%仿真结束时,进入系统的总顾客数 
len_mem = length(member); 
%***************************************** 
%输出结果 
%***************************************** 
%绘制在仿真时间内,进入系统的所有顾客的到达时刻和离 
%开时刻曲线图(stairs:绘制二维阶梯图) 
stairs([0 events(1,member)],0:len_mem); 
hold on; 
stairs([0 events(4,member)],0:len_mem,'.-r'); 
legend('到达时间 ','离开时间 '); 
hold off; 
grid on; 
%绘制在仿真时间内,进入系统的所有顾客的停留时间和等 
%待时间曲线图(plot:绘制二维线性图) 
figure;
plot(1:len_mem,events(3,member),'r-*',1: len_mem,events(2,member)+events(3,member),'k-'); 
legend('等待时间 ','停留时间 '); 
grid on;

4.神经网络模型

%% I. 清空环境变量
clear all
clc

%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat

%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));      %打乱60个样本排序
% 训练集——50个样本
P_train = NIR(temp(1:50),:)';      
T_train = octane(temp(1:50),:)';
% 测试集——10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);

%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);

[t_train, ps_output] = mapminmax(T_train,0,1);              

%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);    %9是隐含层神经元的个数(大家改改测试下结果影响),连接权值是3628,讲一下怎么计算得到的

%%
% 2. 设置训练参数
net.trainParam.epochs = 1000;   %迭代次数
net.trainParam.goal = 1e-3;      %mse均方根误差小于这个值训练结束
net.trainParam.lr = 0.01;         %学习率

%%
% 3. 训练网络
net = train(net,p_train,t_train);

%%
% 4. 仿真测试
t_sim = sim(net,p_test);         %返回10个样本的预测值

%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);   %反归一化结果

%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;

%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); 

%%
% 3. 结果对比
result = [T_test' T_sim' error']     %输出真实值,预测值,误差
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};
title(string)

5.现代优化算法(遗传算法、模拟退火算法、蚁群算法、禁忌搜索算法)

%% 实现遗传算法
tic
clc,clear 
load data1.txt       %加载敌方 100 个目标的数据 
x=data1(:,1:2:8);x=x(:);   % 经度
y=data1(:,2:2:8);y=y(:);   % 维度
data1=[x y]; 
d1=[70,40]; 
data0=[d1;data1;d1]; 
%距离矩阵 d data0
data1=data0*pi/180; 
d=zeros(102); 
for i=1:101 
    for j=i+1:102 
        temp=cos(data1(i,1)-data1(j,1))*cos(data1(i,2))*cos(data1(j,2))+sin(data1(i,2))*sin(data1(j,2)); 
        d(i,j)=6370*acos(temp); 
    end 
end 
d=d+d';L=102;w=50;dai=100; 
%通过改良圈算法选取优良父代 A 
for k=1:w 
    c=randperm(100); 
    c1=[1,c+1,102]; 
    flag=1; 
 while flag>0 
      flag=0; 
   for m=1:L-3 
      for n=m+2:L-1 
        if d(c1(m),c1(n))+d(c1(m+1),c1(n+1))

三.评价模型

1.模糊综合评价法

clc, clear
a=load('mhdata.txt'); 
% 一级指标权重
w=[0.4  0.3  0.2  0.1];
% 二级指标权重,对应4个一级指标
w1=[0.2  0.3  0.3  0.2];
w2=[0.3  0.2  0.1  0.2  0.2];
w3=[0.1  0.2  0.3  0.2  0.2];
w4=[0.3  0.2  0.2  0.3];
%% 一级模糊综合评判
b1 = [];   %保存一级评判结果

w0 = w1';          %指标权重应为列向量m*1
b0 = a([1:4],:);   %指标应与列向量对应m*n
% 以下为固定操作,进行模糊运算
c0 =[];  %临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(1,:) = c0(j+1,:);

w0 = w2';            %指标权重应为列向量m*1
b0 = a([5:9],:);     %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(2,:) = c0(j+1,:);

w0 = w3';            %指标权重应为列向量m*1
b0 = a([10:14],:);   %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(3,:) = c0(j+1,:);

w0 = w4';            %指标权重应为列向量m*1
b0 = a([15:end],:);  %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(4,:) = c0(j+1,:);
%% 二级模糊综合评判
w0 = w';
b0 = b1;
c0 =[];
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end

c2 = c0(j+1,:)%二级评判结果


 

clc, clear
a=load('mhdata.txt'); 
% 一级指标权重
w=[0.4  0.3  0.2  0.1];
% 二级指标权重,对应4个一级指标
w1=[0.2  0.3  0.3  0.2];
w2=[0.3  0.2  0.1  0.2  0.2];
w3=[0.1  0.2  0.3  0.2  0.2];
w4=[0.3  0.2  0.2  0.3];
%% 一级模糊综合评判
b1 = [];   %保存一级评判结果

w0 = w1';          %指标权重应为列向量m*1
b0 = a([1:4],:);   %指标应与列向量对应m*n
% 以下为固定操作,进行模糊运算
c0 =[];  %临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(1,:) = c0(j+1,:);

w0 = w2';            %指标权重应为列向量m*1
b0 = a([5:9],:);     %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(2,:) = c0(j+1,:);

w0 = w3';            %指标权重应为列向量m*1
b0 = a([10:14],:);   %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(3,:) = c0(j+1,:);

w0 = w4';            %指标权重应为列向量m*1
b0 = a([15:end],:);  %指标应与列向量对应m*n
c0 =[];%临时结果
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end
b1(4,:) = c0(j+1,:);
%% 二级模糊综合评判
w0 = w';
b0 = b1;
c0 =[];
for i =1:max(size(b0))
    for j= 1:max(size(w0))
        c0(j,i)= min(w0(j,:),b0(j,i));
    end
    c0(j+1,i) = max(c0(:,i));
end

c2 = c0(j+1,:)%二级评判结果

 

一、蒙特卡洛算法

1、定义

 

蒙特卡洛算法是以概率和统计的理论、方法为基础的一种数值计算方法,将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解,故又称随机抽样法或统计实验法。

2、适用范围

可以较好的解决多重积分计算、微分方程求解、积分方程求解、特征值计算和非线性方程组求解等高难度和复杂的数学计算问题。

3、特点

特卡洛算法可以应用在很多场合,但求的是近似解,在模拟样本越大的情况下,越接近于真实值,单样本数增加会带来计算量的大幅上升。对于一些简单问题来说,蒙特卡洛是个笨办法,但对于许多问题来说,它往往是个有效,有时甚至是唯一可行的方法。

4、举例

y = x^2 ,y = 12 - x 与 X 轴在第一象限与 X 轴围成一个曲边三角形。设计一个随机试验,求该图形的近似值。

数学建模代码速成~赛前一个月~matlab~代码模板~吐血总结~三大模型代码(预测模型、优化模型、评价模型)_第1张图片

代码

(2)设计的随机试验的思想:在矩形区域[0,12]*[0.9]上产生服从均与分布的10^7个随机点,统计随机点落在曲边三角形内的个数,则曲边三角形的面积近似于上述矩形的面积乘以频率

%蒙特卡洛算法的具体实现

%产生一个1行10000000列的矩阵,矩阵中每个数是从0到12之间随机取

x = unifrnd(0, 12, [1, 10000000]);

y = unifrnd(0, 9, [1, 10000000]);

frequency = sum(y=3);

area = 12*9*frequency/10^7;

disp(area);

求近似值:

Area = 49.507

二、数据拟合

已限个数据点,求近似函数,可不过已知数据点,只要求在某种意义下它在这些点上的总偏差最小,从而能较好的反应数据的整体变化趋势。

一般采用最小二乘法。

拟合的实现分为 MATLAB 和 excel 实现。MATLAB 的实现就是 polyfit 函数,主要是多项式拟合。

三、数据插值

1、定义

在离散数据的基础上补插连续函数,使得这条连续曲线通过给定的全部离散数据点。即求过已知有限个数据点的近似函数。

从定义上看,插值和拟合有一定的相似度,但插值要求近似函数通过给定的所有离散数据,而拟合并不要求这样,只要近似函数能较好的反映数据变化的趋势即可(近似含义不同),当测量值是准确的,没有误差时,一般用插值;当测量值与真实值有误差时,一般用数据拟合。

2、作用

插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值情况,估算出函数在其他点处的近似值。

3.聚类分析法

d=1-abs(a);
y=linkage(d,'average');
j=dendrogram(y);
L=cluster(y,'maxclust',3)
for i=1:3
	b=find(L==i);
	b=reshape(b,1,length(b));
	fprintf('第%d 类的有%s\n',i,int2str(b));
End

4.主成分分析评价法

clc,clear
data = load('gd.txt');%将原始数据保存在txt文件中
data=zscore(data);     %数据的标准化
r=corrcoef(data);      %计算相关系数矩阵r
%下面利用相关系数矩阵进行主成分分析,vec1的第一列为r的第一特征向量,即主成分的系数
[vec1,lamda,rate]=pcacov(r);                 %lamda为r的特征值,rate为各个主成分的贡献率
f=repmat(sign(sum(vec1)),size(vec1,1),1);    %构造与vec1同维数的元素为±1的矩阵
vec2=vec1.*f;             %修改特征向量的正负号,使得每个特征向量的分量和为正,即为最终的特征向量
num = max(find(lamda>1)); %num为选取的主成分的个数,这里选取特征值大于1的
df=data*vec2(:,1:num);    %计算各个主成分的得分
tf=df*rate(1:num)/100;    %计算综合得分
[stf,ind]=sort(tf,'descend');  %把得分按照从高到低的次序排列
stf=stf'; ind=ind';            %stf为得分从高到低排序,ind为对应的样本编号

5.灰色综合评价法

clear;clc
load gdp.mat  % 导入数据 一个6*4的矩阵
Mean = mean(gdp);  % 求出每一列的均值以供后续的数据预处理
gdp = gdp ./ repmat(Mean,size(gdp,1),1); 
disp('预处理后的矩阵为:'); disp(gdp)
Y = gdp(:,1);  % 母序列
X = gdp(:,2:end); % 子序列
absX0_Xi = abs(X - repmat(Y,1,size(X,2)))  % 计算|X0-Xi|矩阵(把X0定义为了Y)
a = min(min(absX0_Xi))    % 计算两级最小差a
b = max(max(absX0_Xi))  % 计算两级最大差b
rho = 0.5; % 分辨系数取0.5
gamma = (a+rho*b) ./ (absX0_Xi  + rho*b)  % 计算子序列中各个指标与母序列的关联系数
disp('子序列中各个指标的灰色关联度分别为:')
disp(mean(gamma))

折衷型模糊决策方法建模实例

某市直属单位因工作需要,拟向社会公开招聘 8 名公务员,具体的招聘办法和程序 如下:

(一)公开考试:凡是年龄不超过 30 周岁,大学专科以上学历,身体健康者均可 报名参加考试,考试科目有:综合基础知识、专业知识和“行政职业能力测验”三个部 分,每科满分为 100 分。根据考试总分的高低排序选出 16 人选择进入第二阶段的面试 考核。

(二)面试考核:面试考核主要考核应聘人员的知识面、对问题的理解能力、应变 能力、表达能力等综合素质。按照一定的标准,面试专家组对每个应聘人员的各个方面 都给出一个等级评分,从高到低分成 A/B/C/D 四个等级,具体结果见表 10 所示。

现要求根据表 8 中的数据信息对 16 名应聘人员作出综合评价,选出 8 名作为录用 的公务员。

过程:

① 借鉴表 9 的思想,对于定性指标值 A,B,C,D,可以定义表 10 的量化标准 将这些定性指标进行量化,其具体的量化形式见表 11。

② 由表 11 和公式(1)把表 10 中的指标信息、权重信息化成三角形模糊数,得到

③ 公式(3’)和(4)将 F 中的数据进行归一加权化,得到模糊决策矩阵 D 。

④ 由公式(5)确定出模糊正理想与模糊负理想

⑤ 模糊优选决策

因此被选种的 8 个人员是人员 1、4、2、9、8、5、7、12。 计算的 MATLAB 程序如下:

 

%把表 3 中的数据复制到纯文本文件 mohu.txt 中,然后把 A 替换成 85 90 100,

%B 替换成 75 80 85,C 替换成 60 70 75,D 替换成 50 55 60

clc,clear

load mohu.txt

sj=[repmat(mohu(:,1),1,3),mohu(:,2:end)];

%首先进行归一化处理

n=size(sj,2)/3;m=size(sj,1);

w=[0.5*ones(1,3),0.125*ones(1,12)];

w=repmat(w,m,1);

y=[];

for i=1:n

    tm=sj(:,3*i-2:3*i);

    max_t=max(tm);

    max_t=repmat(max_t,m,1);

    max_t=max_t(:,3:-1:1);

    yt=tm./max_t;yt(:,3)=min([yt(:,3)';ones(1,m)]);

    y=[y,yt];

end

%下面求模糊决策矩阵

r=[];

for i=1:n

    tm1=y(:,3*i-2:3*i);tm2=w(:,3*i-2:3*i);

    r=[r,tm1.*tm2];

end

%求 M+、M-和距离

mplus=max(r);mminus=min(r)

dplus=dist(mplus,r');dminus=dist(mminus,r');

%求隶属度

mu=dminus./(dplus+dminus);

[mu_sort,ind]=sort(mu,'descend')

6.人工神经网络评价法

%% I. 清空环境变量
clear all
clc
%% II. 训练集/测试集产生
%%
% 1. 导入数据
load spectra_data.mat
%%
% 2. 随机产生训练集和测试集
temp = randperm(size(NIR,1));
% 训练集――50个样本
P_train = NIR(temp(1:50),:)';
T_train = octane(temp(1:50),:)';
% 测试集――10个样本
P_test = NIR(temp(51:end),:)';
T_test = octane(temp(51:end),:)';
N = size(P_test,2);
%% III. 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
 
[t_train, ps_output] = mapminmax(T_train,0,1);
%% IV. BP神经网络创建、训练及仿真测试
%%
% 1. 创建网络
net = newff(p_train,t_train,9);
%%
% 2. 设置训练参数
net.trainParam.epochs = 1000;
net.trainParam.goal = 1e-3;
net.trainParam.lr = 0.01;
%%
% 3. 训练网络
net = train(net,p_train,t_train);
%%
% 4. 仿真测试
t_sim = sim(net,p_test);
%%
% 5. 数据反归一化
T_sim = mapminmax('reverse',t_sim,ps_output);
%% V. 性能评价
%%
% 1. 相对误差error
error = abs(T_sim - T_test)./T_test;
%%
% 2. 决定系数R^2
R2 = (N * sum(T_sim .* T_test) - sum(T_sim) * sum(T_test))^2 / ((N * sum((T_sim).^2) - (sum(T_sim))^2) * (N * sum((T_test).^2) - (sum(T_test))^2)); 
%%
% 3. 结果对比
result = [T_test' T_sim' error']
%% VI. 绘图
figure
plot(1:N,T_test,'b:*',1:N,T_sim,'r-o')
legend('真实值','预测值')
xlabel('预测样本')
ylabel('辛烷值')
string = {'测试集辛烷值含量预测结果对比';['R^2=' num2str(R2)]};
title(string)

 

 

你可能感兴趣的:(matlab,学习)