实验二 绘图及简单科学计算.docx
- 文档编号:3984562
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:408.41KB
实验二 绘图及简单科学计算.docx
《实验二 绘图及简单科学计算.docx》由会员分享,可在线阅读,更多相关《实验二 绘图及简单科学计算.docx(13页珍藏版)》请在冰豆网上搜索。
实验二绘图及简单科学计算
实验二绘图及简单科学计算
主要内容:
1)绘图简介
2)科学计算,曲线拟合与插值
绘图简介
MATLAB不但擅长于矩阵相关的数值运算,也适合用于各种科学可视化(Scientificvisualization)。
下面介绍MATLAB基本二维和三维的各项绘图命令,包含一维曲线及二维曲面的绘制、打印及保存。
一、二维绘图:
●plot是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y坐标。
下例可画出一条正弦曲线:
»x=linspace(0,2*pi,100);%100个点的x坐标
»y=sin(x);%对应的y坐标
»plot(x,y);
●若要画出多条曲线,只需将坐标对依次放入plot函数即可:
»plot(x,sin(x),x,cos(x));
●若要改变颜色,在坐标对后面加上相关字符串即可:
»plot(x,sin(x),'c',x,cos(x),'g');
●若要同时改变颜色及线型(Linestyle),也是在坐标对后面加上相关字符串即可:
»plot(x,sin(x),'co',x,cos(x),'g*');
plot绘图函数的参数
字符
颜色
字符
图线型态
黄色
.
点
k
黑色
o
圆
w
白色
x
x
b
蓝色
+
+
g
绿色
*
*
r
红色
-
实线
c
亮青色
:
点线
m
锰紫色
-.
点虚线
--
虚线
●图形完成后,我们可用axis([xmin,xmax,ymin,ymax])函数来调整坐标轴的范围:
»axis([0,6,-1.2,1.2]);
●MATLAB也可对图形加上各种注解与处理:
»xlabel('InputValue');%x轴注解
»ylabel('FunctionValue');%y轴注解
»title('TwoTrigonometricFunctions');%图形标题
»legend('y=sin(x)','y=cos(x)');%图形注解
»gridon;%显示格线
●用subplot来同时画出数个小图形于同一个窗口之中:
»subplot(2,2,1);plot(x,sin(x));%把窗口分成2*2个子窗口,在第一个子窗口绘图
»subplot(2,2,2);plot(x,cos(x));%在第二个子窗口绘图
»subplot(2,2,3);plot(x,sinh(x));%在第三个子窗口绘图
»subplot(2,2,4);plot(x,cosh(x));%在第四个子窗口绘图
●MATLAB还有其他各种二维绘图函数,以适合不同的应用,详见下表。
Bar
长条图
Errorbar
图形加上误差范围
Fplot
较精确的函数图形
Polar
极坐标图
Hist
累计图
Rose
极坐标累计图
Stairs
阶梯图
以下我们针对每个函数举例。
●当数据点数量不多时,条形图是很适合的表示方式:
»closeall;%关闭所有的图形窗口
»x=1:
10;
»y=rand(size(x));
»bar(x,y);
●如果已知数据的误差量,就可用errorbar来表示。
下例以单位标准差来做数据的误差量:
»x=linspace(0,2*pi,30);
»y=sin(x);
»e=std(y)*ones(size(x));
»errorbar(x,y,e)
●对于变化剧烈的函数,可用fplot来进行较精确的绘图,会对剧烈变化处进行较密集的取样,如下例:
»fplot('sin(1/x)',[0.020.2]);%[0.020.2]是绘图范围
●若要产生极坐标图形,可用polar:
»theta=linspace(0,2*pi);
»r=cos(4*theta);
»polar(theta,r);
●对于大量的数据,我们可用hist来显示数据的分布情况和统计特性。
下面几个命令可用来验证randn产生的高斯随随机数分布:
»x=randn(5000,1);%产生5000个m=0,s=1的高斯随机数
»hist(x,20);%20代表长条的个数
●rose和hist很接近,只不过是将数据大小视为角度,数据个数视为距离,并用极坐标绘制表示:
»x=randn(1000,1);
»rose(x);
●stairs可画出阶梯图:
»x=linspace(0,10,50);
»y=sin(x).*exp(-x/3);
»stairs(x,y);
1、y=[1234;3456;2358];plot(y)
2、x=[2345];y=[1234;3456;2358];plot(x,y)
3、练习:
还有其他可能情况,请同学们实验
4、holdonholdoff介绍
5、练习:
利用已学知识绘制分段函数图像;
6、图轴控制:
(1)画出两个刻度不同的y轴
x=linspace(0,2*pi);y1=sin(x);y2=exp(-x);
plotyy(x,y1,x,y2)
(2)axis([xmin,xmax,ymin,ymax])
(3)plot(x,y1,'--',x,y2,':
o')
xlabel('x轴');ylabel('y轴')
title('sin(x)与e^{-x}比较')
legend('sin(x)','e^{-x}')%多条曲线的说明
gtext('交点')
gridon
(3)改变标刻点:
x=0:
0.1:
4*pi;
plot(x,sin(x)+sin(3*x))
set(gca,'ytick',[-1,-0.3,0.1,1])
set(gca,'yticklabel'{'极小','临界值','崩溃值','极大'})
gridon
11、fplot,ezplot介绍
fplot('sin(2*x)+cos(x)',[-10,10])
ezplot('x^2+1')
12、介绍
whos,clearall,clc,clf
二、三维图形
在科学可视化(Scientificvisualization)中,三维空间的立体图是一个非常重要的技巧。
下面介绍MATLAB基本三维空间的各项绘图命令。
●mesh和plot是空间立体绘图的基本命令,mesh可画出立体网状图,surf则可画出立体曲面图,两者产生的图形都会依高度而有不同颜色,surf和mesh的用法类似。
●x=linspace(-2,2,25);
y=linspace(-2,2,25);
[X,Y]=meshgrid(x,y);%形成25阶的矩阵
Z=X.*exp(-X.^2-Y.^2);
mesh(X,Y,Z)%绘制立体网状图
surf(X,Y,Z)%绘制立体曲面图
●meshc同时画出网状图与等高线:
[x,y,z]=peaks;
meshc(x,y,z);
axis([-infinf-infinf-infinf]);
●surfc同时画出曲面图与等高线,带等高线的贴面图:
(1)[x,y,z]=peaks;
surfc(x,y,z);
axis([-infinf-infinf-infinf]);
(2)clf;
x=-8:
0.5:
8;
y=x;
[X,Y]=meshgrid(x,y);%用来产生三维绘图时的阵列(网格)
Z=4*X.^2-2*Y.^2;
surfc(X,Y,Z)
●contour3画出曲面在三维空间中的等高线:
contour3(peaks,20);
axis([-infinf-infinf-infinf]);
●contour画出曲面等高线在XY平面的投影:
c=contour(peaks,6)
clabel(c)%给c阵所表示的等高线加注高度标识
clabel(c,'manual')%对鼠标击中的等高线加注高度标识
注:
由contourc所给出的等高线坐标阵c是一个行数为2的矩阵,它的排列方式是每一条由该矩阵的一个全行子阵表示,子阵的第一行第一列是等高线的高度值,子阵的第二行第一列是画该等高线的数据点数,子阵的其余列中的每一列都是一个数据点。
●plot3可画出三维空间中的曲线,也可同时画出两条三维空间中的曲线
t=linspace(0,20*pi,501);
plot3(t.*sin(t),t.*cos(t),t);
t=linspace(0,10*pi,501);
plot3(t.*sin(t),t.*cos(t),t,t.*sin(t),t.*cos(t),-t);
(或者plot3(t.*sin(t),t.*cos(t),t,'b-',t.*sin(t),t.*cos(t),-t,'gd');)
关于1994年逢山开路赛题图示说明
数组建立字符串
string='数学建模培训'
strin=['e';'e']同一类型
异质数组:
其作用是可以储存不同的数据
s={'e',3,[3555667]}
建立内容显示celldisp(s)
取用:
s{2}
科学计算
多项式理论:
多项式的表达:
p=[0.69552,0.436,0.668,1.35]利用行向量表示降幂
多项式的显示poly2str(p,'x')
roots求多项式的根roots(p)
poly:
利用多项式的根,求出多项式的系数行向量,只需乘以原多项式最高次数项的系数pp=poly(ans),p=0.69552*pp
fzero;找出函数值为零点,区间或起始点。
fzero('x^2+2*x',2)
fzero('x^2+2*x',[-3,-1])
Fminbnd;找出某区间的最小值
fminbnd('x^2-2*x-1+1/(x-0.8)^2',-2,0.5)
多项式的加减法:
f(x)=1.35+0.668x+0.436x^2+0.69552x^3
f(x)=2.3+0.453x+2.342x^3
p1=[0.69552,0.436,0.668,1.35]
p2=[2.342,0,0.45,2.3]p1+p2%缺位补零
多项式的乘法conv(p1,p2)
多项式的除法;
f(x)=1.35+0.668x+0.436x^2+0.69552x^3
f(x)=1.23+0.645x+0.876x^2
p1=[0.69552,0.436,0.668,1.35]
p2=[0.876,0.645,1.23]
[a,b]=deconv(p1,p2)%无需补零
多项式的导数polyder(p1)
分式导数
p1=[0.69552,0.436,0.668,1.35]
p2=[0.876,0.645,1.23]
polyder(p1,p2)[a,b]=polyder(p1,p2)
p1*p2乘积的导数polyder(p1,p2)
多项式值的计算polyval(p1,1.35)
多点值的求法:
a=[3456];polyval(p1,a)
曲线拟合与插值
一、插值:
1.一维线性插值
插值定义为对数据点之间函数的估值方法,这些数据点是由某些集合给定。
当人们不能很快地求出所需中间点的函数值时,插值是一个有价值的工具。
最简单插值的例子是MATLAB的作图。
按缺省,MATLAB用直线连接所用的数据点以作图。
这个线性插值猜测中间值落在数据点之间的直线上。
当然,当数据点个数的增加和它们之间距离的减小时,线性插值就更精确。
MATLAB线性插值的直线可用函数interp1。
yi=interp1(x,y,xi,'methed'),这里x是独立变量(横坐标),y是因变量(纵坐标),xi是进行插值的一个数值数组,yi是对应的函数值
method有以下几个参数:
nearest:
最近插值
linear:
线性插值
spline:
三次样条插值
cubic:
三次插值
method的默认值为线性插值
需要注意的是,对于上述的所有插值调用格式,人们不能要求有x变量范围以外的结果,而且要求向量x为单调,当x单调且等间距时为佳。
例1.x=linspace(0,2*pi,10);
y=[5,7,8,10,13,14,15,17,19,20];
x1=[1.22.13];
y1=interp1(x,y,x1)
2.Lagrang插值公式:
functions=lagrange(x,y,x0)
%lagrange插值,x与y为已知的插值节点及其函数值,x0为需要求的插值点的x值。
nx=length(x);
m=length(x0);
fori=1:
m
t=0.0;
forj=1:
nx
u=1.0;
fork=1:
nx
ifk~=j
u=u*(x0(i)-x(k))/(x(j)-x(k));
end
end
t=t+u*y(j);
end
s(m)=t;
end
return见lagrange.m
例2:
对y=1/(1+x^2),-5<=x<=5,用n=11个节点(等分)作上述三种插值,用m=21个插值点(等分)作图比较结果;
x=linspace(-5,5,21);
y=1./(1+x.^2);
x0=linspace(-5,5,11);
y0=1./(1+x0.^2);
y1=lagrange(x0,y0,x);
y2=interp1(x0,y0,x);
y3=interp1(x0,y0,x,'spline');
[x',y',y1',y2',y3'];
plot(x,y,'k:
',x,y1,x,y2,x,y3)
legend('true','lagrange','piece-liner','spline')
gtext('lagr'),gtext('piece_liner'),
gtext('spline'),gtext('y=1/(x+x^2)')见contrast.m
3.二维栅格点内插法:
二维插值是基于与一维插值同样的基本思想。
然而,正如名字所隐含的,二维插值是对两变量的函数z=f(x,y)进行插值。
二维插值更为复杂,只是因为有更多的量要保持跟踪。
interp2(x,y,z,xi,yi,method),这里x和y是两个独立变量,z是一个应变量矩阵。
可选的参数method可以是:
邻近点内插法(nearest)
二维线性内插法(bilinear)
二维样条内插法(spline)
二维三次内插法(bicubic)
[x,y]=meshgrid(-3:
1:
3);
z=peaks(x,y);
[xi,yi]=meshgrid(-3:
0.25:
3);
zi1=interp2(x,y,z,xi,yi,'nearest');
zi2=interp2(x,y,z,xi,yi,'bilinear');
zi3=interp2(x,y,z,xi,yi,'bicubic');
subplot(2,2,1);surf(x,y,z);axistight;title('original');
%先在三维坐标画出原始数据,看一下该数据的粗糙程度
subplot(2,2,2);surf(xi,yi,zi1);axistight;title('nearest');
subplot(2,2,3);surf(xi,yi,zi2);axistight;title('bilinear');
subplot(2,2,4);surf(xi,yi,zi3);axistight;title('bicubic');
见shj.m
绘制等高线(观察光滑度)
[x,y]=meshgrid(-3:
1:
3);
z=peaks(x,y);
[xi,yi]=meshgrid(-3:
0.25:
3);
zi1=interp2(x,y,x,xi,yi,'nearest');
zi2=interp2(x,y,z,xi,yi,'bilinear');
zi3=interp2(x,y,z,xi,yi,'bicubic');
subplot(2,2,1);contour(x,y,z,20);title('original');
subplot(2,2,2);contour(xi,yi,zi1,20);title('nearest');
subplot(2,2,3);contour(xi,yi,zi2,20);title('bilinear');
subplot(2,2,4);contour(xi,yi,zi3,20);title('bicubic');
4.二位散布点内插法
如果采样数据并非分布在栅格点上,我们利用zi=griddata(x,y,z,xi,yi)
x=6*rand(100,1)-3;
y=6*rand(100,1)-3;
z=peaks(x,y);
[xi,yi]=meshgrid(-3:
0.2:
3,-3:
0.2:
3);%用来产生三维绘图时的阵列(网格)
zi=griddata(x,y,z,xi,yi);
mesh(xi,yi,zi);
holdon
plot3(x,y,z,'o');holdoff
axistight;%紧缩形式
axisequal; %具有相等的刻度比例
见dian.m
view
(2)表示正上方俯视图形
每一圆球代表采样点(共100)而曲面则是使用griddata命令的内插结果,
griddata命令只进行内插,而不能外插,因此所产生曲面数据只定义在采样点所形成的最小凸多边形内
二、数据拟合
曲线拟合涉及回答两个基本问题:
最佳拟合意味着什么?
应该用什么样的曲线?
可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。
当最佳拟合被解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。
数学上,称为多项式的最小二乘曲线拟合。
对各数据点距离求平方,并把平方距离全加起来,就是误差平方和。
这条虚线是使误差平方和尽可能小的曲线,即是最佳拟合。
最小二乘这个术语仅仅是使误差平方和最小的省略说法。
在MATLAB中,函数polyfit求解最小二乘曲线拟合问题。
为了用polyfit,我们必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。
如果我们选择n=1作为阶次,得到最简单的线性近似。
通常称为线性回归。
相反,如果我们选择n=2作为阶次,得到一个2阶多项式。
现在,我们选择一个2阶多项式。
(1)loadcensus.mat
plot(cdate,pop,'o')
xlabel('年份')
ylabel('人口(单位:
百万)')
p3=polyfit(cdate,pop,2)%polyfit的输出是一个多项式系数的行向量。
其解是y=….
poly2str(p3,'x')
polyval(p3,2002)%为了计算在xi数据点的多项式值,调用MATLAB的函数polyval。
(2)loadcensus.mat
time=min(cdate):
(max(cdate)+30);
curve=zeros(2,length(time));
fori=1:
2
curve(i,:
)=polyval(polyfit(cdate,pop,i),time);
end
plot(cdate,pop,'o',time,curve)
%为了将曲线拟合解与数据点比较,让我们把二者都绘成图。
legend('sampledata','order=1','order=2')
(3)loadcensus.mat
time=min(cdate):
(max(cdate)+30);
curve=zeros(9,length(time));
fori=1:
9
curve(i,:
)=polyval(polyfit(cdate,pop,i),time);
end
plot(cdate,pop,'o',time,curve)
legend('sampledata','order=1','order=2','order=3','order=4','order=5','order=6','order=7','order=8','order=9')
多项式阶次的选择是有点任意的。
两点决定一直线或一阶多项式。
三点决定一个平方或2阶多项式。
按此进行,n+1数据点唯一地确定n阶多项式。
于是,在上面的情况下,有21个数据点,我们可选一个高达20阶的多项式。
然而,高阶多项式给出很差的数值特性,因此不应选择比所需的阶次高的多项式。
此外,随着多项式阶次的提高,近似变得不够光滑,因为较高阶次多项式在变零前,可多次求导。
显然,‘越多就越好’的观念在这里不适用。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验二 绘图及简单科学计算 实验 绘图 简单 科学 计算