(最新)数学建模代码汇总
插值
% 产生原始数据
x=0:0.1:1;
y=(x.^2-3*x+7).*exp (-4*x).*sin (2*x);
% 线性插值
xx=0:0.01:1;
y1=interp1 (x,y,xx,'linear');
subplot (2,2,1)
plot (x,y,'o',xx,y1);
title ('线性插值');
% 最邻近点插值
y2=interp1 (x,y,xx,'nearest');
subplot (2,2,2)
plot (x,y,'o',xx,y2);
title ('最邻近点插值');
% 三次插值
y3=interp1 (x,y,xx,'cubic');
subplot (2,2,3)
plot (x,y,'o',xx,y3);
title ('三次插值');
% 三次样条插值
y4=interp1 (x,y,xx,'spline');
subplot (2,2,4)
plot (x,y,'o',xx,y4);
title ('三次样条插值');
基点为网格节点 % 插值
clear all
y=20:-1:0;
x=0:20;
z=[0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.4 0.3 0.2 0.3 0.2 0.1 0.2 0.2 0.4 0.3 0.2 0.2
0.2 0.2;
0.3 0.2 0.2 0.2 0.2 0.4 0.3 0.3 0.3 0.3 0.4 0.2 0.2 0.2 0.2 0.4 0.4 0.4 0.3 0.2
0.2;
0.2 0.3 0.3 0.2 0.3 1 0.4 0.5 0.3 0.3 0.3 0.3 0.2 0.2 0.2 0.6 0.5 0.4 0.4 0.2
0.2;
0.2 0.2 0.4 0.2 1 1.1 0.9 0.4 0.3 0.3 0.5 0.3 0.2 0.2 0.2 0.7 0.3 0.6 0.6 0.3
0.4;
0.2 0.2 0.9 0.7 1 1 1 0.7 0.5 0.3 0.2 0.2 0.2 0.6 0.2 0.8 0.7 0.9 0.5 0.5
0.4;
0.2 0.3 1 1 1 1.2 1 1.1 0.8 0.3 0.2 0.2 0.2 0.5 0.3 0.6 0.6 0.8 0.7 0.6
0.5;
0.2 0.4 1 1 1.1 1.1 1.1 1.1 0.6 0.3 0.4 0.4 0.2 0.7 0.5 0.9 0.7 0.4 0.9 0.8
0.3;
0.2 0.2 0.9 1.1 1.2 1.2 1.1 1.1 0.6 0.3 0.5 0.3 0.2 0.4 0.3 0.7 1 0.7 1.2 0.8
0.4;
0.2 0.3 0.4 0.9 1.1 1 1.1 1.1 0.7 0.4 0.4 0.4 0.3 0.5 0.5 0.8 1.1 0.8 1.1 0.9
0.3;
0.3 0.3 0.5 1.2 1.2 1.1 1 1.2 0.9 0.5 0.6 0.4 0.6 0.6 0.3 0.6 1.2 0.8 1 0.8
0.5;
0.3 0.5 0.9 1.1 1.1 1 1.2 1 0.8 0.7 0.5 0.6 0.4 0.5 0.4 1 1.3 0.9 0.9 1
0.8;
0.3 0.5 0.6 1.1 1.2 1 1 1.1 0.9 0.4 0.4 0.5 0.5 0.8 0.6 0.9 1 0.5 0.8 0.8
0.9;
0.4 0.5 0.4 1 1.1 1.2 1 0.9 0.7 0.5 0.6 0.3 0.6 0.4 0.6 1 1 0.6 0.9 1
0.7;
0.3 0.5 0.8 1.1 1.1 1 0.8 0.7 0.7 0.4 0.5 0.4 0.4 0.5 0.4 1.1 1.3 0.7 1 0.7
0.6;
0.3 0.5 0.9 1.1 1 0.7 0.7 0.4 0.6 0.4 0.4 0.3 0.5 0.5 0.3 0.9 1.2 0.8 1 0.8
0.4;
0.2 0.3 0.6 0.9 0.8 0.8 0.6 0.3 0.4 0.5 0.4 0.5 0.4 0.2 0.5 0.5 1.3 0.6 1 0.9
0.3;
0.2 0.3 0.3 0.7 0.6 0.6 0.4 0.2 0.3 0.5 0.8 0.8 0.3 0.2 0.2 0.8 1.3 0.9 0.8 0.8
0.4;
0.2 0.3 0.3 0.6 0.3 0.4 0.3 0.2 0.2 0.3 0.6 0.4 0.3 0.2 0.4 0.3 0.8 0.6 0.7 0.4
0.4;
0.2 0.3 0.4 0.4 0.2 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.5 0.7 0.4 0.4 0.3
0.3;
0.2 0.2 0.3 0.2 0.2 0.3 0.2 0.2 0.2 0.2 0.2 0.1 0.2 0.4 0.3 0.6 0.5 0.3 0.3 0.3
0.2;
0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.4 0.7 0.4 0.2 0.4 0.5
0.5];
% 未插值直接画图
figure (1) % 创建图形窗口1,并激活
surf (x,y,z);
shading flat % 用shading flat命令,使曲面变的
光滑
title ('未插值地形图')
xlabel ('横坐标')
ylabel ('纵坐标')
zlabel ('高度')
% 三次插值后画图
% 画地形图
figure (2)
xi=0:0.05:20;
yi=20:-0.05:0;
zi=interp2 (x,y,z,xi',yi,'cubic'); %'cubic'三次插值 surfc (xi,yi,zi); % 底面带等高线 shading flat
title ('插值后地形图')
xlabel ('横坐标')
ylabel ('纵坐标')
zlabel ('高度')
% 画立体等高线图
figure (3)
contour3 (xi,yi,zi);
title ('立体等高线图')
xlabel ('横坐标')
ylabel ('纵坐标')
zlabel ('高度')
% 画等高线图
figure (4)
[c,h]=contour (xi,yi,zi); clabel (c,h); % 用于为2维等高线添加标签
colormap cool % 冷色调 title ('平面等高线图')
xlabel ('横坐标')
ylabel ('纵坐标')
ge
回归拟合
function yhat=Logisfun (beta,x) yhat=beta (1)./(1+(beta (1)/beta(2)-1).*exp (-beta(3).*x));
clear all
y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9...
76.0 92.0 106.5 123.2 131.7 150.7 179.3 204.0 226.5 251.4 281.4]';
x=(1:22)';
beta0=[400,3.0,0.20]';
% 非线性回归 'Logisfun'为回归模型
[beta,r,j]=nlinfit (x,y,'Logisfun',beta0);
% beta0为回归系数初始迭代点
% beta为回归系数
% r为残差
% 输出拟合
达式:
fprintf ('回归方程为y=%5 .4f/(1+%5 .4f*exp (-%5.4f*x))\n',beta (1),beta (1)/beta(2)-1,beta (3))
% 求均方误差根:
rmse=sqrt (sum (r.^2)/22); rmse
% 预测和误差估计:
[Y,DELTA]=nlpredci ('Logisfun',x,beta,r,j);
% DELTA为误差限
% Y为预测值 (拟合后的表达式求值)
plot (x,Y,x,y,'o',x,Y+DELTA,':',x,Y-DELTA,':')
% lny=lna+bx
clear all
y=[3.9 5.3 7.2 9.6 12.9 17.1 23.2 31.4 38.6 50.2 62.9 76.0];
% Y为列向量
Y=log (y');
x=1:12;
% X为两列
X=[ones (12,1),x']; [b,bint,r,rint,stats]=regress (Y,X);
% b为参数的点估计
disp ('b为参数的点估计')
b
% bint为参数的区间估计
disp ('bint为参数的区间估计')
bint
% stats (1)为相关系数越接近1回归方程越显著 disp ('stats (1)')
stats (1)
% stats (2)为F值越大回归越显著
disp ('stats (2)')
stats (2)
% stats (3)为与F对应的概率P P
0表示函数已收敛到x处
% output中:Iterations表示迭代次数
% Algorithm表示采用算法
% FuncCount表示函数评价次数
% 遗传算法
% 调整最大允许的代数1万代,种群规模为200
options=gaoptimset ('Generations',10000,'PopulationSize',200);
% 设置两个变量,限制0<=x1,x2<=2
[x2,fval2,exitflag2,output2]=ga (@rosenbrock,2,[1,0;0,1;-1,0;0,-1],[2;2;0;0],[],[],[],[],[],options);
% exiflag>0表示求解成功
function y=rosenbrock (x)
y=100*(x (2)-x (1).^2).^2+(1-x (1)).^2; 通用
function [s,c]=circle (r) % 注意此文件名一定要为circle.m % CIRCLE 计算半径为r的圆面积与周长
%[s,c]=circle (r)
% r圆半径,s圆面积,c圆周长
%2008 年9月19日编写
s=pi*r*r;
c=2*pi*r;
function [s,c]=circle (r) % 注意此文件名一定要为circle.m % CIRCLE 计算半径为r的圆面积与周长
%[s,c]=circle (r)
% r圆半径,s圆面积,c圆周长
%2008 年9月19日编写
s=pi*r*r;
c=2*pi*r;
追击仿真
function y=f (x)
if x==1
y=2;
end
if x==2
y=3;
end
if x==3
y=4;
end
if x==4
y=1;
end
% 四人追逐问题实验
% f.m文件用于调节追击次序即第一人追第二人,第二人追第三人,第三人追第四人,第四人追第五人
D=2; % 最小距离 v=10; % 速度 dt=0.1; % 时间间隔 x=zeros (4,103); % 四个人的横坐标 y=zeros (4,103); % 四个人的纵坐标 x (1,1)=100;y (1,1)=0; % 第一个人的初始坐标 (100,0)
x (2,1)=0;y (2,1)=0; % 第二个人的初始坐标 (0,0)
x (3,1)=0;y (3,1)=100; % 第三个人的初始坐标 (0,100)
x (4,1)=100;y (4,1)=100; % 第四个人的初始坐标 (100,100)
k=1;
t=0;
% 追击模拟
while (sqrt ((x (1,k)-x (2,k))^2+(y (1,k)-y (2,k))^2)>D)
k=k+1;
t=t+dt;
for i=1:4
d=sqrt ((x (f (i),k-1)-x (i,k-1))^2+(y (f (i),k-1)-y (i,k-1))^2); % 两人距离
cosx=(x (f (i),k-1)-x (i,k-1))/d;
sinx=(y (f (i),k-1)-y (i,k-1))/d;
x (i,k)=x (i,k-1)+v*cosx*dt; % 求新的x坐标
y (i,k)=y (i,k-1)+v*sinx*dt; % 求新的y坐标 end
end
% 描绘追击图像
for i=1:k
plot (x (1,i),y (1,i),'o',x (2,i),y (2,i),'*',x (3,i),y (3,i),'o',x (4,i),y (4,i),'*')
pause (0.01);
hold on
end
动态规划
clear all
clc
% max z=g1 (x1)+g2 (x2)+g3 (x3)
% x1+x2+x3=n;0<=xi<=n
% 算法:突出阶段的动态规划
% f1 (x)=g1 (x) 0<=x<=n
% fi (x)=max {gi (y)+fi-1(x-y)} 0<=x<=n,0<=y<=n
% 数据结构
n=7;% 总金额
m=3;% 阶段数
income=[0,0.11,0.13,0.15,0.21,0.24,0.30,0.35;
0,0.12,0.16,0.21,0.23,0.25,0.24,0.34;
0,0.08,0.12,0.2,0.24,0.26,0.30,0.35];% 三个项目的收益 income (k,i) k阶段投资i-1的收益
f=zeros (3,8);% f (k,i) 当前投资i-1最大收益
a=zeros (3,8);% a (i,j) 前i个工程投资j-1所获得最大利润时,给i项目的投资 f (1,:)=income (1,:);
a (1,:)=[0,1,2,3,4,5,6,7];
% 动态规划
for k=2:m % 阶段
for j=0:n % 到本阶段为止总投资量
for i=0:j % 前一阶段投资量
if f (k-1,i+1)+income (k,j-i+1)>=f (k,j+1)
f (k,j+1)=f (k-1,i+1)+income (k,j-i+1);
a (k,j+1)=j-i;% 本阶段投资量
end % if
end % for
end % for
end % for
% 出结果
f (m,n+1)
out=n+1;
for i=m:-1:1
a (i,out)
out=out-a (i,out);
end % for
残缺棋盘
function [board,amount]=cover (i,j,k,l,board,size,amount)% (i,j)为左上角 (k,l)残缺 size为规模
amount为片数
if size==1
return
end
amount=amount+1;
size=size/2;
if (k=size+i)&(l=size+j)% 残缺位于右上棋盘
board (size+i,size+j-1)=amount;board (size+i,size+j)=amount;board (size+i-1,size+j-1)=amount;% 放置
[board,amount]=cover (i,j+size,k,l,board,size,amount);[board,amount]=cover (i,j,i+size-1,j+size-1,board,size,amount);
[board,amount]=cover (size+i,size+j,size+i,size+j,board,size,amount);[board,amount]=cover
(i+size,j,i+size,j+size-1,board,size,amount); elseif (k>=size+i)&(l>=size+j)% 残缺位于右下棋盘
board (size+i,size+j-1)=amount;board (size+i-1,size+j)=amount;board
(size+i-1,size+j-1)=amount;% 放置
[board,amount]=cover (size+i,size+j,k,l,board,size,amount);[board,amount]=cover
(i,j+size,size+i-1,j+size,board,size,amount); [board,amount]=cover (i,j,i+size-1,j+size-1,board,size,amount);[board,amount]=cover
(i+size,j,i+size,j+size-1,board,size,amount); end
end
% 残缺棋盘
board=zeros (100,100);
n=4;
size=2^n;
amount=0;
[board,amount]=cover (1,1,2,5,board,size,amount); board (1:size,1:size)
广度优先搜索
function y=check (i,j,maze) if (i<=8)&(j<=8)&(i>=1)&(j>=1)
y=1;
else
y=0;
return
end
if maze (i,j)==1|maze (i,j)==-1
y=0;
return
end
clear all
clc
maze=[0,0,0,0,0,0,0,0;
0,1,1,1,1,0,1,0;
0,0,0,0,1,0,1,0;
0,1,0,0,0,0,1,0;
0,1,0,1,1,0,1,0;
0,1,0,0,0,0,1,1;
0,1,0,0,1,0,0,0;
0,1,1,1,1,1,1,0];% 迷宫:0为路,1为墙,-1为遍历过
fx (1:4)=[1,-1,0,0];
fy (1:4)=[0,0,-1,1];
sq.pre=zeros (1,100);sq.x=zeros (1,100);sq.y=zeros (1,100);
qh=0;% 队头指针
qe=1;% 队尾指针
maze (1,1)=-1;
% 第一个元素入队
sq.pre(1)=0;sq.x(1)=1;sq.y(1)=1;
while qh-qe~=0
qh=qh+1;
bb=0;
for k=1:4
i=sq.x(qh)+fx (k); j=sq.y(qh)+fy (k); if check (i,j,maze)==1 qe=qe+1;% 入队
sq.x(qe)=i;sq.y(qe)=j;sq.pre(qe)=qh;
maze (i,j)=-1;
if i==8&j==8% 如果为图最后一个点
while qe~=0
sq.x(qe)
sq.y(qe)
qe=sq.pre(qe);
end
bb=1;
break;
end % if
end % if
end
if bb==1
break
end
end % while
回溯n皇后
function [chess,row,main,deputy,number]=justtry (i,n,chess,row,main,deputy,number);
for k=1:8
if row (k)==0&main (i-k+n)==0&deputy (i+k-1)==0% 此棋盘可继续放子
chess (i,k)=1;
row (k)=1;
main (i-k+n)=1;
deputy (i+k-1)=1;
if i==8% 如果棋盘搜索结束
number=number+1
chess
else % 没有结束继续深搜
[chess,row,main,deputy,number]=justtry (i+1,n,chess,row,main,deputy,number);% 递归
end
chess (i,k)=0;% 回溯
row (k)=0;
main (i-k+n)=0;
deputy (i+k-1)=0; end
end
clear all
clc
% n皇后问题
n=8;
chess=zeros (n,n); row=zeros (1,n);% 记录n列被占用的情况 main=zeros (1,2*n-1);% 记录主对角线的使用情况 deputy=zeros (1,2*n-1);% 记录从对角线的使用情况 number=0;
[chess,row,main,deputy,number]=justtry (1,n,chess,row,main,deputy,number);
密宫所有路
clear all
clc
maze=[0,0,0,0,0,0,0,0;
0,1,1,1,1,0,1,0;
0,0,0,0,1,0,1,0;
0,1,0,0,0,0,1,0;
0,1,0,1,1,0,1,0;
0,1,0,0,0,0,1,1;
0,1,0,0,1,0,0,0;
0,1,1,1,1,1,1,0];% 迷宫:0为路,1为墙,2为遍历过 total=0;
maze (1,1)=2;
[total,maze]=search (1,1,maze,total);
function [total,maze]=search (i,j,maze,total);
fx (1:4)=[1,0,-1,0]; fy (1:4)=[0,1,0,-1]; for k=1:4
newi=i+fx (k);
newj=j+fy (k);
if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze (newi,newj)==0
maze (newi,newj)=2;% 此点已走
if newi==8&newj==8
total=total+1
maze
else
[total,maze]=search (newi,newj,maze,total);
end % if i+fx (k)==8&j+fy (y)==8 maze (newi,newj)=0;% 回溯
end % if (newi<=8)&(newj<=8)&(newi>=1)&(newj>=1)&maze (newi,newj)==0
end % for k=1:4
end
排列树的回溯搜索
function [chess,main,deputy,number]=justtry (i,n,chess,main,deputy,number);
if i==9
number=number+1
chess
else
for k=i:8
if main (i-chess (k)+n)==0&deputy (i+chess (k)-1)==0% 此棋盘可继续放子 (主,副对角线可
放子)
t=chess (k);% 交换
chess (k)=chess (i);
chess (i)=t;
main (i-chess (k)+n)=1;
deputy (i+chess (k)-1)=1;
[chess,main,deputy,number]=justtry (i+1,n,chess,main,deputy,number);% 递归
t=chess (k);% 回溯
chess (k)=chess (i);
chess (i)=t;
main (i-chess (k)+n)=0;
deputy (i+chess (k)-1)=0; end
end
end
end % function
clear all
clc
% n皇后问题
n=8;
chess=zeros (1,n);
for i=1:n % 排列树
chess (i)=i;
end
main=zeros (1,2*n-1);% 记录主对角线的使用情况
deputy=zeros (1,2*n-1);% 记录从对角线的使用情况
number=0;
[chess,main,deputy,number]=justtry (1,n,chess,main,deputy,number);