一,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));
三,灰色预测代码
clearclc
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?
- 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);
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)
该命令用指定的算法找出一个二元函数,然后以给出处的值。返回数据矩阵,Xi,Yi是向量,且必须单调,和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?
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,6,y=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?
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为幂次从高到低的多项式系数向量p。x必须是单调的。矩阵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?
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
曲线拟合图形:
也可由函数给出数据。
例3:x=1:20,y=x+3*sin(x)
程序:
[plain] view plaincopyprint?
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?
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
可用不同阶的多项式来拟合数据,但也不是阶数越高拟合的越好。
六,层次分析法
七,参数估计
文章的主要思想来源于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?
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?
[plain] view plaincopyprint?
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)));
运行结果如图所示:
从图中可以看出,随机数在这里变成了统计信息,统计信息反映到了绘制的点信息上,图中圆圈所示。真实的pdf为红色曲线,估计的曲线为蓝色虚线。从图中可知,估计的效果非常满意。
如果在函数中加上:
[plain] view plaincopyprint?
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?
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函数来说,它需要一个先验信息,即参数的初值。我们在调用的时候用了初值8,20.这个先验信息对更进一步的拟合最后的结果有着相当重要的作用!因此,对于参数估计,先验信息还是相当重要的。
由于有这种技巧存在,了解了fminsearch函数之后,可以有很多的扩展应用。
八,旅行商TSP问题
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?