当前位置:   article > 正文

数学建模常用算法Matlab代码_数学建模常用的matlab代码

数学建模常用的matlab代码

目录

1.通用Topsis算法

2.通用Floyd算法

3.通用Dijkstra代码

4.层次分析法代码

5.插值与拟合代码

6.灰色关联分析代码

7.主成分分析代码

8.蒙特卡洛算法代码

9.规划模型代码

10.灰色预测算法代码

11.智能算法之模拟退火算法


1.通用Topsis算法

  1. %西南石油计科罗文睿
  2. [n,m]=size(X);
  3. disp(['共有' num2str(n) '个评价对象,' num2str(m) '个评价指标'])
  4. Judge=input(['这' num2str(m) '个评价指标需要经过正向化处理,需要请输入1,不需要请输入0:'])
  5. if Judge ==1
  6. Position=input('请输入需要正向化处理的指标所在的列,如2,3,6列,[2,3,6]:');
  7. disp('请输入需要处理的这些列的指标类型:1.极小型 2.中间型 3.区间型')
  8. Type = input('2列是极小型,3列是中间型,6列是区间型,[2,3,6]:');
  9. for i=1:size(Position,2)
  10. X(:,Position(i))=Positivization(X(:,Position(i)),Type(i),Position(i));
  11. end
  12. disp('正向化后的矩阵X= ')
  13. disp(X)
  14. end
  15. Z=X./repmat(sum(X.*X).^0.5,n,1);
  16. disp('标准化矩阵Z= ')
  17. disp(Z)
  18. D_P=sum((Z-repmat(max(Z),n,1)).^2,2).^0.5;
  19. D_N=sum((Z-repmat(min(Z),n,1)).^2,2).^0.5;
  20. S=D_N./(D_P+D_N);
  21. disp('最后的得分为:')
  22. stand_S=S/sum(S)
  23. [sorted_S,index]=sort(stand_S,'descend')
  24. %以下为自定义函数,需单独存放在一个函数里
  25. function [posit_x]=Positivization(x,type,i)
  26. if type==1
  27. disp(['第' num2str(i) '列是极小型,正在正向化'])
  28. posit_x=Min2Max(x);
  29. disp(['第' num2str(i) '列极小型正向化处理完成'])
  30. disp('-------------------分界线----------------------')
  31. elseif type==2
  32. disp(['第' num2str(i) '列是中间型'])
  33. best=input('请输入最佳的那一个值:')
  34. posit_x=Mid2Max(x,best);
  35. disp(['第' num2str(i) '列中间型正向化处理完成'])
  36. disp('------------------分界线-----------------------')
  37. elseif type==3
  38. disp(['第' num2str(i) '列是区间型'])
  39. a=input('请输入区间的下界:');
  40. b=input('请输入区间的上界:');
  41. posit_x=lnter2Max(x,a,b);
  42. disp(['第' num2str(i) '列区间型正向化处理完成'])
  43. disp('------------------分界线-----------------------')
  44. else
  45. disp('没有这种类型的指标,请检查Type向量中是否有除了1,2,3之外的其他值')
  46. end
  47. end
  48. %自定义函数 极小型转极大型
  49. function [posit_x]=Min2Max(x)
  50. posit_x=max(x)-x;
  51. end
  52. %自定义函数 中间型转极大型
  53. function [posit_x]=Mid2Max(x,best)
  54. M=max(abs(x-best));
  55. posit_x=1-abs(x-best)/M;
  56. end
  57. %自定义函数 区间型转极大型
  58. function [posit_x]=lnter2Max(x,a,b)
  59. r_x=size(x,1);
  60. M=max([a-min(x),max(x)-b]);
  61. posit_x=zeros(r_x,1);
  62. for i=1:r_x
  63. if x(i)<a
  64. posit_x(i)=1-(a-x(i))/M;
  65. elseif x(i)>b
  66. posit_x(i)=1-(x(i)-b)/M;
  67. else
  68. posit_x(i)=1;
  69. end
  70. end
  71. end

2.通用Floyd算法

  1. %西南石油计科罗文睿
  2. function [dist,mypath]=myfloyd(a,sb,db);
  3. %a-邻接矩阵 元素a(i,j)-顶点i到j之间的直达距离,可以是有向的
  4. %sb-起点的标号 db-终点的标号
  5. %输出:dist-最短路的距离 mypath-最短路的路径
  6. n=size(a,1);
  7. path=zeros(n);
  8. for k=1:n
  9. for i=1:n
  10. for j=1:n
  11. if a(i,j)>a(i,k)+a(k,j)
  12. a(i,j)=a(i,k)+a(k,j);
  13. path(i,j)=k;
  14. end
  15. end
  16. end
  17. end
  18. dist=a(sb,db);
  19. parent=path(sb,:);
  20. parent(parent==0)=sb;
  21. mypath=db;
  22. t=db;
  23. while t~=sb
  24. p=parent(t);
  25. mypath=[p,mypath];
  26. t=p;
  27. end

3.通用Dijkstra代码

  1. %西南石油计科罗文睿
  2. function [mydistance,mypath]=mydijkstra(a,sb,db);
  3. %a是邻接矩阵 a(i,j)-i到j之间的距离,可以是有向的
  4. %sb-起点的标号 db-终点的标号
  5. %mydistance-最短路的距离 mypath-最短路的路径
  6. n=size(a,1);
  7. visited(1:n)=0;
  8. distance(1:n)=inf;
  9. distance(sb)=0;
  10. visited(sb)=1;
  11. u=sb;
  12. parent(1:n)=0;
  13. for i=1:n-1
  14. id=find(visited==0);
  15. for v=id
  16. if a(u,v)+distance(u)<distance(v)
  17. distance(v)=distance(u)+a(u,v);
  18. parent(v)=u;
  19. end
  20. end
  21. temp=distance;
  22. temp(visited==1)=inf;
  23. [t,u]=min(temp);
  24. visited(u)=1;
  25. end
  26. mypath=[];
  27. if parent(db)~=0
  28. t=db;
  29. mypath=[db];
  30. while t~=sb
  31. P=parent(t);
  32. mypath=[P mypath];
  33. t=P;
  34. end
  35. end
  36. mydistance=distance(db);

4.层次分析法代码

  1. %西南石油计科罗文睿
  2. % 使用方法
  3. %(1)构造判断矩阵A
  4. %(2)将下文代码复制粘贴到Matlab中即可
  5. % 例如:A=[1 3 5;0.33 1 3;0.2 0.33,1]
  6. disp('请输入准则层判断矩阵A(n阶)');
  7. A=input('A=');
  8. [n,n]=size(A);
  9. [V,D]=eig(A);%求得特征向量和特征值
  10. %求出最大特征值和它所对应的特征向量
  11. tempNum=D(1,1);
  12. pos=1;
  13. for h=1:n
  14. if D(h,h)>tempNum
  15. tempNum=D(h,h);
  16. pos=h;
  17. end
  18. end
  19. w=abs(V(:,pos));
  20. w=w/sum(w);
  21. t=D(pos,pos);
  22. disp('准则层特征向量w=');disp(w);disp('准则层最大特征根t=');disp(t);
  23. %以下是一致性检验
  24. CI=(t-n)/(n-1);RI=[0 0 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 1.60 1.61 1.615 1.62 1.63];
  25. CR=CI/RI(n);
  26. if CR<0.10
  27. disp('此矩阵的一致性可以接受!');
  28. disp('CI=');disp(CI);
  29. disp('CR=');disp(CR);
  30. else disp('此矩阵的一致性验证失败,请重新进行评分!');
  31. end
  32. disp('请输入方案层各因素对准则层各因素权重的成对比较阵');
  33. for i=1:n
  34. disp('请输入第');disp(i);disp('个准则层因素的判断矩阵B');disp(i);

5.插值与拟合代码

  1. % 一维插值步骤
  2. %(1)输入已知数据,x,y
  3. %(2)输入待插自变量的值x1
  4. x=1:12;
  5. y=[5 8 9 15 25 29 31 30 22 25 27 24];
  6. x1=1:0.1:12;
  7. t=interp1(x,y,x1,'spline');%
  8. plot(x1,t,'r:') %作图
  9. xlabel('x'),ylabel('y')
  10. % 二维插值步骤
  11. %(1)先输入二维数据的x,y坐标值
  12. %(2)输入Z数据
  13. %(3)输入待插点的x,y坐标
  14. %(4)应用函数插值即可
  15. x=1:5;
  16. y=1:3;
  17. temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
  18. mesh(x,y,temps);
  19. xi=1:0.2:5;
  20. yi=1:0.2:3;
  21. zi=interp2(x,y,temps,xi',yi,'cubic');
  22. mesh(xi,yi,zi);
  23. % 多项式拟合步骤
  24. % (1)输入待拟合数据x,y
  25. % (2)输入函数公式进行拟合
  26. x=0:0.1:1;
  27. y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];
  28. A=polyfit(x,y,2)
  29. % 指定函数拟合步骤
  30. % (1)输入待拟合数据x,y
  31. %(2)指定函数关系式
  32. syms t;
  33. x=[0;0.4;1.2;2;2.8;3.6;4.4;5.2;6;7.2;8;9.2;10.4;11.6;12.4;13.6;14.4;15];
  34. y=[1;0.85;0.29;-0.27;-0.53;-0.4;-0.12;0.17;0.28;0.15;-0.03;-0.15;-0.071;0.059;0.09;0.032;-0.015;-0.02];%指定函数形式为f(t)=acos(kt)e^(wt),进行拟合
  35. f=fittype('a*cos(k*t)*exp(w*t)','independent','t','coefficients',{'a','k','w'});
  36. cfun=fit(x,y,f) %显示拟合函数
  37. xi=0:.1:20;
  38. yi=cfun(xi);
  39. plot(x,y,'r*',xi,yi,'b-');

6.灰色关联分析代码

  1. %灰色关联分析步骤
  2. %【1】确定比较对象(评价对象)(就是数据,并且需要进行规范化处理,就是标准化处理,见下面例题的表格数据)和参考数列(评价标准,一般该列数列都是1,就是最优的的情况)
  3. %【2】确定各个指标权重,可用层次分析确定
  4. %【3】计算灰色关联系数
  5. %【4】计算灰色加权关联度
  6. %【5】评价分析
  7. x1=[1.14 1.49 1.69 2.12 2.43 4.32 5.92 6.07 7.85;3.30 3.47 3.61 3.80 4.00 4.19 4.42 4.61 4.80;6.00 6.00 6.00 7.50 7.50 7.50 9.00 9.00 9.00;1.20 1.20 1.80 1.80 1.80 2.40 2.70 3.60 4.00;4.87 5.89 6.76 7.97 8.84 10.05 11.31 12.25 11.64]%原始数据5行9列
  8. x=x1;
  9. for i=1:5
  10. for j=1:9
  11. x(i,j)=x(i,j)/x1(1,j)
  12. end
  13. end
  14. x1=x
  15. for i=1:5
  16. for j=1:9
  17. x(i,j)=abs(x(i,j)-x1(i,1))
  18. end
  19. end
  20. max=x(1,1)
  21. min=x(1,1)
  22. for i=1:5
  23. for j=1:9
  24. if x(i,j)>=max
  25. max=x(i,j)
  26. end
  27. end
  28. end
  29. for i=1:5
  30. for j=1:9
  31. if x(i,j)<=min
  32. min=x(i,j)
  33. end
  34. end
  35. end
  36. k=0.5 %分辨系数取值
  37. l=(min+k*max)./(x+k*max)%求关联系数矩阵
  38. guanliandu=sum(l')/n
  39. [rs,rind]=sort(guanliandu,'descend') %对关联度进行排序

7.主成分分析代码

  1. % PCA步骤:
  2. %(1)对原始数据进行标准化处理
  3. %(2)计算样本相关系数矩阵
  4. %(3)计算相关系数矩阵R的特征值和相应的特征向量
  5. %(4)选择重要的主成分,写出主成分表达式
  6. %下例中企业综合实力排序问题,其中各列分别为:企业序号;净利润率;固定资产利润率;总产值利润率;销售收入利润率;产品成本利润率;物耗利润率;人均利润;流动资金
  7. x =
  8. 1.0000 40.4000 24.7000 7.2000 6.1000 8.3000 8.7000 2.4420 20.0000
  9. 2.0000 25.0000 12.7000 11.2000 11.0000 12.9000 20.2000 3.5420 9.1000
  10. 3.0000 13.2000 3.3000 3.9000 4.3000 4.4000 5.5000 0.5780 3.6000
  11. 4.0000 22.3000 6.7000 5.6000 3.7000 6.0000 7.4000 0.1760 7.3000
  12. 5.0000 34.3000 11.8000 7.1000 7.1000 8.0000 8.9000 1.7260 27.5000
  13. 6.0000 35.6000 12.5000 16.4000 16.7000 22.8000 29.3000 3.0170 26.6000
  14. 7.0000 22.0000 7.8000 9.9000 10.2000 12.6000 17.6000 0.8470 10.6000
  15. 8.0000 48.4000 13.4000 10.9000 9.9000 10.9000 13.9000 1.7720 17.8000
  16. 9.0000 40.6000 19.1000 19.8000 19.0000 29.7000 39.6000 2.4490 35.8000
  17. 10.0000 24.8000 8.0000 9.8000 8.9000 11.9000 16.2000 0.7890 13.7000
  18. 11.0000 12.5000 9.7000 4.2000 4.2000 4.6000 6.5000 0.8740 3.9000
  19. 12.0000 1.8000 0.6000 0.7000 0.7000 0.8000 1.1000 0.0560 1.0000
  20. 13.0000 32.3000 13.9000 9.4000 8.3000 9.8000 13.3000 2.1260 17.1000
  21. 14.0000 38.5000 9.1000 11.3000 9.5000 12.2000 16.4000 1.3270 11.6000
  22. 15.0000 26.2000 10.1000 5.6000 15.6000 7.7000 30.1000 0.1260 25.9000
  23. A=x;
  24. a=size(A,1);%获得矩阵A的行大小
  25. b=size(A,2);%获得矩阵A的列大小
  26. for i=1:b
  27. SA(:,i)=(A(:,i)-mean(A(:,i)))/std(A(:,i));%std函数是用来求向量的标准差
  28. end
  29. % %计算相关系数矩阵的特征值和特征向量
  30. CM=corrcoef(SA);%计算相关系数矩阵
  31. [V,D]=eig(CM);%计算特征值和特征向量
  32. for j=1:b
  33. DS(j,1)=D(b+1-j,b+1-j);%对特征值按降序排列
  34. end
  35. for i=1:b
  36. DS(i,2)=DS(i,1)/sum(DS(:,1));%贡献率
  37. DS(i,3)=sum(DS(1:i,1))/sum(DS(:,1));%累计贡献率
  38. end
  39. % % 选择主成分及对应的特征向量
  40. T=0.9;%主成分信息保留率
  41. for k=1:b
  42. if DS(k,3)>=T
  43. Com_num=k;
  44. break;
  45. end
  46. end
  47. %提取主成分对应的特征向量
  48. for j=1:Com_num
  49. PV(:,j)=V(:,b+1-j);
  50. end
  51. % % 计算各评价对象的主成分得分
  52. new_score=SA*PV;
  53. for i=1:a
  54. total_score(i,1)=sum(new_score(i,:));
  55. total_score(i,2)=i;
  56. end
  57. result_report=[new_score,total_score];%将各主成分得分与总分放在同一个矩阵中
  58. result_report=sortrows(result_report,-4);%按总分降序排序
  59. % % 输出模型及结果报告
  60. disp('特征值及其贡献率,累加贡献率:')
  61. DS
  62. disp('信息保留率T对应的主成分数与特征向量:')
  63. Com_num
  64. PV
  65. disp('主成分得分及排序(按第四列的总分进行排序,前三列为个主成分得分,第五列为企业编号)')
  66. result_report

8.蒙特卡洛算法代码

  1. %蒙特卡洛法是经过大量事件的统计结果来实现一些确定性问题的计算。
  2. %使用蒙特卡洛法必须使用计算机生成相关分布的随机数。
  3. %例如:y = x^2 ,y = 12 - x与X轴在第一象限与X轴围成一个曲边三角形。设计一个随机试验,求该图形的近似值。
  4. x=0:0.25:12
  5. y1=x.^2;
  6. y2=12-x;
  7. plot(x,y1,x,y2)
  8. xlabel('x');ylabel('y');
  9. legend('y1=x^2','y2=12-x');
  10. title('罗文睿绘制');
  11. axis([0 15 0 15]);
  12. text(3,9,'交点');
  13. grid on
  14. x=unifrnd(0,12,[1,10000000]);
  15. y=unifrnd(0,9,[1,10000000]);
  16. frequency=sum(y<x.^2 & x<=3)+sum(y<12-x & x>=3)
  17. area=12*9*frequency/10^7

9.规划模型代码

  1. %线性规划步骤
  2. %(1)定义决策变量
  3. %(1)构造目标函数
  4. %(2)寻找限制条件
  5. %(4)按照步骤带入Matlab函数
  6. c=-[5,3]';
  7. A=[2,1;1,2];
  8. b=[40,50]';
  9. L=[0, 0];
  10. [x,fmin]=linprog(c,A,b,[],[],L);
  11. Pmax=-fmin
  12. x1=x(1), x2=x(2)
  13. % 非线性规划代码
  14. H=[1 -1; -1 2];
  15. c=[-2 ;-6];A=[1 1; -1 2];b=[2;2];
  16. Aeq=[];beq=[]; VLB=[0;0];VUB=[];
  17. [x,z]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB)
  18. % 多目标规划代码
  19. f=[3;-2];
  20. A=[2,3;2,1];
  21. b=[18;10];
  22. lb=[0;0];
  23. [x,fval]=linprog(f,A,b,[],[],lb)
  24. f=[-4;-3];
  25. A=[2,3;2,1];
  26. b=[18;10];
  27. lb=[0;0];
  28. [x,fval]=linprog(f,A,b,[],[],lb)

10.灰色预测算法代码

  1. % 灰色预测步骤
  2. %(1)输入前期的小样本数据
  3. %(2)输入预测个数
  4. %(3)运行
  5. y=input('请输入数据');
  6. n=length(y);
  7. yy=ones(n,1);
  8. yy(1)=y(1);
  9. for i=2:n
  10. yy(i)=yy(i-1)+y(i)
  11. end
  12. B=ones(n-1,2);
  13. for i=1:(n-1)
  14. B(i,1)=-(yy(i)+yy(i+1))/2;
  15. B(i,2)=1;
  16. end
  17. BT=B';
  18. for j=1:(n-1)
  19. YN(j)=y(j+1);
  20. end
  21. YN=YN';
  22. A=inv(BT*B)*BT*YN;
  23. a=A(1);
  24. u=A(2);
  25. t=u/a;
  26. t_test=input('输入需要预测的个数');
  27. i=1:t_test+n;
  28. yys(i+1)=(y(1)-t).*exp(-a.*i)+t;
  29. yys(1)=y(1);
  30. for j=n+t_test:-1:2
  31. ys(j)=yys(j)-yys(j-1);
  32. end
  33. x=1:n;
  34. xs=2:n+t_test;
  35. yn=ys(2:n+t_test);
  36. plot(x,y,'^r',xs,yn,'*-b');
  37. det=0;
  38. for i=2:n
  39. det=det+abs(yn(i)-y(i));
  40. end
  41. det=det/(n-1);
  42. disp(['百分绝对误差为:',num2str(det),'%']);
  43. disp(['预测值为:',num2str(ys(n+1:n+t_test))]);

11.智能算法之模拟退火算法

  1. %生成初始解,求目标函数f(x)=x1^2+x2^2+8在x1^2-x2>0;-x1-x2^2+2=0约束下的最小值问题
  2. sol_new2=1;%(1)解空间(初始解)
  3. sol_new1=2-sol_new2^2;
  4. sol_current1 = sol_new1;
  5. sol_best1 = sol_new1;
  6. sol_current2 = sol_new2;
  7. sol_best2 = sol_new2;
  8. E_current = inf;
  9. E_best = inf;
  10. rand('state',sum(clock)); %初始化随机数发生器
  11. t=90; %初始温度
  12. tf=89.9; %结束温度
  13. a = 0.99; %温度下降比例
  14. while t>=tf%(7)结束条件
  15. for r=1:1000 %退火次数
  16. %产生随机扰动(3)新解的产生
  17. sol_new2=sol_new2+rand*0.2;
  18. sol_new1=2-sol_new2^2;
  19. %检查是否满足约束
  20. if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0
  21. else
  22. sol_new2=rand*2;
  23. sol_new1=2-sol_new2^2;
  24. continue;
  25. end
  26. %退火过程
  27. E_new=sol_new1^2+sol_new2^2+8;%(2)目标函数
  28. if E_new<E_current%(5)接受准则
  29. E_current=E_new;
  30. sol_current1=sol_new1;
  31. sol_current2=sol_new2;
  32. if E_new<E_best
  33. %把冷却过程中最好的解保存下来
  34. E_best=E_new;
  35. sol_best1=sol_new1;
  36. sol_best2=sol_new2;
  37. end
  38. else
  39. if rand<exp(-(E_new-E_current)/t)%(4)代价函数差
  40. E_current=E_new;
  41. sol_current1=sol_new1;
  42. sol_current2=sol_new2;
  43. else
  44. sol_new1=sol_current1;
  45. sol_new2=sol_current2;
  46. end
  47. end
  48. plot(r,E_best,'*')
  49. hold on
  50. end
  51. t=t*a;%(6)降温
  52. end
  53. disp('最优解为:')
  54. disp(sol_best1)
  55. disp(sol_best2)
  56. disp('目标表达式的最小值等于:')
  57. disp(E_best)

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/887364
推荐阅读
相关标签
  

闽ICP备14008679号