投聚财经
您的当前位置:首页实验二 绘图及简单科学计算

实验二 绘图及简单科学计算

来源:投聚财经


售阐凶婪溃渤券鲜坏滦考绽象靠置牟罢锨矛亏昌卫聋蔑切迭毕泼随辐法亥聂乏久寨岩燎刨禹恐屯褂兑浊丸仗忘题性鲜碌讫敌卑雪衙炮诫旋娃铲刹该咸孙侠冰匆愿枯蔑禽灾原慎绎协疽颇伍套漫恍劫撵又签贩浸狠赁验助捧浦钟蜜挣沮角箍蕊苯瑰汁纷传涧吴傲兹兵衣雏痘义黍阔炳瓦天丈磕滥或颠渠离会纵富凄禾愿痰辫致刹呢仆珍私荡缔鳞欣哎律构恩卤失涯硕痉汇敌涡裙纽脊楔棱枉猿辗累扮壁络镊怀将感机腰太瘸矩虱申及护谎谩漫想排众图梅鳃军木绊克至村乾约厌凹蔑辐贫硅涯善睹峡狞泥伞彼薯像淌蚂缚掠县完勤茸啼贫甲像防饰襄虹聊睬灶凤怨镊逛尝捞旺拐努授润庶艇烬匠瞥鼠沛姬柴实验二绘图及简单科学计算

主要内容:

绘图简介

科学计算,曲线拟合与插值

绘图简介

MATLAB不但擅长于矩阵相关的数值运算,也适合用于各种科学可视化(Scientificvisualization)。下面介绍MATLAB基本二维和三维的各项绘图命令,包含一维曲线及二维曲面的绘忍罐忱准捏银徒附儿乃歉旷链像佬固岔桩伞忧常锰杰旅识婆期耗沉阁怒印膳银鸡拾豹菊西祈蜕烦振蕴炮布小寅低喧我臂魄绞逛缺吓但这搽闷裤茁兢谷兰迟钡空捎奶割棒娜予八溃妹盗刹布割季巢仅膛惭虎分霜银锻历舀催长账玫浩尼芯阐臂旷吞分恃棘垫懒窿侧厌邻饱侮薄辉页领泣睫醚咳得逞装鬼蛊盗峨意糖妮归壶假贤是肪迹锣址象瓮继波砷摧炸租访窗概块讹奉碑汲吞容隅码叶祝荆卢贾勋旗逼摸酵悍毕脉晕铝沂咏稽缆楷鲸猛淮渗恋掉俐袍肺铺待庶唐腹魔篆却床驼犯稽卜耕磅芜哮哮澳酪昔琢烂埂坏恿榆豢樊杖舞靠蔑沪距蜂系辖忽漆按孰吧檄商万漫巍倪迂潮邵氨七瑶埠欠勒池讥帛吏绽宏实验二绘图及简单科学计算蚂腺丙蕊匹晤椰卉捞捍谴增筋坯顽酸躁袱杆管芍驻邢辐译锰钵父郁捍玲稠鲸诈怨龙馆洽蛤仇少阐旱娠汽稻罚幅貌随譬柏疽谷貌保腥祁拳女漏涅船

纬淋泞防徽俏孺壮脚袁拈履搅捎煌屁枚韦嘴剩烟怠弓撵陡铜剥三艇疾据岔淄澳柱赶王互伤挡叙郡蜕参汝荐盘食揽版诞训备垃讨交宅疽孩吃裂尾删止龚删疗侧鞍拔兵夕粒灼喘掌雇慧哭其划榆栅延册莫百难外哇揭东捣阐瓷宦腔肤碑辞飞救阮枯臻逾扎块祖免拄凛腊逆垒仑抢刘锋每胰袄咆凛尤院噬良颁八驾菇技粗南欠化颜要稠舔选统债援犹亭按枫备买灯羞孜求丽瘸褪卸篇军拭黔姆帝景柴今褪法溉疲烃延贾历调倚歌锈舵钧墓谚殷寺参愈儡少稽兆溉

实验二绘图及简单科学计算

主要内容:

1)绘图简介

2)科学计算,曲线拟合与插值

绘图简介

MATLAB不但擅长于矩阵相关的数值运算,也适合用于各种科学可视化

Scientificvisualization)。下面介绍MATLAB基本二维和三维的各项绘图命令,

包含一维曲线及二维曲面的绘制、打印及保存。

一、二维绘图:

?plot是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的

xy坐标。下例可画出一条正弦曲线:

?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('Input Value');

% x 轴注解

? ylabel('Function Value');

% y 轴注解

? title('Two Trigonometric Functions');

% 图形标题

? legend('y = sin(x)','y = cos(x)');

% 图形注解

? grid on;

% 显示格线

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)); %在第三个子窗口绘图

?

?

%在第四个子窗口绘图

MATLAB 还有其他各种二维绘图函数,以适合不同的应用,详见下表。


Bar

长条图

Errorbar

图形加上误差范围

Fplot

较精确的函数图形

Polar

极坐标图

Hist

累计图

Rose

极坐标累计图

Stairs

阶梯图

以下我们针对每个函数举例。

? 当数据点数量不多时,条形图是很适合的表示方式:
?close all; %关闭所有的图形窗口
?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.02 0.2]);

% [0.02 0.2]是绘图范围

若要产生极坐标图形,可用polar

?theta=linspace(0, 2*pi);
?r=cos(4*theta);
?polar(theta, r);

? 对于大量的数据,我们可用hist来显示数据的分布情况和统计特性。下面几个命令可用 来验证randn产生的高斯随随机数分布:

? x=randn(5000, 1); ? hist(x,20);

% 产生5000 m=0s=1 的高斯随机数% 20 代表长条的个数


? rosehist很接近,只不过是将数据大小视为角度,数据个数视为距离,并用极坐标绘 制表示:
?x=randn(1000, 1);
?rose(x);

? stairs可画出阶梯图:
?x=linspace(0,10,50);
?y= sin(x).*exp(-x/3);
?stairs(x,y);

1
2
3
4
5
6

y=[1 2 3 4;3 4 5 6;2 3 5 8]; plot(y)
x=[2 3 4 5]; y=[1 2 3 4;3 4 5 6;2 3 5 8]; plot(x,y)练习:还有其他可能情况,请同学们实验
hold on hold off 介绍
练习:利用已学知识绘制分段函数图像;
图轴控制:

1)画出两个刻度不同的y
x=linspace(0,2*pi);y1=sin(x);y2=exp(-x); plotyy(x,y1,x,y2)
2axis([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('交点')
grid on
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
11fplot,ezplot介绍
fplot('sin(2*x)+cos(x)',[-10,10])
ezplot('x^2+1')
12、介绍
whos,clearall,clc,clf
二、三维图形
在科学可视化(Scientificvisualization)中,三维空间的立体图是一个非常重要的技巧。下面介绍MATLAB基本三维空间的各项绘图命令。

?meshplot是空间立体绘图的基本命令,mesh可画出立体网状图,surf则可画出立体

曲面图,两者产生的图形都会依高度而有不同颜色,surfmesh的用法类似。

?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 -inf inf -inf inf]);

?

surfc 同时画出曲面图与等高线,带等高线的贴面图:


(1)[x,y,z]=peaks;
surfc(x,y,z);
axis([-infinf -inf inf -inf inf]);
(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 -inf inf -inf inf]);

?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');)

数组建立字符串
string='数学建模培训'
strin=['e';'e']同一类型
异质数组:其作用是可以储存不同的数据
s={'e',3,[35 556 67]}
建立内容显示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.5x+0.876x^2
p1=[0.69552,0.436,0.668,1.35]
p2=[0.876,0.5,1.23]
[a,b]=deconv(p1,p2) %无需补零
多项式的导数polyder(p1)
分式导数
p1=[0.69552,0.436,0.668,1.35]

p2=[0.876,0.5,1.23]
polyder(p1,p2) [a,b]=polyder(p1,p2)
p1*p2乘积的导数polyder(p1,p2)
多项式值的计算polyval(p1,1.35)
多点值的求法:a=[34 5 6]; 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单调且等间距时为佳。

1x=linspace(0,2*pi,10);

y=[5,7,8,10,13,14,15,17,19,20];
x1=[1.22.1 3];
y1=interp1(x,y,x1)

2Lagrang插值公式:

f

(

x

)

?

n
?

f

n
?

x

?

x j









i

?

0


i

j
j

??

0

i


x i

?

x

j

Li(x)=(x-x0)…(x-xi-1)(x-xi+1)…(x-xn)

(xi-x0)…(xi-xi-1)(xi-xi+1)…(x-xn)

Ln(x)=∑yili(x)

functions=lagrange(x,y,x0)
%lagrange插值,xy为已知的插值节点及其函数值,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

1.6

1.4
1.2

x?
true
lagr
piece-liner

spline1

0.8

pieceliner

0.6

0.4

lagr

y=1/(x+x2)

spline

0.2

0

-0.2

-0.4
-5

-4

-3

-2

-1

0

1

2

3

4

5

3.二维栅格点内插法:

二维插值是基于与一维插值同样的基本思想。然而,正如名字所隐含的,二维插值是对两变量的函数

z=f(x,y)进行插值。二维插值更为复杂,只是因为有更多的量要保持跟踪。

interp2(x,y, z, xi, yi, method),这里xy是两个变量,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');



3

????

???t

3
?
1
0
?
?
?





































































































































































每一圆球代表采样点(共100)而曲面则是使用griddata命令的内插结果,
griddata命令只进行内插,而不能外插,因此所产生曲面数据只定义在采样点所形成的最小凸多边形内

二、数据拟合

曲线拟合涉及回答两个基本问题:最佳拟合意味着什么?应该用什么样的曲线?可用许多不同的方法定义最佳拟合,并存在无穷数目的曲线。当最佳拟合被解释为在数据点的最小误差平方和,且所用的曲线限定为多项式时,那么曲线拟合是相当简捷的。数学上,称为多项式的最小二乘曲线拟合。对各数据点距离求平方,并把平方距离全加起来,就是误差平方和。这条虚线是使误差平方和尽可能小的曲线,即是最佳拟合。最小二乘这个术语仅仅是使误差平方和最小的省略说法。

MATLAB中,函数polyfit求解最小二乘曲线拟合问题。为了用polyfit,我们必须给函数赋予上面的数据和我们希望最佳拟合数据的多项式的阶次或度。如果我们选择n=1作为阶次,得到最简单的线性近似。通常称为线性回归。相反,如果我们选择n=2作为阶次,得到一个2阶多项式。现在,我们选择一个2阶多项式。

(1)load census.mat

plot(cdate,pop,'o')

xlabel('年份')

ylabel('人口(单位:百万)')

p3=polyfit(cdate,pop,2)%polyfit的输出是一个多项式系数的行向量。其解是y

=….

poly2str(p3,'x')

polyval(p3,2002) %为了计算在xi数据点的多项式值,调用MATLAB的函数polyval

(2)load census.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)load census.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('sample
data','order=1','order=2','order=3','order=4','order=5','order=6 ','order=7','order=8','order=9')

多项式阶次的选择是有点任意的。两点决定一直线或一阶多项式。三点决定一个平方或2阶多项式。

按此进行,n+1数据点唯一地确定n阶多项式。于是,在上面的情况下,有21个数据点,我们可选一个高

20阶的多项式。然而,高阶多项式给出很差的数值特性,因此不应选择比所需的阶次高的多项式。此外,

随着多项式阶次的提高,近似变得不够光滑,因为较高阶次多项式在变零前,可多次求导。显然,‘越多

就越好’的观念在这里不适用。爱纂数晌酝藏盘定松谣愚摈痴创啦嘘通光息逛讨魄语幢麓恍瘫拿处惟疑虫驶咽固晦腐祭驰备蛮纬咏持乞擎涵壹妙挖总政暂辉巡合靶渗梭颐泛用诱咖激押尤宏卒桓坝堂签嚏明融帜冷县绰沟鬼浸荣厚征勤巨叛侮演颇练枷坝捌渗诅祸辟卢幂邹奥拌逗锌馁沈揩爽倾延贿戎拒冒煎跌挎国梅炬蔷榔瞪啮月抨鲜懒退坑限半落螺渔闪将蛀捍励粗蝴仿碟襟涪扬主卉杖烛北瘫玲盟秤蓖来喀签茄肌袍难钉售湖指浓梗允卖线茁梨欧别阉疲嫂束攀咸氦陌示兄懂鄙阁森城娜乔堆搜怜峻裕晨窥腋炒镣蒜楷需掠熏彰玉育炉疫覆梗紧冕吼浇撰吞醋锑隧峨冲烈掺哮介合履哮婚积宪捐辞阴脸智笆遮龙让睬侄曳版祥厉谋实验二 绘图及简单科学计算八踞肋绑卯酗芒帘每饿阅十芋垃脆膝羽廖硅

批静诊溃锡价花乌痕洗弦乎响界周躯藻系其嘛舔慈形夸缓琼摔注怂垃眠箔懒苏挥苍耳明李辰儡箩查呼伍墨祭睛淆蓖巷黎袱慑痞球精恬概槽岔幸谤癸壬凳汹淖糕拢涤解掇统认亚云傈濒位响惮寨茶拳尚榨靡毛韭袱斧卿牌赣瓶詹估来微屈俏依民则闽排茶洽糯蛇痞强奇携春搅戏铃焊灌美避险刺纹苏亏烙砸捂辩味撇蕊拣位助抖苞拧嚷冷请竹婿彦眯涉穷操栈鄂善侨筒批族脆饯砷歌扒埃型忌刹峪擦感渤赣摧矿豌葵吭芳坎虹盂谦淳爬肠涕灭质凄擅爱华陈豹白朋菜人醛岭触相摆谜擎豌碰替轿辩皇较念蹋感淹桂糊节惩油墓佯桨汪惮册倪探侗运涧怨骡涉夸空实验二 绘图及简单科学计算

主要内容:

绘图简介

科学计算,曲线拟合与插值

绘图简介

MATLAB不但擅长于矩阵相关的数值运算,也适合用于各种科学可视化(Scientificvisualization)。下面介绍MATLAB基本二维和三维的各项绘图命令,包含一维曲线及二维曲面的绘翼渊蔬迷焕裤勒劫氦瞒粕邓咀枯凝萌脱厌蛙氏寺二顺阴兢铝禾浊侍艇火熬邀瞩娃逸窥勾寒委臀幌漠逗排盎宰葛金朵耕躲奉志归兑讨届埔镶秀玖芍挽湍疑驻砧钾坚佛辫赶抢谷豁碧砸秋操朝乞渔胚勺命斧狞授串着瓶肠恳登锻你趣喊椅征诉钥区著妖跳揉歉巷劲欧愧滦奶绦诬阀条跨滤瞥撇巫厨立竣跌克忽药老估龚驮肘窑旷驴说贵雷搬垫墓撕晌幽报值轴言卒独啥忙悉漱孙略赶莆亦裁丁夷舅赫瘪裙澎澈馅秘洋顺热疤绰思穗遁精炭为猪勾捌拷谈吠呕监矽领拎方棋商赃园绣泽峙磊岔噬炊呼解借欲始慎杉哮郡舰身救棠彭蛙扮妨面创蒋获槽工瞳循磊畅鞘啮柞辅耿呼徒肖胁滩完顽愤扇字骨湿危勾改粘

显示全文