数学建模-常见数据分析代码

一,matlab绘图函数汇总

基本绘图和图形

box

坐标轴边界

errorbar

沿曲线绘制误差条

hold

在图形窗口中保留当前图形

line

创建线条对象

LineSpec (Line Specification)

线条规格字符串语法

loglog

对数-对数刻度图

plot

二维线条图

plot3

三维线条图

plotyy

y轴分居左右两侧的线条图

polar

极坐标图

semilogx, semilogy

半对数坐标图

subplot

在窗口的平铺位置创建坐标轴

 

绘图工具

figurepalette

显示或隐藏图形窗口的调色板

pan

交互式移动图像以多方向浏览

plotbrowser

显示或隐藏窗口的图形浏览器

plotedit

交互式编辑和标注图形

plottools

显示或隐藏图形工具

propertyeditor

显示或隐藏属性编辑器

rotate3d

使用鼠标旋转三维视图

showplottool

显示或隐藏窗口的图形工具

zoom

图形的放大、缩小或按比例缩放

 

标注图形

annotation

创建注释对象

clabel

等高线高程标签

datacursormode

使能或禁止交互式数据光标模式

datetick

日期格式的刻度标签

gtext

在二维视图中利用鼠标放置文本

legend

线条和补片对象的图例

rectangle

创建二维矩形对象

texlabel

产生Tex格式的字符串

title

为当前坐标轴添加标题

xlabel, ylabel, zlabel

X,Y和Z轴的标签

 

专业绘图(Area、条形图、圆饼图)

area

填充区域的二维图形

bar, barh

绘制条形图(垂直和水平)

bar3, bar3h

绘制三维条形图

pareto

帕累托图表

pie

饼图

pie3

三维饼图

专业绘图(等高线图)

contour

等高线图矩阵

contour3

三维等高线图

contourc

低层次的等高线图计算

contourf

填充二维等高线图

ezcontour

易于使用的轮廓绘图仪

ezcontourf

易于使用的填充轮廓绘图仪

 

专业绘图(方向和速度图)

comet

二维彗星图

comet3

三维彗星图

compass

绘制从原点射出的箭头

feather

绘制速度矢量图

quiver

抖动或速度图

quiver3

三维抖动或速度图

 

专业绘图(离散数据图)

stairs

阶梯图

stem

情节离散序列数据

stem3

情节 3 - D离散序列数据

 

专业绘图(函数绘图)

ezcontour

易用的等高线绘图仪

ezcontourf

易用的填充的等高线绘图仪

ezmesh

易用的三维网格绘图仪

ezmeshc

易用的组合式的网格 /等高线绘图仪

ezplot

易用的函数绘图仪

ezplot3

易用的三维参数化曲线绘图仪

ezpolar

易用的极坐标绘图仪

ezsurf

易用的三维彩色绘图仪

ezsurfc

易用的曲面/等高线绘图仪

fplot

在指定的坐标范围内绘制图形

 

专业绘图(直方图)

hist

直方图阴谋

histc

直方图计数

rose

角直方图阴谋

专业绘图(多边形和曲面)

cylinder

生成缸

delaunay

Delaunay三角网

delaunay3

三维 Delaunay镶嵌

delaunayn

N维 Delaunay镶嵌

dsearch

搜索Delaunay三角网的最近点

ellipsoid

生成椭球

fill

填充二维多边形

fill3

填充的3 - D多边形

inpolygon

多边形区域内点

pcolor

伪(棋盘)阴谋

polyarea

多边形面积

rectint

矩形的交集区

ribbon

丝带阴谋

slice

容积片情节

sphere

生成领域

waterfall

瀑布图

专业绘图(散点/气泡图)

plotmatrix

散点图矩阵

scatter

散点图

scatter3

三维散点图

专业绘图(动画)

frame2im

返回图像数据与电影相关的框架

getframe

电影帧捕获

im2frame

帧图像转换到电影

movie

播放录制的电影帧

noanimate

所有对象的变化 EraseMode正常

 

位图图像

frame2im

返回图像数据与电影相关的框架

im2frame

帧图像转换到电影

im2java

图像转换到Java形象

image

显示图像对象

imagesc

规模的数据和显示图像对象

imfinfo

信息图形文件

imformats

管理图像文件格式的注册表

imread

阅读图像从图形文件

imwrite

写入图像图形文件

ind2rgb

索引图像转换到RGB图像

 

打印

hgexport

出口数字

orient

印刷纸张方向

print, printopt

打印数字或保存到文件和打印机的默认配置

printdlg

打印对话框

printpreview

打印预览图

saveas

保存数字或Simulink框图使用指定的格式

 

句柄图形(查找和辨识图形对象)

allchild

查找指定对象的所有儿童

ancestor

祖先的图形对象

copyobj

复制的图形对象和他们的后代

delete

删除文件或图形对象

findall

查找所有的图形对象

findfigs

查找离屏数字可见

findobj

找到具有特殊性能的图形对象

gca

当前轴手柄

gcbf

处理数字包含对象,其回调是执行

gcbo

处理的对象,其回调是执行

gco

处理当前对象

get

查询处理图形对象的属性

ishandle

确定是否输入是有效的句柄图形处理

propedit

打开属性编辑器

set

处理图形对象的属性设置

 

句柄图形(对象创建函数)

axes

创建轴图形对象

figure

创建数字图形对象

hggroup

创建 hggroup对象

hgtransform

创建 hgtransform图形对象

image

显示图像对象

light

根据创建对象

line

创建线对象

patch

创建一个或多个填充多边形

rectangle

创建二维矩形对象

root object

surface

创建面对象

text

创建文本对象在当前轴

uicontextmenu

创建上下文菜单

 

句柄图形(绘图对象)

Annotation Arrow Properties

注释定义箭头性能

Annotation Doublearrow Properties

定义注释 doublearrow性能

Annotation Ellipse Properties

椭圆定义批注的属性

Annotation Line Properties

注释行属性定义

Annotation Rectangle Properties

注释定义矩形属性

Annotation Textarrow Properties

定义注释 textarrow性能

Annotation Textbox Properties

定义注释文本框属性

 

Areaseries Properties

属性定义 areaseries

Barseries Properties

属性定义 barseries

Contourgroup Properties

属性定义 contourgroup

Errorbarseries Properties

属性定义 errorbarseries

Image Properties

定义图像属性

Lineseries Properties

属性定义 lineseries

Quivergroup Properties

属性定义 quivergroup

Scattergroup Properties

属性定义 scattergroup

Stairseries Properties

属性定义 stairseries

Stemseries Properties

属性定义 stemseries

Surfaceplot Properties

属性定义 surfaceplot

句柄图形(图形窗口)

clf

清除目前的数字窗口

close

删除指定的数字

closereq

默认关闭请求函数图

drawnow

刷新事件队列和更新的数字窗口

gcf

目前的数字处理

hgload

负载处理图形对象的层次结构从文件

hgsave

保存对象的层次结构来处理图形文件

newplot

确定要绘制图形对象

opengl

控制OpenGL渲染

refresh

目前的数字重绘

saveas

保存数字或Simulink框图使用指定的格式

 

句柄图形(坐标轴操作)

axis

轴缩放和外观

box

轴边界

cla

清除当前轴

gca

当前轴手柄

grid

电网线 2 - D和3 - D图

ishold

当前保持状态

makehgtform

创建 4 × 4变换矩阵

 

句柄图形(对象属性操作)

get

查询处理图形对象的属性

linkaxes

同步限制指定的2 - D轴

linkprop

保持相应的属性值相同

refreshdata

刷新数据图表数据源时指定

set

处理图形对象的属性设置

二,hamiton回路算法

提供一种求解最优哈密尔顿的算法---三边交换调整法,要求在运行jiaohuan3(三交换法)之前,给定邻接矩阵C和节点个数N,结果路径存放于R中。
bianquan.m文件给出了一个参数实例,可在命令窗口中输入bianquan,得到邻接矩阵C和节点个数N以及一个任意给出的路径R,,回车后再输入jiaohuan3,得到了最优解。

由于没有经过大量的实验,又是近似算法,对于网络比较复杂的情况,可以尝试多运行几次jiaohuan3,看是否能到进一步的优化结果。

%%%%%%bianquan.m%%%%%%%

N=13;

for i=1:N

    for j=1:N

        C(i,j)=inf;

    end

end

for i=1:N

    C(i,i)=0;

end

C(1,2)=6.0;C(1,13)=12.9;

C(2,3)=5.9;C(2,4)=10.3;

C(3,4)=12.2;C(3,5)=17.6;

C(4,13)=8.8;C(4,7)=7.4;

C(4,5)=11.5;

C(5,2)=17.6;C(5,6)=8.2;

C(6,9)=14.9;C(6,7)=20.3;

C(7,9)=19.0;C(7,8)=7.3;

C(8,9)=8.1;C(8,13)=9.2;

C(9,10)=10.3;

C(10,11)=7.7;

C(11,12)=7.2;

C(12,13)=7.9;

for i=1:N

    for j=1:N

        if  C(i,j) < inf

            C(j,i)=C(i,j);

        end

    end

end

for i=1:N

    C(i,i)=0;

end

 

R=[4 7 6 5 3 2 1 13 12 11 10 9 8];

 

 

 

 

%%%%%%%%jiaohuan3.m%%%%%%%%%%

n=0;

for I=1:(N-2)

    for J=(I+1):(N-1)

        for K=(J+1):N

            n=n+1;

            Z(n,:)=[I J K];

        end

    end

end

R=1:N

for m=1:(N*(N-1)*(N-2)/6)

    I=Z(m,1);J=Z(m,2);K=Z(m,3);

    r=R;

    if J-I~=1&K-J~=1&K-I~=N-1

        for q=1:(J-I)

            r(I+q)=R(J+1-q);

        end

        for q=1:(K-J)

            r(J+q)=R(K+1-q);

        end

    end

    if J-I==1&K-J==1

        r(K)=R(J);r(J)=R(K);

    end

    if J-I==1&K-J~=1&K-I~=N-1

        for q=1:(K-J)

            r(I+q)=R(I+1+q);

        end

        r(K)=R(J);

    end

    if K-J==1&J-I~=1&K~=N

        for q=1:(J-I)

            r(I+1+q)=R(I+q);

        end

        r(I+1)=R(K);

    end

    if I==1&J==2&K==N

        for q=1:(N-2)

            r(1+q)=R(2+q);

        end

        r(N)=R(2);

    end

    if I==1&J==(N-1)&K==N

        for q=1:(N-2)

            r(q)=R(1+q);

        end

        r(N-1)=R(1);

    end

    if J-I~=1&K-I==N-1

        for q=1:(J-1)

            r(q)=R(1+q);

        end

        r(J)=R(1);

    end

    if J==(N-1)&K==N&J-I~=1

        r(J+1)=R(N);

        for q=1:(N-J-1)

            r(J+1+q)=R(J+q);

        end

    end

    if cost_sum(r,C,N)

        R=r

    end

end

fprintf('总长为%f\n',cost_sum(R,C,N))

%%%%%%cost_sum.m%%%%%%%%function y=cost_sum(x,C,N)y=0;for i=1:(N-1) y=y+C(x(i),x(i+1));endy=y+C(x(N),x(1));

 

三,灰色预测代码

clear

clc

X=[136 143 165 152 165 181 204 272 319 491 571 605 665 640 628];

x1(1)=X(1);

X1=[];

for i=1:1:14

   x1(i+1)=x1(i)+X(i+1);

   X1=[X1,x1(i)];

end

X1=[X1,X1(14)+X(15)]

for k=3:1:15

   p(k)=X(k)/X1(k-1);

   p1(k)=X1(k)/X1(k-1);

end

 p,p1

 clear k

Z=[];

for k=2:1:15

   z(k)=0.5*X1(k)+0.5*X1(k-1);

   Z=[Z,z(k)];

end

 Z

 B=[-Z',ones(14,1)]

 

Y=[];

clear i

for i=2:1:15

  Y=[Y;X(i)];

end

Y

A=inv(B'*B)*B'*Y

clear k

y1=[];

for k=1:1:15

   y(k)=(X(1)-A(2)/A(1))*exp(-A(1)*(k-1))+A(2)/A(1);

   y1=[y1;y(k)];

end

y1

clear k

X2=[];

for k=2:1:15

   x2(k)=y1(k)-y1(k-1);

   X2=[X2;x2(k)];

end

X2=[y1(1);X2]

e=X'-X2

m=abs(e)./X'

s=e'*e

n=sum(m)/13

clear k

syms k

y=(X(1)-A(2)/A(1))*exp(-A(1)*(k-1))+A(2)/A(1)

Y1=[];

for j=16:1:21

   y11=subs(y,k,j)-subs(y,k,j-1);

   Y1=[Y1;y11];

end

Y1

%程序中的变量定义:alpha是包含α、μ值的矩阵;%ago是预测后累加值矩阵;var是预测值矩阵;%error是残差矩阵; c是后验差比值function basicgrey(x,m) %定义函数basicgray(x)if nargin==1 %m为想预测数据的个数,默认为1 m=1;endclc; %清屏,以使计算结果独立显示if length(x(:,1))==1 %对输入矩阵进行判断,如不是一维列矩阵,进行转置变换 x=x';endn=length(x); %取输入数据的样本量x1(:,1)=cumsum(x); %计算累加值,并将值赋与矩阵be for i=2:n %对原始数列平行移位 Y(i-1,:)=x(i,:);endfor i=2:n %计算数据矩阵B的第一列数据 z(i,1)=0.5*x1(i-1,:)+0.5*x1(i,:);endB=ones(n-1,2); %构造数据矩阵BB(:,1)=-z(2:n,1);alpha=inv(B'*B)*B'*Y; %计算参数α、μ矩阵for i=1:n+m %计算数据估计值的累加数列,如改n+1为n+m可预测后m个值 ago(i,:)=(x1(1,:)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(i-1))+alpha(2,:)/alpha(1,:);endvar(1,:)=ago(1,:);for i=1:n+m-1 %可预测后m个值 var(i+1,:)=ago(i+1,:)-ago(i,:); %估计值的累加数列的还原,并计算出下m个预测值end[P,c,error]=lcheck(x,var); %进行后验差检验[rela]=relations([x';var(1:n)']); %关联度检验ago %显示输出预测值的累加数列alpha %显示输出参数α、μ数列var %显示输出预测值error %显示输出误差P %显示计算小残差概率c %显示后验差的比值crela %显示关联度judge(P,c,rela) %评价函数 显示这个模型是否合格

function judge(P,c,rela)

%评价指标  并显示比较结果

if rela>0.6

    '根据经验 关联度检验结果为满意(关联度只是参考 主要看后验差的结果)'

else

    '根据经验 关联度检验结果为不满意(关联度只是参考 主要看后验差的结果)'

end

if P>0.95&c<0.5

    '后验差结果显示 这个模型评价为“优”'

else if P>0.8&c<0.5

        '后验差结果显示 这个模型评价为“合格”'

    else if P>0.7&c<0.65

            '后验差结果显示 这个模型评价为“勉强合格”'

        else

            '后验差结果显示 这个模型评价为“不合格”'

        end

    end

end

 

function [P,c,error]=lcheck(x,var)

%进行后验差检验

n=length(x);

for i=1:n

     error(i,:)=abs(var(i,:)-x(i,:));     %计算绝对残差

end

c=std(abs(error))/std(x);                 %调用统计工具箱的标准差函数计算后验差的比值c

s0=0.6745*std(x);

ek=abs(error-mean(error));

pk=0;

for i=1:n

    if ek(i,:)

        pk=pk+1;

    end

end

P=pk/n;                                   %计算小残差概率

 

 

%附带的质料里有一部分讲了关联度

function [rela]=relations(x)

%以x(1,:)的参考序列求关联度

[m,n]=size(x);

for i=1:m

    for j=n:-1:2

        x(i,j)=x(i,j)/x(i,1);

    end

end

for i=2:m

    x(i,:)=abs(x(i,:)-x(1,:));               %求序列差

end

c=x(2:m,:);

Max=max(max(c));                             %求两极差

Min=min(min(c));

p=0.5;                                       %p称为分辨率,0

for i=1:m-1

    for j=1:n       

         r(i,j)=(Min+p*Max)/(c(i,j)+p*Max);  %计算关联系数

    end

end

for i=1:m-1

    rela(i)=sum(r(i,:))/n;                   %求关联度

end

        

四,非线性拟合

function f=example1(c,tdata)

f=c(1)*(exp(-c(2)*tdata)-exp(-c(3)*tdata));

 

function f=zhengtai(c,x)

f=(1./(sqrt(2.*3.14).*c(1))).*exp(-(x-c(1)).^2./(2.*c(2)^2));

 

x=1:1:12;

y=[0

0

0

1

0

3

10

12

8

2

1

2

]';

c0=[2 8];

for i=1:1000

    c=lsqcurvefit(@zhengtai,c0,x,y);

    c0=c;

end

y1=(1./(sqrt(2.*3.14).*c(1))).*exp(-(x-c(1)).^2./(2.*c(2)^2));

plot(x,y,'r-',x,y1);

legend('实验数据','拟合曲线')

 

x=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16]';

y=[30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 18 15 12 10 7 7 4]';

f=@(c,x)c(1)*(exp(-c(2)*x)-exp(-c(3)*x));

c0=[114 0.1 2]';

for i=1:50

opt=optimset('TolFun',1e-3);

[c R]=nlinfit(x,y,f,c0,opt)

c0=c;

hold on

plot(x,c(1)*(exp(-c(2)*x)-exp(-c(3)*x)),'g')

end

 

t=[0.25 0.5 0.75 1 1.5 2 2.5 3 3.5 4 4.5 5 6 7 8 9 10 11 12 13 14 15 16];y=[30 68 75 82 82 77 68 68 58 51 50 41 38 35 28 25 18 15 12 10 7 7 4];c0=[1 1 1];for i=1:50 c=lsqcurvefit(@example1,c0,t,y); c0=c;endy1=c(1)*(exp(-c(2)*t)-exp(-c(3)*t));plot(t,y,'+',t,y1);legend('实验数据','拟合曲线')

五,插值拟合

 

相关知识

在生产和科学实验中,自变量 与因变量 间的函数关系 有时不能写出解析表达式,而只能得到函数在若干点的函数值或导数值,或者表达式过于复杂而需要较大的计算量。当要求知道其它点的函数值时,需要估计函数值在该点的值。

为了完成这样的任务,需要构造一个比较简单的函数 ,使函数在观测点的值等于已知的值,或使函数在该点的导数值等于已知的值,寻找这样的函数 有很多方法。根据测量数据的类型有以下两类处理观测数据的方法。

1)测量值是准确的,没有误差,一般用插值。

2)测量值与真实值有误差,一般用曲线拟合。

MATLAB中,无论是插值还是拟合,都有相应的函数来处理。

一、插

1、一维插值:

已知离散点上的数据集,即已知在点集X=上的函数值Y=,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。

MATLAB命令:yi=interp1(X, Y, xi, method)

该命令用指定的算法找出一个一元函数,然后以给出处的值。xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一:

‘nearest’:最近邻点插值,直接完成计算;

‘spline’:三次样条函数插值;

‘linear’:线性插值(缺省方式),直接完成计算;

‘cubic’:三次函数插值;

对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。

1:已知某产品从1900年到2010年每隔10年的产量为:75.995, 91.972, 105.711, 123.203,131.699, 150.697, 179.323, 203.212, 226.505, 249.633, 256.344, 267.893,计算出1995年的产量,用三次样条插值的方法,画出每隔一年的插值曲线图形,同时将原始的数据画在同一图上。

解:程序如下

[plain] view plaincopyprint?

  1. year=1900:10:2010;
  2.  
  3. product=[75.995, 91.972, 105.711,123.203, 131.699, 150.697, 179.323, 203.212, 226.505, 249.633, 256.344,267.893]
  4.  
  5. p1995=interp1(year,product,1995)
  6.  
  7. x=1900:2010;
  8.  
  9. y=interp1(year,product,x,'cubic');
  10.  
  11. plot(year,product,'o',x,y);

year=1900:10:2010; product=[75.995, 91.972, 105.711,123.203, 131.699, 150.697, 179.323, 203.212, 226.505, 249.633, 256.344,267.893] p1995=interp1(year,product,1995) x=1900:2010; y=interp1(year,product,x,'cubic'); plot(year,product,'o',x,y);

计算结果为:p1995=252.9885

2、二维插值

已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲面)通过这些点,并能够求出这些已知点以外的点的函数值,这一过程称为二维插值。

MATLAB函数:Zi=interp2(X,Y,Z,Xi,Yi,method)

该命令用指定的算法找出一个二元函数,然后以给出处的值。返回数据矩阵,XiYi是向量,且必须单调,和meshgrid(Xi,Yi)是同类型的。method可以下列方法之一:

‘nearest’:最近邻点插值,直接完成计算;

‘spline’:三次样条函数插值;

‘linear’:线性插值(缺省方式),直接完成计算;

‘cubic’:三次函数插值;

2:已知1950年到1990年间每隔10年,服务年限从10年到30年每隔10年的劳动报酬表如下:

表:某企业工作人员的月平均工资(元)

服务年限

年份

10

20

30

1950

150.697

169.592

187.652

1960

179.323

195.072

250.287

1970

203.212

239.092

322.767

1980

226.505

273.706

426.730

1990

249.633

370.281

598.243

试计算1975年时,15年工龄的工作人员平均工资。

解:程序如下:

[plain] view plaincopyprint?

  1. years=1950:10:1990;
  2.  
  3. service=10:10:30;
  4.  
  5. wage=[150.697 169.592 187.652
  6.  
  7. 179.323 195.072 250.287
  8.  
  9. 203.212 239.092 322.767
  10.  
  11. 226.505 273.706 426.730
  12.  
  13. 249.633 370.281 598.243];
  14.  
  15. mesh(service,years,wage) %绘原始数据图
  16.  
  17. w=interp2(service,years,wage,15,1975); %求点(15,1975)处的值

years=1950:10:1990; service=10:10:30; wage=[150.697 169.592 187.652 179.323 195.072 250.287 203.212 239.092 322.767 226.505 273.706 426.730 249.633 370.281 598.243]; mesh(service,years,wage) %绘原始数据图 w=interp2(service,years,wage,15,1975); %求点(15,1975)处的值

计算结果为:235.6288

3:设有数据x=1,2,3,4,5,6y=1,2,3,4,在由x,y构成的网格上,数据为:

12,10,11,11,13,15

16,22,28,35,27,20

18,21,26,32,28,25

20,25,30,33,32,20

求通过这些点的插值曲面。

解:程序为:

[plain] view plaincopyprint?

  1. x=1:6;
  2.  
  3. y=1:4;
  4.  
  5. t=[12,10,11,11,13,15
  6.  
  7. 16,22,28,35,27,20
  8.  
  9. 18,21,26,32,28,25;
  10.  
  11. 20,25,30,33,32,20]
  12.  
  13. subplot(1,2,1)
  14.  
  15. mesh(x,y,t)
  16.  
  17. x1=1:0.1:6;
  18.  
  19. y1=1:0.1:4;
  20.  
  21. [x2,y2]=meshgrid(x1,y1);
  22.  
  23. t1=interp2(x,y,t,x2,y2,'cubic');
  24.  
  25. subplot(1,2,2)
  26.  
  27. mesh(x1,y1,t1);

x=1:6; y=1:4; t=[12,10,11,11,13,15 16,22,28,35,27,20 18,21,26,32,28,25; 20,25,30,33,32,20] subplot(1,2,1) mesh(x,y,t) x1=1:0.1:6; y1=1:0.1:4; [x2,y2]=meshgrid(x1,y1); t1=interp2(x,y,t,x2,y2,'cubic'); subplot(1,2,2) mesh(x1,y1,t1);

结果如右图。

作业:已知某处山区地形选点测量坐标数据为:

x=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5

y=0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 55.5 6

海拔高度数据为:

z=89 90 87 85 92 91 96 93 90 8782

92 96 98 99 95 91 89 86 84 82 84

96 98 95 92 90 88 85 84 83 81 85

80 81 82 89 95 96 93 92 89 86 86

82 85 87 98 99 96 97 88 85 82 83

82 85 89 94 95 93 92 91 86 84 88

88 92 93 94 95 89 87 86 83 81 92

92 96 97 98 96 93 95 84 82 81 84

85 85 81 82 80 80 81 85 90 93 95

84 86 81 98 99 98 97 96 95 84 87

80 81 85 82 83 84 87 90 95 86 88

80 82 81 84 85 86 83 82 81 80 82

87 88 89 98 99 97 96 98 9492 87
 

1 画出原始数据图;

2 画出加密后的地貌图,并在图中标出原始数据

二、拟合

曲线拟合

已知离散点上的数据集,即已知在点集上的函数值,构造一个解析函数(其图形为一曲线)使在原离散点上尽可能接近给定的值,这一过程称为曲线拟合。最常用的曲线拟合方法是最小二乘法,该方法是寻找函数使得最小。

MATLAB函数:p=polyfit(x,y,n)

[p,s]= polyfit(x,y,n)

说明:x,y为数据点,n为多项式阶数,返回p为幂次从高到低的多项式系数向量px必须是单调的。矩阵s用于生成预测值的误差估计。(见下一函数polyval)

多项式曲线求值函数:polyval( )

调用格式: y=polyval(p,x)

[y,DELTA]=polyval(p,x,s)

说明:y=polyval(p,x)为返回对应自变量x在给定系数P的多项式的值。

[y,DELTA]=polyval(p,x,s) 使用polyfit函数的选项输出s得出误差估计Y DELTA。它假设polyfit函数数据输入的误差是独立正态的,并且方差为常数。则Y DELTA将至少包含50%的预测值。

5:求如下给定数据的拟合曲线,x=[0.5,1.0,1.5,2.0,2.5,3.0]

y=[1.75,2.45,3.81,4.80,7.00,8.60]

解:MATLAB程序如下:

[plain] view plaincopyprint?

  1. x=[0.5,1.0,1.5,2.0,2.5,3.0];
  2.  
  3. y=[1.75,2.45,3.81,4.80,7.00,8.60];
  4.  
  5. p=polyfit(x,y,2)
  6.  
  7. x1=0.5:0.05:3.0;
  8.  
  9. y1=polyval(p,x1);
  10.  
  11. plot(x,y,'*r',x1,y1,'-b')

x=[0.5,1.0,1.5,2.0,2.5,3.0]; y=[1.75,2.45,3.81,4.80,7.00,8.60]; p=polyfit(x,y,2) x1=0.5:0.05:3.0; y1=polyval(p,x1); plot(x,y,'*r',x1,y1,'-b')

计算结果为:

p =0.5614 0.8287 1.1560

此结果表示拟合函数为:

,用此函数拟合数据的效果如图所示。

2由离散数据

x

0

.1

.2

.3

.4

.5

.6

.7

.8

.9

1

y

.3

.5

1

1.4

1.6

1.9

.6

.4

.8

1.5

2

拟合出多项式。

程序:

x=0:.1:1;

y=[.3 .5 1 1.4 1.6 1.9 .6 .4 .8 1.52]

n=3;

p=polyfit(x,y,n)

xi=linspace(0,1,100);

z=polyval(p,xi); %多项式求值

plot(x,y,’o’,xi,z,’k:’,x,y,’b’)

legend(‘原始数据’,’3阶曲线’)

结果:

p =

16.7832 -25.7459 10.9802 -0.0035

多项式为:16.7832x3-25.7459x2+10.9802x-0.0035

曲线拟合图形:

也可由函数给出数据。

3x=1:20,y=x+3*sin(x)

程序:

[plain] view plaincopyprint?

  1. x=1:20;
  2.  
  3. y=x+3*sin(x);
  4.  
  5. p=polyfit(x,y,6)
  6.  
  7. xi=linspace(1,20,100);
  8.  
  9. z=polyval(p,xi); %¶àÏîʽÇóÖµº¯Êý
  10.  
  11. plot(x,y,'o',xi,z,'k:',x,y,'b')

x=1:20; y=x+3*sin(x); p=polyfit(x,y,6) xi=linspace(1,20,100); z=polyval(p,xi); %¶àÏîʽÇóÖµº¯Êý plot(x,y,'o',xi,z,'k:',x,y,'b')

结果:

p =

0.0000 -0.0021 0.0505 -0.5971 3.6472 -9.729511.3304


再用10阶多项式拟合

程序:

[plain] view plaincopyprint?

  1. x=1:20;
  2.  
  3. y=x+3*sin(x);
  4.  
  5. p=polyfit(x,y,10)
  6.  
  7. xi=linspace(1,20,100);
  8.  
  9. z=polyval(p,xi);
  10.  
  11. plot(x,y,'o',xi,z,'k:',x,y,'b')

x=1:20; y=x+3*sin(x); p=polyfit(x,y,10) xi=linspace(1,20,100); z=polyval(p,xi); plot(x,y,'o',xi,z,'k:',x,y,'b')

结果:p =

Columns 1 through 7

0.0000 -0.0000 0.0004 -0.01140.1814 -1.8065 11.2360

Columns 8 through 11

-42.0861 88.5907 -92.8155 40.267
 

可用不同阶的多项式来拟合数据,但也不是阶数越高拟合的越好。

六,层次分析法

  1. disp('请输入判断矩阵A(n)');
  2. A=input('A=');
  3. [n,n]=size(A);
  4. x=ones(n,100);
  5. y=ones(n,100);
  6. m=zeros(1,100);
  7. m(1)=max(x(:,1));
  8. y(:,1)=x(:,1);
  9. x(:,2)=A*y(:,1);
  10. m(2)=max(x(:,2));
  11. y(:,2)=x(:,2)/m(2);
  12. p=0.0001;i=2;k=abs(m(2)-m(1));
  13. while k>p
  14. i=i+1;
  15. x(:,i)=A*y(:,i-1);
  16. m(i)=max(x(:,i));
  17. y(:,i)=x(:,i)/m(i);
  18. k=abs(m(i)-m(i-1));
  19. end
  20. a=sum(y(:,i));
  21. w=y(:,i)/a;
  22. t=m(i);
  23. disp(w);disp(t);
  24. %以下是一致性检验
  25. 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];
  26. CR=CI/RI(n);
  27. if CR<0.10
  28. disp('此矩阵的一致性可以接受!');
  29. disp('CI=');disp(CI);
  30. disp('CR=');disp(CR);
  31. end

七,参数估计

文章的主要思想来源于Matlab|Simulink仿真世界的一篇类似的文章。我这里把这个思想引入到我们的体系来,并以一个新的例子讲解这一用法。

fminsearch用来求解多维无约束的非线性优化问题,它的基本形式是:

[X,FVAL,EXITFLAG,OUTPUT] = FMINSEARCH(FUN,X0,OPTIONS).

大段的Matlab帮助文档我就不翻译解释了,有兴趣的朋友可以参见Matlab联机帮助,我这里只介绍他在参数估计中的作用。

参数估计中经常用到正态分布的参数估计。在matlab系统中有一个函数叫做normfit就直接可以完成这样的参数估计,返回均值mu和均方差 sigma的估计,但是这里有一个要求,就是它的输入信息必须是随机的数字序列。如得到1000个服从正态分布的随机数向量R,用命令[phat pci]=normfit(R),就可以得到参数估计了。然而如果我我们得知某些已经处于pdf函数曲线上的点时,这时需要对函数进行拟合运算。

估计参数的原理是从已知的一序列数据中,对于给定的任何一组参数,计算用其估计数据得到的方差,然后利用fminsearch函数求当方差满足最小的时候的参数,这就是需要估计的参数。

来看一下下面的列子:


[plain] view plaincopyprint?

  1. smu=10,ssig=25;
  2. %假设原来均值方差分别为:1025
  3. R=randn(1000,1)*ssig+smu;
  4.  
  5. %生成满足要求的1000个随机数
  6. [y x]=myhist(R);
  7. %生成统计信息,xy分别表示分组中值序列和落入该组的统计数目
  8. bar(x,y)
  9. %绘制直方图
  10. hold on
  11. plot(x,y,'ro')
  12. %绘制对应点
  13. [pms mse]=normpdffit(x,y,8,20);
  14. %根据得到的统计信息x,y对其进行参数估计,820分别代表均值和方差的初值
  15. t=min(x):(max(x)-min(x))/200:max(x);
  16. %定义绘图区间
  17. ny=normpdf(t,smu,ssig);
  18. %真实分布曲线数据
  19. nyf=normpdf(t,pms(1),pms(2));
  20. %拟合分布曲线数据
  21. plot(t,ny,'r-')
  22. plot(t,nyf,'b-.')
  23. legend('hist','hist value','ture pdf','fit pdf')
  24. %绘制两条曲线作对比

smu=10,ssig=25; %假设原来均值方差分别为:10,25 R=randn(1000,1)*ssig+smu; %生成满足要求的1000个随机数 [y x]=myhist(R); %生成统计信息,x,y分别表示分组中值序列和落入该组的统计数目 bar(x,y) %绘制直方图 hold on plot(x,y,'ro') %绘制对应点 [pms mse]=normpdffit(x,y,8,20); %根据得到的统计信息x,y对其进行参数估计,8,20分别代表均值和方差的初值 t=min(x):(max(x)-min(x))/200:max(x); %定义绘图区间 ny=normpdf(t,smu,ssig); %真实分布曲线数据 nyf=normpdf(t,pms(1),pms(2)); %拟合分布曲线数据 plot(t,ny,'r-') plot(t,nyf,'b-.') legend('hist','hist value','ture pdf','fit pdf') %绘制两条曲线作对比

上面例子中所用的几个函数定义如下:

[plain] view plaincopyprint?

  1. function [h xout]=myhist(data,nbins)
  2. %用于统计信息,生成和pdf函数值相同的hist统计方式。
  3. if nargin==1
  4. nbins=uint32(1+log(length(data))/log(2));
  5. end
  6. nbins=double(nbins);
  7. data=data(:);
  8. [h xout]=hist(data,nbins);
  9. ew=xout(2)-xout(1);
  10. h=h./(ew*length(data));
  11.  

 

[plain] view plaincopyprint?

  1. function [pab mse]= normpdffit(x,y,a0,b0)
  2. %正态分布pdf参数估计
  3. p=[a0 b0];
  4. opt=optimset('fminsearch');
  5. opt.TolX=0.001;
  6. opt.Display='off';
  7. [pab mse]=fminsearch(@normpdfse,p,opt,x,y);
  8. %这里需要注意,opt参数已经传递给fminsearch,但是对于原计算方差的函数来说,还需要两个参数x,y,这两个参数就写在opt参数的后面,这样可以完成其他参数的传递。
  9. %这里说下以前探索的时候的失败经验:用global把参数公有化,然后函数只传递变化的参数(需要估计的参数),但是失败了。所以了解这种参数传递方法是非常有必要的。
  10. function se= normpdfse(pab,X,Y)
  11. %计算对于任何一组参数pab(1)pab(2),给出当前数据下的方差来。
  12. se=var(Y-normpdf(X,pab(1),pab(2)));

function [pab mse]= normpdffit(x,y,a0,b0) %正态分布pdf参数估计 p=[a0 b0]; opt=optimset('fminsearch'); opt.TolX=0.001; opt.Display='off'; [pab mse]=fminsearch(@normpdfse,p,opt,x,y); %这里需要注意,opt参数已经传递给fminsearch,但是对于原计算方差的函数来说,还需要两个参数x,y,这两个参数就写在opt参数的后面,这样可以完成其他参数的传递。 %这里说下以前探索的时候的失败经验:用global把参数公有化,然后函数只传递变化的参数(需要估计的参数),但是失败了。所以了解这种参数传递方法是非常有必要的。 function se= normpdfse(pab,X,Y) %计算对于任何一组参数pab(1),pab(2),给出当前数据下的方差来。 se=var(Y-normpdf(X,pab(1),pab(2)));


运行结果如图所示:

数学建模-常见数据分析代码_第1张图片


从图中可以看出,随机数在这里变成了统计信息,统计信息反映到了绘制的点信息上,图中圆圈所示。真实的pdf为红色曲线,估计的曲线为蓝色虚线。从图中可知,估计的效果非常满意。

如果在函数中加上:

[plain] view plaincopyprint?

  1. disp 'the result of normfit function:'
  2.  
  3. [mu sg]=normfit(R)
  4.  
  5. disp 'the result of fminsearch:'
  6.  
  7. [pms mse]=normpdffit(x,y,8,20)

disp 'the result of normfit function:' [mu sg]=normfit(R) disp 'the result of fminsearch:' [pms mse]=normpdffit(x,y,8,20)

得到结果:

[plain] view plaincopyprint?

  1. the result of normfit function:
  2.  
  3. mu =
  4.  
  5. 10.44306258428258
  6.  
  7. sg=
  8.  
  9. 25.61945417031251
  10.  
  11. the result of fminsearch:
  12.  
  13. pms =
  14.  
  15. 10.30663244862284 25.32479396733891
  16.  
  17. mse =
  18.  
  19. 7.093014695522283e-008

the result of normfit function: mu = 10.44306258428258 sg= 25.61945417031251 the result of fminsearch: pms = 10.30663244862284 25.32479396733891 mse = 7.093014695522283e-008

与真实值相比,我们这里的拟合结果将比直接用normfit的结果更接近真实值。

以这么解释:normfit函数是内部通用的拟合函数,适合范围广,而没有任何先验信息加入,而对于我们的fminsearch函数来说,它需要一个先验信息,即参数的初值。我们在调用的时候用了初值820.这个先验信息对更进一步的拟合最后的结果有着相当重要的作用!因此,对于参数估计,先验信息还是相当重要的。

由于有这种技巧存在,了解了fminsearch函数之后,可以有很多的扩展应用。

 

八,旅行商TSP问题

  1. Lingo代码:
  2. MODEL:
  3.  
  4. SETS:
  5. CITY / 1.. 6/: U; ! U( I) = sequence no. of city;
  6. LINK( CITY, CITY):
  7. DIST, ! The distance matrix;
  8. X; ! X( I, J) = 1 if we use link I, J;
  9. ENDSETS
  10. DATA: !Distance matrix, it need not be symmetric;
  11. DIST =0 56 35 21 51 60
  12. 56 0 21 57 78 70
  13. 35 21 0 36 68 68
  14. 21 57 36 0 51 61
  15. 51 78 68 51 0 13
  16. 60 70 68 61 13 0;
  17. ENDDATA
  18. !The model:Ref. Desrochers & Laporte, OR Letters,
  19. Feb. 91;
  20. N = @SIZE( CITY);
  21. MIN = @SUM( LINK: DIST * X);
  22. @FOR( CITY( K):
  23. ! It must be entered;
  24. @SUM( CITY( I)| I #NE# K: X( I, K)) = 1;
  25. ! It must be departed;
  26. @SUM( CITY( J)| J #NE# K: X( K, J)) = 1;
  27. ! Weak form of the subtour breaking constraints;
  28. ! These are not very powerful for large problems;
  29. @FOR( CITY( J)| J #GT# 1 #AND# J #NE# K:
  30. U( J) >= U( K) + X ( K, J) -
  31. ( N - 2) * ( 1 - X( K, J)) +
  32. ( N - 3) * X( J, K)));
  33. ! Make the X's 0/1;
  34. @FOR( LINK: @BIN( X));
  35. ! For the first and last stop we know...;
  36. @FOR( CITY( K)| K #GT# 1:
  37. U( K) <= N - 1 - ( N - 2) * X( 1, K);
  38. U( K) >= 1 + ( N - 2) * X( K, 1));
  39. END
  40.  

Lingo代码: MODEL: SETS: CITY / 1.. 6/: U; ! U( I) = sequence no. of city; LINK( CITY, CITY): DIST, ! The distance matrix; X; ! X( I, J) = 1 if we use link I, J; ENDSETS DATA: !Distance matrix, it need not be symmetric; DIST =0 56 35 21 51 60 56 0 21 57 78 70 35 21 0 36 68 68 21 57 36 0 51 61 51 78 68 51 0 13 60 70 68 61 13 0; ENDDATA !The model:Ref. Desrochers & Laporte, OR Letters, Feb. 91; N = @SIZE( CITY); MIN = @SUM( LINK: DIST * X); @FOR( CITY( K): ! It must be entered; @SUM( CITY( I)| I #NE# K: X( I, K)) = 1; ! It must be departed; @SUM( CITY( J)| J #NE# K: X( K, J)) = 1; ! Weak form of the subtour breaking constraints; ! These are not very powerful for large problems; @FOR( CITY( J)| J #GT# 1 #AND# J #NE# K: U( J) >= U( K) + X ( K, J) - ( N - 2) * ( 1 - X( K, J)) + ( N - 3) * X( J, K))); ! Make the X's 0/1; @FOR( LINK: @BIN( X)); ! For the first and last stop we know...; @FOR( CITY( K)| K #GT# 1: U( K) <= N - 1 - ( N - 2) * X( 1, K); U( K) >= 1 + ( N - 2) * X( K, 1)); END

[plain] view plaincopyprint?

  1. matlab代码:
  2.  
  3. function main
  4. clc,clear
  5. global a
  6. % a=zeros(6);
  7. % a(1,2)=56;a(1,3)=35;a(1,4)=21;a(1,5)=51;a(1,6)=60;
  8. % a(2,3)=21;a(2,4)=57;a(2,5)=78;a(2,6)=70;
  9. % a(3,4)=36;a(3,5)=68;a(3,6)=68; a(4,5)=51;a(4,6)=61;
  10. % a(5,6)=13; a=a+a';
  11. load cost
  12. a=Muti_Cost;%边权矩阵
  13. L=size(a,1);
  14. c1=1:53; %初始圈
  15. [circle,long]=modifycircle(c1,L);
  16. c2=[1 53 2:52];%改变初始圈,该算法的最后一个顶点不动
  17. [circle2,long2]=modifycircle(c2,L);
  18. if long2
  19. long=long2;
  20. circle=circle2;
  21. end
  22. circle,long
  23. %*******************************************
  24. %修改圈的子函数
  25. %*******************************************
  26. function [circle,long]=modifycircle(c1,L);
  27. global a
  28. flag=1;
  29. while flag>0
  30. flag=0;
  31. for m=1:L-3
  32. for n=m+2:L-1
  33. if a(c1(m),c1(n))+a(c1(m+1),c1(n+1))<...
  34. a(c1(m),c1(m+1))+a(c1(n),c1(n+1))
  35. flag=1;
  36. c1(m+1:n)=c1(n:-1:m+1);
  37. end
  38. end
  39. end
  40. end
  41. long=a(c1(1),c1(L));
  42. for i=1:L-1
  43. long=long+a(c1(i),c1(i+1));
  44. end
  45. circle=c1;

你可能感兴趣的:(其他语言,数学建模)