我也来随便说说 我们学校的数学建模上机课也有Mathlab程序,看看下面有没有你要找的。
一 基本运算
1 求
输入(12+2(7-4))/3^2执行
2 输入x = (52+13-08)10^2/25执行
再输入y= 2x+1执行
3 执行clear命令。观察结果
4计算圆面积Area = ,半径r = 2,则可键入
r=2;area=pir^2; area
问:语句末尾加分号与不加分号有何区别?请试验之
5常用函数
名称 含义 名称 含义
sin 正弦 exp E为底的指数
cos 余弦 log 自然对数
tan 正切 log10 10为底的对数
cot 余切 log2 2为底的对数
asin 反正弦 abs 绝对值
acos 反余弦
例:1)执行y = sin(10)exp(-034^2)
2) 想计算 的值
输入y1=2sin(03pi)/(1+sqrt(5))执行之
若又想计算 ,可以简便地用 *** 作:先按á键则会出现上面输入过的指令 y1=2sin(03pi)/(1+sqrt(5)) ;然后移动光标,把y1改成y2;把 sin 改成 cos 便可。即得
y2=2cos(03pi)/(1+sqrt(5))然后执行之。
系统默认4位有效数字,若想提高精度则可如下:
digits(10);sym(y2,'d') 执行就可精确到小数点后10位,还可将10改为其它数字试验
二 矩阵运算
1要得到矩阵 ,
可输入A = [1,2,3; 4,5,6; 7,8,9] 执行,观察结果
还可分行输入
A=[1,2,3
4,5,6
7,8,9]
效果相同
2 注意 %号后的语句为注释,练习时不必输入
>>a=[1,4,6,8,10] %一维矩阵
>>a(3) % a的第三个元素
ans =
6
»x =[1 2 3 4 5 6 7 8
4 5 6 7 8 9 10 11]; %二维2x8 矩阵
执行后双击左边Workspace里的x,观察之
» x(3) % x的第三个元素
ans =
2
» x([1 2 5]) % x的第一、二、五个元素
ans =
1 4 3
如需要还可定义b=x([1 2 5])执行后结果为
b =
1 4 3
>> x(2,3) % x的第二行第三列的元素
ans =
6
x(1:5) % x的第前五个元素
ans =
1 4 2 5 3
» x(10:end) % x的第十个元素后的元素
ans =
8 6 9 7 10 8 11
执行后双击左边Workspace里的x,观察是哪十个元素
» x(10:-1:2) % x的第十个元素和第二个元素的倒排
ans =
8 5 7 4 6 3 5 2 4
» x(find(x>5)) % x中大于5的元素
ans =
6 7 8 6 9 7 10 8 11
» x(4)=100 %给x的第四个元素重新给值
x =
1 2 3 4 5 6 7 8
4 100 6 7 8 9 10 11
» x(3)=[] % 删除第三个元素(不是二维数组)
x =
Columns 1 through 12
1 4 100 3 6 4 7 5 8 6 9 7
Columns 13 through 15
10 8 11
» x(16)=1 % 加入第十六个元素
x =
Columns 1 through 12
1 4 100 3 6 4 7 5 8 6 9 7
Columns 13 through 16
10 8 11 1
3 如不需要以前的变量时,为不干扰以后计算,可执行clear清除以前的变量
当元素很多的时候,则须采用以下的方式:
» x=(1:2:121); % 以起始值为1,增量值为2,终止值为121的矩阵
» x=linspace(0,1,100); % 利用linspace,生成以0为起始值,1为终止值,元素数目为100的矩阵
»a=[] %空矩阵
a =
[]
» zeros(2,2) %全为0的矩阵
ans =
0 0
0 0
» ones(3,3) %全为1的矩阵
ans =
1 1 1
1 1 1
1 1 1
» rand(2,4); %随机矩阵
4另外一种定义矩阵的方式
»a=1:7; b=11:2:23;
»c=[b a]; %利用上面建立的阵列 a 及阵列 b ,组成新阵列c
»d=[b ; a]; %利用a及b,组成新矩阵d
执行后双击左边Workspace里的c与d,比较之
再如 已知y=[-1,6,15,7,31,2,4,5];
x=y(3:5) %x为y的第三到第五个元素组成的新向量
或 x=[y(5),y(3),y(7)] %x为y的第五、第三、第七个元素组成的新向量
或这样更简单 x=y([5,3,7])
5 输入矩阵x=[4,8,12,10,23;6,3,15,13,19;9,1,2,18,14;11,7,5,21,17]
依次输入下列命令并执行,观察结果,各命令分别有什么作用?
max(x)
min(x) (问:如何得到整个矩阵的最小值与最大值?)
[m,n]=size(x)
L=length(x)
y=x’
a=x( :,2)
b=x( :,2)’
c=x(3, :)
d=x(1 :3,3 :5)
y(2,3)=y(2,3)/2
y(2, :)=y(2, :)/2
y( :,4)=y( :,4)+y( :,2)
6 点运算 执行下列命令,指出点运算的作用
x=1 :8 (或对另外的向量或矩阵来作)
y=2^x
z=x/y
w=x^2
u=sin(x)
常用命令
min 最小值 max 最大值
mean 平均值 std 标准差
sort 排序 diff 相邻元素的差
length 个数 sum 总和
dot 内积 cross 外积
三 画图
二维图形
命 令 含 义 plot绘图函数的叁数
plot 建立向量或矩阵各队队向量的图形 字元 颜色 字元 图线型态
loglog x、y轴都取对数标度建立图形 y ** 点
semilogx x轴用于对数标度,y轴线性标度绘制图形 k 黑色 o 圆
semilogy y轴用于对数标度,x轴线性标度绘制图形 w 白色 x x
title 给图形加标题 b 蓝色 + +
xlabel 给x轴加标记 g 绿色
ylabel 给y轴加标记 r 红色 - 实线
text 在图形指定的位置上加文本字符串 c 亮青色 : 点线
gtext 在鼠标的位置上加文本字符串 m 锰紫色 - 点虚线
grid 打开网格线 -- 虚线
hold on 命令用于在已画好的图形上添加新的图形
1 x=0:0001:10; % 0到10的1000个点(每隔0001画一个点)的x座标
y=sin(x); % 对应的y座标
plot(x,y); % 绘图
注:matlab画图实际上就是描点连线,因此如果点取得不密,画出来就成了折线图,请试验之
2 Y=sin(10x);
plot(x,y,'r:',x,Y,'b') % 同时画两个函数
3 若要改变颜色,在座标对后面加上相关字串即可:
x=0:001:10;
plot(x,sin(x),'r')
4 若要同时改变颜色及图线型态(Line style),也是在坐标对后面加上相关字串即可:
plot(x,sin(x),'r')
5 用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围
axis([0,6,-15,1])
6 MATLAB也可对图形加上各种注解与处理:(见上表)
xlabel('x轴'); % x轴注解
ylabel('y轴'); % y轴注解
title('余弦函数'); % 图形标题
legend('y = cos(x)'); % 图形注解
gtext('y = cos(x)'); % 图形注解 ,用鼠标定位注解位置
grid on; % 显示格线
7画椭圆
a = [0:pi/50:2pi]'; %角度
X = cos(a)3; %参数方程
Y = sin(a)2;
plot(X,Y);
xlabel('x'), ylabel('y');
title('椭圆')
8 绘制函数 在0 ≤ x ≤ 1时的曲线。
x=0:01:1
y=xexp(-x) %为什么用点运算?若不用会怎样
plot(x,y),xlabel('x'),ylabel('y'),title('y=xexp(-x)')
9 画出衰减振荡曲线 与它的包络线 及 。t 的取值范围是[0, 4π] 。
t=0:pi/50:4pi;
y0=exp(-t/3);
y=exp(-t/3)sin(3t);
plot(t,y,'-r',t,y0,':b',t,-y0,':b') % -r表示红色实线,:b表示蓝色点线,看上表
grid
10 在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图,如
x=linspace(0,2pi,30); y=sin(x); z=cos(x);
u=2sin(x)cos(x); v=sin(x)/cos(x);
subplot(2,2,1),plot(x,y),axis([0 2pi -1 1]),title('sin(x)')
subplot(2,2,2),plot(x,z),axis([0 2pi -1 1]),title('cos(x)')
subplot(2,2,3),plot(x,u),axis([0 2pi -1 1]),title('2sin(x)cos(x)')
subplot(2,2,4),plot(x,v),axis([0 2pi -20 20]),title('sin(x)/cos(x)')
三维图形
11三维螺旋线:
t=0:pi/50:10pi;
plot3(sin(t),cos(t),t) %参数方程
grid %添加网格
12 t=linspace(0,20pi, 501);
plot3(tsin(t), tcos(t), t); %注意点乘
也可以同时画出两条曲线,格式与二维情况类似,兹不举例。
13用mesh命令画曲面
画出由函数 形成的立体网状图:
a=linspace(-2, 2, 25); % 在x轴上从(-2,2)取25点
b=linspace(-2, 2, 25); % 在y轴上取25点
[x,y]=meshgrid(a, b); % x和y都是21x21的矩阵
z=xexp(-x^2-y^2); % 计算函数值,z也是21x21的矩阵
mesh(x, y, z); % 画出立体网状图
14 surf和mesh的用法类似:
a=linspace(-2, 2, 25); % 在x轴上取25点
b=linspace(-2, 2, 25); % 在y轴上取25点
[x,y]=meshgrid(a, b); % x和y都是21x21的矩阵
z=xexp(-x^2-y^2); % 计算函数值,z也是21x21的矩阵
surf(x, y, z); % 画出立体曲面图
四 程序设计
1 M-文件: 上面所做的运算都是在命令窗口中输入一条或两三条命令,然后执行,再输入,再执行,以这样交谈式的方式进行。如果为了解决某一问题需要很多命令,这样做就很不方便了。这时我们把解决某一问题的所有命令集中放在一个文档里,命名、保存。然后只要在命令窗口中输入文档名,执行即可。
例:(1)编写文档:点击MATLAB指令窗口上面最左端的图标 ,即新建文件,就可打开MATLAB文件编辑器。用户即可在空白窗口中编写程序。例如输入下面的程序:
x=linspace(0,2pi,20);
y=sin(x);
plot(x,y,'r+')
title('2D plot')
(2)点击文件编辑器上面工具条中的保存 ,命名(例如将上面的程序命名为picture),然后保存。像这样在MATLAB文件编辑器中编写的文件叫M-文件(M-file)。
(3)运行:i)在命令窗口中输入文件名(如上面的picture),然后执行。
ii)或直接在文件编辑器上面的工具条中找到debug(即调试),点击,再找到run(即运行),再点击即可。
同学们可以把前面画图的一些问题放在文件编辑器里再做一下。
2 自己编写函数:我们经常用到的像sin、cos、exp这样的一些函数都是MATLAB软件自身所带的函数,因此直接应用即可,但有时我们为了解决一些问题需要自己编写函数。自己编写函数有两个基本要求i)必须在MATLAB文件编辑器中编写。ii)函数名和文件名必须相同。 例: 编写函数 , 计算f(1)f(2)+f2(3)
(1)打开MATLAB文件编辑器,输入
function Y= fun1(x) % 表示Y是x的函数,x是自变量,fun1是函数名
Y=(x^3 - 2x^2 + x - 63)/(x^2 + 005x - 314);
然后保存。
注:在自己编写的函数前都要写上function,表示这是自己定义的函数。fun1表示函数名,那么最后文件名也应命名为fun1。
(2)这样在命令窗口中就可以像应用sin、cos那样来使用函数fun1,如:在命令窗口中输入 >> fun1(1)fun1(2)+fun1(3)fun1(3) 结果为:
ans =
-126023
3 for循环语句(这里的for语句与C语言中的for语句不同,要更简单一些)
例:一个简单的for循环示例。
for i=1:10; % i依次取1,2,…10,
x(i)=2i; % 对每个i值,重复执行该指令
end; % 表示循环结束,每一个for要对应一个end
x % 要求显示运行后数组x的值。
输入后观察结果,体会for语句的作用。
注:在MATLAB里(在C语言中也一样), 的作用表示把等号右边的值送给左边的变量,这和数学中相等的意思不同。下面的例子中都要这样理解,否则就不能明白程序的含义。
4 while循环语句
例: Fibonacci 数列:1,1,2,3,5,8,… 即: ,( 1,2,3…)现要求该数列中第一个大于10000 的元素。
a(1)=1;a(2)=1;i=2;
while a(i)<=10000
a(i+1)=a(i-1)+a(i);
i=i+1;
end;
i,a(i),
5(1)if-end语句,例:
cost=10;number=12;
if number>8
sums=number095cost;
end,
sums
(2)if-else-end语句,例:
cost=10;number=5; % 改变number的初值,看结果有何不同
if number>8
sums=number095cost;
else sums=number05cost;
end,
sums
6 例:用for 循环语句来寻找Fibonacc 数列中第一个大于10000 的元素。
n=100;a=ones(1,n); % a是一个一行,n列的所有元素为1的矩阵
for i=3:n
a(i)=a(i-1)+a(i-2);
if a(i)>=10000
a(i),
break; % 表示跳出循环
end;
end, i
7 练习:课本264页,参考例4右边的流程图114,编程序求解例4,自己设置误差,并与书上的结果比较。
五 拟合与插值
曲 线 拟 合 和 插 值 函 数
polyfit(x, y, n) 对描述n阶多项式y=f(x)的数据进行最小二乘曲线拟合
interp1(x, y, xo) 1维线性插值
interp1(x, y, xo, ' spline ') 1维3次样条插值
interp1(x, y, xo, ' cubic ') 1维3次插值
interp2(x, y, Z, xi, yi) 2维线性插值
interp2(x, y, Z, xi, yi, ' cubic') 2维3次插值
1 插值
看课本266页§112第一段,了解什么是插值。
例:考虑下列问题,12小时内,一小时测量一次室外温度。数据如下:
时间:1,2,3, 4, 5, 6, 7, 8, 9,10,11,12
温度:5,8,9,15,25,29,31,30,22,25,27,24
现在根据以上数据估计32,47等时刻的温度
hours=1:12;
temps=[5 8 9 15 25 29 31 30 22 25 27 24];
t=interp1(hours, temps, [32,47]) % 一阶线性插值,如果只估计一个点的值,则无须加方括号
改为t=interp1(hours, temps, [32,47], 'spline') 则为三次样条插值
如果输入如下程序,则画出插值曲线
hours=1:12;
temps=[5 8 9 15 25 29 31 30 22 25 27 24];
h=1:01:12;
t=interp1(hours, temps, h) ; % h后加上'spline'则为三次样条插值
plot(hours, temps, ' + ' , h, t)
用一阶线性插值和三次样条插值做课本268页例2,与书上之结果比较,然后挑课后题做一两道。
2 拟合
看课本270页§113,曲线拟合,比较拟合与插值有什么区别。
例:两组数据如下:
x=[0 1 2 3 4 5 6 7 8 9 1];
y=[-447 1978 328 616 708 734 766 956 948 930 112];
n=8;
p1=polyfit(x,y,n); % n表示用n阶多项式拟合,n=1为线性拟合,即通常所说最小二乘法
poly2sym(p1) % 前面的拟合命令只给出多项式的系数,用此命令则将结果转化为真正的多项式。或用 vpa(poly2sym(p1),10) 即取数值形式,取10位有效数字
x1=0:01:1; % 由此以后三句是画出拟合曲线的图像
y1=polyval(p1,x1); %此句是在x1这些点处求出多项式的值,送给y1
plot(x,y,'o',x1,y1)
改变n的数字,即用不同的多项式拟合,看看哪个结果好。
当n=10时,数据点之间出现大的波动。当企图进行高阶曲线拟合时,这种波动现象经常发生,并不利于我们认识两组数据之间的规律,因此并不是阶数越高越好,实际问题当中,适当选一个即可。
用上面的指令做课本271页例1及例2,将结果与书上之结果比较。到这里去看看 wwwpic55cn
参考资料:
要查表,我手边没有表,而且已经学过很多年了,只随便说个数字,举例说明:先假定r=4%,查表计算出数值=900
再假定r=5%,查表计算出数值=1100
然后计算(1100-900)/(5%-4%)=(1000-900)/(r-4%)
200(r-4%)=1
r=45%
如果你第一次选取是数值是3%,计算出数值=800,第二次选取4%,计算=900,都低于1000,那么就要继续试5%,6%……直到计算结果一个小于1000,另一个大于1000,而且与1000越接近,差值法计算出r越准确,如果选项一个1%,一个20%,查表后得出数值,确实也能计算,但不会很准
你知道一个方程的根的大致范围[a,b],要求得更加确切的根。
1)你在[a,b] 之间找一个数 c。
2)如果你认为 数 c 已经足够作为方程的根了(一般是精度够了),那就找到了方程的根,退出。
3)否则,用找到的数字 c 分割区间 [a,b] , 于是有两个新的范围 [a,c],[c,b]。你进一步判断方程的根是在 [a,c] 还是在 [c,b]之中。
如果判断出方程的根是在 [a,c]之中,那么另 b=c ,得到新的寻找根的范围 [a,b] 回到 步骤1 。
如果判断出方程的根是在 [c,b]之中,那么另 a=c ,得到新的寻找根的范围 [a,b] 回到 步骤1。
上面两种情况,不论判断出方程的根是在新的范围 [a,c] 还是在 [c,b]之中,相比原来范围 [a,b] ,寻找方程根的范围都缩小了,也就更加容易找到方程的根了。这就是“极限“的思想。
具体是程序算法是这么实现的:
有函数f(x)。
任取两个数x1、x2,求得对应的函数值f(x1)、f(x2)。
如果两函数值f(x1)、f(x2)同号,则重新取数,直到这两个函数值异号为止。
因为 f(x1)、f(x2) 如果异号,那么函数f(x) 在 [x1,x2] 的范围内肯定和 x 轴相交,也就是
[x1,x2] 之间有方程的根。
1)连接(x1,f(x1))与(x2,f(x2)) 这两点形成的直线与x轴相交于一点x‘,求得对应的f(x’)。
2) 判断 x' 是否已经能作为方程 f(x) 的根了(精度足够了),如果是,退出。
3)否则判断 f(x') 与f(x1)、f(x2)中的哪个值同号。
如f(x‘)与f(x1)同号,则f(x’)为新的f(x1)。回到 步骤1。
如f(x‘)与f(x2)同号,则f(x’)为新的f(x2)。回到 步骤1。
程序的步骤 1,2,3 和上面的说明中的1,2,3是一一对应的。
计算机学习方法点滴谈
计算机是一门以实践为主的学科,这与我们从小到大接触到的许多纯理论学科,学习的方法是有很大差异的。所以,在学习的时候,方法必须有所突破,才能有好的学习效果。
一、预习
“预习”是学习中一个很重要的环节。但和其他学科中的“预习”不同的是,计算机学科中的预习不是说要把教材从头到尾地看上一遍,这里的“预习”是指:在学习之前,应该粗略地了解一下诸如课程内容是用来做什么的,用什么方式来实现等一些基本问题。举个例子来说,在学习FrontPage之前,应该了解这一软件是用来制作网页的,且方法较简单,很适合初学者使用。
二、“任务驱动”学习方法
“任务驱动”学习方法,就是指先有结果,再研究实施策略的学习方法。在任务驱动教学中,打破了常规教学方法中由浅入深的基本顺序,每一章节的知识点都是通过几个有代表性的案例来学习的,甚至包括认识菜单。让你先体会到效果,从而增加学习兴趣。用这种方法来学习计算机,尤其是一些视窗界面的应用程序,往往可以达到事半功倍的效果。
三、积极动手实践
计算机是一门 *** 作性很强的学科,计算机学科中的实践,不只是简单地模仿别人的练习。在实践中最难得的是有自己的想法,并尽力去寻求解决办法。在这种开动了脑筋的实践中,才会学到真正的东西。古时贤人哲士说:“学而时习之”、“学而不思则罔,思而不学则贻。”将所学的理论知识与具体实践相结合,这是一种较好的方法,一方面可以用理论指导实际,另一方面可以加深对所学知识的理解和记忆,激发起学习兴趣,边学习,边实践,相互作用,相互促进。
总之,想在任何事情上学有所成,都必须遵循一定的方法。尤其是计算机这样的工具学科,在知识的获取过程中会遇到不少的困难和挫折,然而“宝剑锋从磨砺出,梅花香自苦寒来”。若有正确的学习方法,再加上认真刻苦的学习精神,就一定能掌握好所学的知识。
如何学好计算机科学
ruhexuejisuanji
计算机科学与技术反思录
计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设计),但计算机专业的优势就在于,我们掌握许多其他专业并不“深究”的东西,例如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算机专业能够做出来的大型系统。今天我想专门谈一谈计算机科学,并将重点放在计算理论上。
计算机理论的一个核心问题——从数学谈起:
记得当年大一入学,每周六课时高等数学,天天作业不断(那时是六日工作制)。颇有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不见得有问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如网络安全,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学与技术的应当本着这个方向)。
其实我们计算机系学数学光学高等数学是不够的(典型的工科院校一般都开的是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数学分析),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程,这对我们培养良好的分析能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先生就曾经教导过我们,数学系的学生到软件企业中大多作软件设计与分析工作,而计算机系的学生做程序员的居多,原因就在于数学系的学生分析推理能力,从所受训练的角度上要远远在我们之上。当年出现的怪现象是:计算机系学生的高中数学基础在全校数一数二(希望没有冒犯其它系的同学),教学课时数也仅次于数学系,但学完之后的效果却不尽如人意。难道都是学生不努力吗,我看未见得,方向错了也说不一定,其中原因何在,发人深思。
我个人的浅见是:计算机系的学生,对数学的要求固然跟数学系不同,跟物理类差别则更大。通常非数学专业的所谓“高等数学”,无非是把数学分析中较困难的理论部分删去,强调套用公式计算而已。而对计算机系来说,数学分析里用处最大的恰恰是被删去的理论部分。说得难听一点,对计算机系学生而言,追求算来算去的所谓“工程数学”已经彻底地走进了误区。记上一堆曲面积分的公式,难道就能算懂了数学?那倒不如现用现查,何必费事记呢?再不然直接用Mathematics或是Matalab好了。
我在系里最爱做的事情就是给学弟学妹们推荐参考书。中文的数学分析书,一般都认为以北大张筑生老师的“数学分析新讲”为最好。万一你的数学实在太好,那就去看菲赫金哥尔茨的“微积分学教程”好了--但我认为没什么必要,毕竟你不想转到数学系去。吉米多维奇的“数学分析习题集”也基本上是计算型的东东。书的名气很大,倒不见得适合我们,还是那句话,重要的是数学思想的建立,生活在信息社会里我们求的是高效,计算这玩意还是留给计算机吧。不过现在多用的似乎是复旦大学的《数学分析》也是很好的教材。
中国的所谓高等代数,就等于线性代数加上一点多项式理论。我以为这有好的一面,因为可以让学生较早感觉到代数是一种结构,而非一堆矩阵翻来覆去。这里不得不提南京大学林成森,盛松柏两位老师编的“高等代数”,感觉相当舒服。此书相当全面地包含了关于多项式和线性代数的基本初等结果,同时还提供了一些有用的又比较深刻的内容,如Sturm序列,Shermon-Morrison公式,广义逆矩阵等等。可以说,作为本科生如能吃透此书,就可以算高手。国内较好的高等代数教材还有清华计算机系用的那本,清华出版社出版,书店里多多,一看就知道。从抽象代数的观点来看,高等代数里的结果不过是代数系统性质的一些例子而已。莫宗坚先生的《代数学》里,对此进行了深刻的讨论。然而莫先生的书实在深得很,作为本科生恐怕难以接受,不妨等到自己以后成熟了一些再读。
正如上面所论述的,计算机系的学生学习高等数学:知其然更要知其所以然。你学习的目的应该是:将抽象的理论再应用于实践,不但要掌握题目的解题方法,更要掌握解题思想,对于定理的学习:不是简单的应用,而是掌握证明过程即掌握定理的由来,训练自己的推理能力。只有这样才达到了学习这门科学的目的,同时也缩小了我们与数学系的同学之间思维上的差距。
概率论与数理统计这门课很重要,可惜大多数院校讲授这门课都会少些东西。少了的东西现在看至少有随机过程。到毕业还没有听说过Markov过程,此乃计算机系学生的耻辱。没有随机过程,你怎么分析网络和分布式系统?怎么设计随机化算法和协议?据说清华计算机系开有“随机数学”,早就是必修课。另外,离散概率论对计算机系学生来说有特殊的重要性。而我们国家工程数学讲的都是连续概率。现在,美国已经有些学校开设了单纯的“离散概率论”课程,干脆把连续概率删去,把离散概率讲深些。我们不一定要这么做,但应该更加强调离散概率是没有疑问的。这个工作我看还是尽早的做为好。
计算方法学(有些学校也称为数学分析学)是最后一门由数理学院给我们开的课。一般学生对这门课的重视程度有限,以为没什么用。不就是照套公式嘛!其实,做图形图像可离不开它,密码学搞深了也离不开它。而且,在很多科学工程中的应用计算,都以数值的为主。这门课有两个极端的讲法:一个是古典的“数值分析”,完全讲数学原理和算法;另一个是现在日趋流行的“科学与工程计算”,干脆教学生用软件包编程。我个人认为,计算机系的学生一定要认识清楚我们计算机系的学生为什么要学这门课,我是很偏向于学好理论后用计算机实现的,最好使用C语言或C++编程实现。向这个方向努力的书籍还是挺多的,这里推荐大家高等教育出版社(CHEP)和施普林格出版社(Springer)联合出版的《计算方法(Computational Methods)》,华中理工大学数学系写的(现华中科技大学),这方面华科大做的工作在国内应算是比较多的,而个人认为以这本最好,至少程序设计方面涉及了:任意数学函数的求值,方程求根,线性方程组求解,插值方法,数值积分,场微分方程数值求解。李庆扬的那本则理论性过强,与实际应用结合得不太紧。
这其实是个数独,考查的是人工智能知识,应该用图的深度优先遍历(DFS)外加heuristic search,递归实现,跟四染色类似。
void find(int arr[][], int i, int j){
if(i==3&&j==3){
report(arr);
return;
}
int in, jn;
jn = (j+1)%4;
if(j+1==4) in = i+1;
else in = i;
if(arr[i][j]!='') find(arr, in, jn); /递归调用/
else{
if(isLegal(arr, i, j, 1)==1){ arr[i][j] = 1 find(arr, in, jn); } /递归调用/
if(isLegal(arr, i, j, 2)==1){ arr[i][j] = 2 find(arr, in, jn); }
if(isLegal(arr, i, j, 3)==1){ arr[i][j] = 3 find(arr, in, jn); }
if(isLegal(arr, i, j, 4)==1){ arr[i][j] = 4 find(arr, in, jn); }
}
}
int isLegal(int arr[][], int i, int j, int val){
int m, n;
for(m = 0; m < 4; m++)
if(arr[m][j]==val) return 0;
for(n = 0; n < 4; n++)
if(arr[i][n]==val) return 0;
if(i!=0&&j!=0)
if(arr[i-1][j-1]==val||arr[i-1][j]==val||arr[i][j-1]==val) return 0;
if(i!=3&&j!=3)
if(arr[i+1][j]==val||arr[i+1][j+1]==val||arr[i][j+1]==val) return 0;
if(i!=0&&j!=3)
if(arr[i-1][j]==val||arr[i-1][j+1]==val||arr[i][j+1]==val) return 0;
if(i!=3&&j!=0)
if(arr[i+1][j]==val||arr[i+1][j-1]==val||arr[i][j-1]==val) return 0;
return 1;
}
void report(int arr[][]){
int i, j;
for(i=0;i<4;i++) for(j=0;j<4;j++) printf("%d\t", arr[i][j]);
}
1)数据数据的概念十分广泛,它通常是对客观事物的数量、特征、性质的描述。对计算机而言,数据是计算机所能处理的一切数值、字符、图形或其他特定符号的总称,是计算机加工处理的“原料”和它所生产的“产品”(计算的结果)。2)数据元素数据元素是数据的基本单位,也称作结点和记录。在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。3)数据对象数据对象是具有相同性质的数据元素的集合,是数据的子集。 1、 数据结构(Data Structure)
数据结构是指同一数据对象中个数据元素之间存在的关系(相互间存在一种或多种特定关系的数据元素的集合)。
根据数据结构的形式定义,数据结构是一个二元组:
S(Data-Structure)=(D,R)
其中:D是数据元素的有限集,R是D上关系的有限集。
逻辑结构与物理结构
数据之间的相互关系称为逻辑结构。通常分为三类基本结构:
(一)集合:结构中的数据元素除了同属于一种类型外,别无其它关系。
(二)线性结构:结构中的数据元素之间存在一对一的关系。
(三)非线性结构:
树型结构——结构中的数据元素之间存在一对多的关系。
图状结构或网状结构——结构中的数据元素之间存在多对多的关系。
数据结构在计算机中的表示称为数据的物理结构,又称为存储结构。
(一般我们将数据的逻辑结构称为是数据结构,)
存储结构可分为:顺序存储与链式存储。
顺序存储结构——借助元素在存储器中的相对位置来表示数据元素间的逻辑关系;
链式存储结构——借助指示元素存储地址的指针表示数据元素间的逻辑关系。
数据的逻辑结构与存储结构密切相关。
212 线性表
1)线性表定义
线性表(Linear List) :由n(n≧)个数据元素(结点)a1,a2, …an组成的有限序列。其中数据元素的个数n定义为表的长度。当n=0时称为空表,常常将非空的线性表(n>0)记作:
L = (a1,a2,…an)
这里的数据元素ai(1≦i≦n)只是一个抽象的符号,其具体含义在不同的情况下可以不同。
2)线性表特点
线性表的逻辑结构有以下特点:
在数据元素的非空有限集中
Ø 存在唯一的一个被称作“第一个”的数据元素
Ø 存在唯一的一个被称作“最后一个”的数据元素
Ø 除第一个外,集合中的每个数据元素均只有一个前驱
Ø 除最后一个外,集合中的每个数据元素均只有一个后继
3)线性表的基本运算
线性表的主要运算有:
插入:在两个确定元素之间插入一个新元素;
删除:删除线性表中的某个元素;
查找:按某种要求查找线性表中的一个元素,需要时还可以进行更新;
排序:按给定要求对表中元素重新排序;
还有初始化、求长度等。
在不同问题的线性表中,需要进行的运算也不相同,实际应用中还可能涉及建立线性表、修改表中元素数值(编辑)等运算,但是基本上可以由上述四种运算组成。
4)顺序存储线性表
(1)顺序存储结构
把线性表的数据元素,按顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表,也称为向量式存储结构。
假设线性表的每个元素需占用个存储单元,且线性表在内存中的首地址为,则线性表中第个数据元素的存储地址为:
则线性表中第个数据元素的存储位置和第个数据元素的存储位置之间满足下列关系:
这种存储结构只要知道数据元素序号,就很容易找到第个数据元素。它的主要特点有:一、各数据元素存储地址上相邻;二、无论序号为何值,找到第个元素的时间相同。
这种存储结构在高级语言中可以用一维数组的形式实现。
(2)顺序存储结构的优缺点
优点
Ø 逻辑相邻,物理相邻;
Ø 可随机存取任一元素;
Ø 存储空间使用紧凑。
缺点
Ø 插入、删除 *** 作需要移动大量的元素;
Ø 预先分配空间需按最大空间分配,利用不充分;
Ø 表容量难以扩充。
5)线性链表
特点:
Ø 用一组任意的存储单元存储线性表的数据元素;
Ø 利用指针实现了用不相邻的存储单元存放逻辑上相邻的元素;
Ø 每个数据元素,除存储本身信息外,还需存储其直接后继的信息。
数据元素由两部分组成:
Ø 数据域:存放元素本身信息;
Ø 指针域:指示直接后继的存储地址。
线性链表一般在第一个结点之前附加一个头结点:
213 栈与队
栈和队是两种特殊的线性表,它们的运算规则较一般线性表由更多的约束和限制,因此称作限定性数据结构。
1)栈的结构和运算
(1)栈的定义
栈(Stack)是限制在表的一端进行插入和删除运算的线性表,通常称插入、删除的这一端为栈顶(Top),另一端为栈底(Bottom)。当表中没有元素时称为空栈。
假设栈,则称为栈底元素,为栈顶元素。栈中元素按的次序进栈,的顺序退栈,退栈的第一个元素应为栈顶元素。换句话说,栈的修改是按后进先出的原则进行的。因此,栈称为后进先出表(LIFO,last in first out)。
栈的存储结构也有顺序与链式两种,称为顺序栈与链栈。
(2)顺序栈
由于栈是运算受限的线性表,因此线性表的存储结构对栈也适应。
栈的顺序存储结构简称为顺序栈,它是运算受限的线性表。因此,可用数组来实现顺序栈。因为栈底位置是固定不变的,所以可以将栈底位置设置在数组的两端的任何一个端点;栈顶位置是随着进栈和退栈 *** 作而变化的,故需用一个整型变量top来指示栈顶位置。如果用m来表示栈的最大容量,则top=0表示栈空,此时出栈,则下溢(underflow);top=m表示栈满,此时入栈,则上溢(overflow)。
(3)栈的应用
表达式求值
表达式求值步骤:首先在OS栈中放入表达式结束符“;”,
l 若为 *** 作数,将其压入NS栈;
l 若为运算符,比较当前OS栈的栈顶元素:
ü 若当前运算符的优先数大于OS栈顶的运算符,则将当前运算符压入OS栈;
ü 若当前运算符的优先数不大于OS栈顶运算符,则从NS栈中d出两个 *** 作数x,y,再从OS中d出一个运算符,,并将结果T送入NS栈。
ü 若当前运算符为“;”,且OS栈顶也为“;”,则表示表达式处理结束,此时,NS栈顶元素即为此表达式值。
过程嵌套和递归调用
过程嵌套调用如图所示:
当调用子过程时,必须把断点的信息及地址保存起来,当子过程执行完毕,返回时,取用这些信息,找到返回地址,从此断点继续执行。当程序中出现多重嵌套调用时,必须开辟一个栈,将各层断点信息依次入栈,当各层子过程返回时,又以相反的次序从栈顶取出。
递归调用
函数直接或间接地调用自身叫递归调用,这主要时用递归工作栈来实现的。下面举一个简单的例子来说明递归调用。
例 一段递归调用的C语言程序如下:
void print(int w)
{
int I;
if (w!=0)
{
print (w-1);
for (I=1; I<=w; ++I)
printf(“%3d,”,w);
printf(“/n”);
}
}
在这段程序中,递归调用的执行过程如图所示:
2) 队的结构和运算
(1)队的定义
队是限定只能在表的一端进行插入,在表的另一端进行删除的线性表。
队尾(rear)——允许插入的一端
队头(front)——允许删除的一端
队的特点是:先进先出(FIFO)
(2)顺序队
存在问题:
设数组维数为M,则:
当front=-1,rear=M-1时,再有元素入队发生溢出——真溢出
l当front¹-1,rear=M-1时,再有元素入队发生溢出——假溢出
解决方案:
l 队首固定,每次出队剩余元素向下移动——浪费时间
l 循环队列
Ø 基本思想:把队列设想成环形,让sq[0]接在sq[M-1]之后,若rear+1==M,则令rear=0;
Ø 实现:利用“模”运算
入队: rear=(rear+1)%M; sq[rear]=x;
出队: front=(front+1)%M; x=sq[front];
Ø 队满、队空判定条件
front=rear
解决方案:
n 另外设一个标志以区别队空、队满
n 少用一个元素空间:
队空:front==rear
队满:(rear+1)%M==front
214 数组
1)数组的定义
(1)定义
数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表。用线性表的一般表示形式定义二维数组为:
其中,K由个结点组成:
R由以下两种关系组成:
(2)数组特点
l 数组结构固定
l 数据元素同构
(3)数组运算
数组一旦被定义,它的维数和数据元素的个数就已经固定,不能插入和删除,所以数组运算只有:
l 给定一组下标,存取相应的数据元素
l 给定一组下标,修改数据元素的值
2)数组的顺序存储结构
由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。
又由于对数组一般不做插入和删除 *** 作,也就是说,数组一旦建立,结构中的元素个数和元素间的关系就不再发生变化。因此,一般都是采用顺序存储的方法来表示数组。
根据不同的存放形式,可以分为按行优先和按列优先顺序存放。
(1)按行优先顺序存放
按行优先顺序存放,对二维数组来说就是按行进行切分,如图所示:
假设每个数据元素只占一个单元地址,则元素的存放地址可以通过以下关系式计算:
(2)按列优先顺序存放
如果数组按列切分,就得到按列优先顺序存放方式。如图所示:
元素的存放地址可以通过以下关系式计算:
215 树与二叉树
1)树的定义及其存储结构
(1)树的定义和术语
定义:树(Tree)是n(n>=0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:
(1)有且仅有一个特定的称为根(Root)的结点;
(2)其余的结点可分为m(m>=0)个互不相交的子集T1,T2,T3…Tm,其中每个子集又是一棵树,并称其为子树(Subtree)。
基本术语:
l 结点(node)——表示树中的元素,包括数据项及若干指向其子树的分支;
l 结点的度(degree)——结点拥有的子树数;
l 叶子(leaf)——度为0的结点;
l 孩子(child)——结点子树的根称为该结点的孩子;
l 双亲(parents)——孩子结点的上层结点叫该结点的双亲;
l 兄弟(sibling)——同一双亲的孩子;
l 树的度——一棵树中最大的结点度数;
l 结点的层次(level)——从根结点算起,根为第一层,它的孩子为第二层……;
l 深度(depth)——树中结点的最大层次数;
l 森林(forest)——m(m>=0)棵互不相交的树的集合;
(2)树的存储结构
树的存储结构有多种形式,这里只讨论链式存储结构。因为树是多分支非线性表,因此采用多重链表结构,即每个结点设有多个指针域,其中每个指针指向一棵子树的根结点。对于每一个结点的结构类型有两种形式:结点异构型、结点同构型。
结点异构型,是根据每个结点的子树数设置相应的指针域,由于每个结点的度数不同,则同一棵树中,结点形式也不同。这种结构形式虽然能节省存储空间,但运算不方便。
结点同构型,是每个结点的指针域个数均为树的度数。这种形式运算方便,但会使链表中出现很多空链域,浪费空间。
当树的度数k=2时,空链域的比例最低,这就是要介绍的二叉树。
2)二叉树及其性质
二叉树在树结构的应用中起着非常重要的作用,因为对二叉树的许多 *** 作算法简单,而任何树都可以与二叉树 相互转换,这样就解决了树的存储结构及其运算中存在的复杂性。
(1)二叉树定义及其存储结构
定义:二叉树是由n(n>=0)个结点的有限集合构成,此集合或者为空集,或者由一个根结点及两棵互不相交的左右子树组成,并且左右子树都是二叉树。
这也是一个递归定义。二叉树可以是空集合,根可以有空的左子树或空的右子树。二叉树不是树的特殊情况,它们是两个概念。
二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。这是二叉树与树的最主要的差别。
图2-8 二叉树
存储结构:通常用具有两个指针域的链表作为二叉树的存储结构,其中,每个结点由数据域(data)、左指针域(L child)和右指针域(R child)组成,如图所示:
图2-9 二叉链表
这就是二叉链表,还有三叉链表就是在这一基础上增加一个双亲结点指针。
(2)二叉树的基本性质
(1) 在二叉树的第层上,至多有个结点。
(2) 深度为h的二叉树中,至多含有个结点。
(3) 对任意一棵二叉树,若有个子结点,个度为2的结点,则必有。
(3)几种特殊形式的二叉树
l 满二叉树
一棵深度为h且有2h-1个结点的二叉树称为满二叉树。
l 完全二叉树
如果深度为h、有n个结点的二叉树中的结点能够与深度为h的顺序编号的满二叉树从1到n标号的结点相对应,则该树称为完全二叉树。
完全二叉树的特点是:
所有的叶结点都出现在第h层或h-1层。
错任一结点,如果其右子树的最大层次为1,则其左子树的最大层次为1或l+1。
满二叉树是完全二叉树的特例。
(1) 平衡二叉树
所有结点的平衡因子为-1、0、1。
(4)一般树转换为二叉树
为了使一般树也能象二叉树一样用二叉树链表表示,必须找出树与二叉树之间的对应关系。将一般树转换为二叉树的方法为:
(1) 在兄弟结点之间加一连线;
(2) 对每个结点,除了与它的第一个孩子保持联系外,去除与其它孩子的联系;
(3) 以树根为轴心将整棵树顺时针旋转45度。
任何一棵树转换为二叉树,其根结点的右子树必为空。
3)二叉树的遍历
遍历——按一定规律走遍树的各个结点,每一结点仅被访问一次,即找一个完整而有规律的走法,以得到树中所有结点的一个线性排列。
常用方法
先序遍历(DLR):先访问根结点,然后分别先序遍历左子树、右子树
中序遍历(LDR):先中序遍历左子树,然后访问根结点,最后中序遍历右子树
后序遍历(LRD):先后序遍历左、右子树,然后访问根结点
22 工程手册的数据处理
基本要求:
(1)熟悉工程手册的数据处理方法;(2)掌握数表的程序化方法;(3)了解线图的程序化方法;(4)掌握最小二乘法拟合方法及其应用;(4)能用高级程序设计语言(如C语言)编写前述相应数据处理方法的基本程序并上机通过。
教学内容:
(1)数表的程序化;(2)线图的程序化;(3)建立经验公式的方法。
重点与难点:
重点:(1)查表程序设计;(2)一元函数的插值;(3)最小二乘法拟合。
难点:(1)抛物线插值中结点的选取;(2)插值程序设计及上机调试;(3)最小二乘法拟合程序设计及上机调试。
学时安排:
讲课4学时,课外上机练习不少于2学时。
在机械设计过程中,往往需要从有关的工程手册或设计规范中查找各种设计数据(资料)。这些数据在手册或规范中一般是以数表和线图的形式存放(记录)的。在进行机械CAD时,首先要把这些数表、线图形式的数据计算机化,即把它们存入计算机外、内存储器中,并设计相应的自动检索程序。
从总体上说,这些设计资料的计算机处理有以下三种方法:
(1)程序化:在应用程序内部对这些数表和线图进行处理,包括数组法和拟合公式法。
(2)数据文件法:将数表或线图中得数据编成一个独立的数据文件,存入外存,供设计解题时调用。高级程序设计语言本身一般均具备相应的数据文件处理功能。
(3)数据库法:将数表或线图中的数据暗数据库中的规定进行文件结构化,即建成数据库。
本章重点讨论程序化方法,补充介绍有关数据文件法的基本内容,数据库存储方法在后面第5章中介绍。
221 数表的程序化
l 数表的形式:
从函数角度看有:
单变量表:eg T3-1~T3-3
双变量表:eg T3-4~T3-5 单值表:eg T3-3~T3-6
多变量表:eg T3-6 多值表:eg T3-1~T3-2
无变量表:eg 齿轮标准模数(m)系列值。
l 数表数据的形成(来源)及处理原则:
(1)有些本来就有精确的计算公式,为了便于手工设计使用,才制成表格供设计时查用(如各种数学用表)——力求找到原来的理论计算公式或经验公式→编入应用程序。(最简单的方法)。
(2)对大多数数表而言,或本来就无法表达成公式,或一时难以找到原来公式——程序化处理。
l 数表程序化方法:
1) 数组法:适于只需要用数表中所列数据(离散点、型值点或结点数据),
2) 插值法(拟合公式法):对于需要用到数表中各离散点中间的数据。
1)数组法实例
本教材共介绍了六个实例,这里选取二个重点介绍,其余四个自己分析。
例1 平键和键槽的剖面尺寸,见图2-10和表2-1(摘引自GB/T 1095-1979)
它是单变量多值表。查表时,设计计算出的轴径dgiven→D(范围) →b,h,t,t1。可使用一维数组,D的范围可用其上限表示。变量及数组的定义:
int i;
float dgiven,b,h,t,t1;
float D[12]={100,120,…,850};
float kb[12]=…
float kt[12]=…
图2-10 平键和键槽的剖面图
表2-1 平键和键槽的尺寸表
图2-11平键和键槽的剖面尺寸查询流程
尺寸查取流程图见图2-11。
要求:用C(Turbo C or Visual C++等均可)语言编程实现该数表数据存储及查询。
例2 齿轮传动工况系数KA,见表2-2。
表2-2 齿轮传动工况系数KA
图2-12 齿轮传动工况系数KA查询流程
根据原动机机、工作机的工况→KA,使用二维数组:KK[i][j],i=0~2:表示原动机工况,j=0~2:表示工作机工况。
变量及数组定义:
float KA;
int i,j;
float;
KK[3][3]={{10,125,175},{125,15,20},{15,175,225}};
查表程序流程图见图2-12。
要求:用C(Turbo C or Visual C++等均可)语言编程实现该数表数据存储及查询。
例3 说明:多变量单值表
① P1值需用三维数组NN(4,4,14),可以将P1值→数据文件→NN数组。
② 降维处理:三维→二个二维。
2) 一元函数的插值
设有一用数据表格给出的列表函数y=f(x),如下表2-3:
表2-3 列表函数y=f(x)
表中只有几个离散点(或型值点、结点)的数据,当自变量为结点间的中间值时,就要用到插值法求取其函数值。
基本思想:在插值点附近选取几个合适的结点,过这些点构造一个简单函数g(x),在此小段上用g(x)代替原来函数f(x),这样插值点的函数值就用g(x)的值来代替,如图2-13。
图2-13 一元函数插值
插值的实质问题:如何构造一个既简单又具有足够精度的函数f(x)。
插值方法类型:线性插值、抛物线插值。
(1)线性插值
方法步骤:(1)选xi,xi+1,满足xi<x< xi+1;(2)过(xi,yi)及(xi+1,yi+1)两点构造直线g(x)→f(x)。
误差问题:存在误差,当自变量间隔较小,而插值精度不要很高时,可以满足要求。
x(n),y(n)——一维数值,n——结点数。C语言下标从0开始。xgiven,ygiven——已知的x 插入值及求出的函数值。
图2-14 线性插值流程
(2)抛物线插值
在f(x)上选取三点(xi-1,yi-1),(xi,yi),(xi+1,yi+1),构造抛物线g(x)→f(x)。比线性插值精度好。
关键问题:根据插值点x选取合适的三个点。选取方法归纳为(“靠近原则”):
设插值点为x,且xi-1<x≤xi,i=3,4,…,n-1,
(1)若|x-xi-1|≤|x-xi|,即x靠近xi-1点或居于xi-1与 xi之中点,则选xi-2,xi-1,xi三个点,上式中i=i-1;
(2)若|x-xi-1|>|x-xi|,即x靠近xi点,则选xi-1,xi,xi+1三个点,上式中i=I;
(3)若x1≤x≤x2,即x靠近表头,则选x1,x2,x3三个点,上式中i=2;
(4)若x n-1≤x≤xn,即x靠近表尾,则选xn-2,xn-1,xn三个点,上式中i=n-1。
程序流程图见下图2-15。
图2-15 抛物线插值流程
要求:将线性插值与抛物线插值统一编程。
3)二元函数的插值
有二元列表函数f(xi,yi),i=1,2,…,n,如下表2-4。
表2-4 二元列表函数
插值几何意义:在3D空间中选定几个点,通过这些点构造一块曲面g(x,y),用它近似地表示在这区间内原有的曲面f (x,y),从而得到插值后的函数值Zk=g(xk,yk) , 如图2-15所示。
插值方式类型,在一元函数插值方法的基础上延伸,有以下几种:
(1)直线-直线插值
最最基本、最简单、精度最低。
如图所示,g(x,y)形成:以AB、CD为导线,作//yoz平面的直母线(EF)直线的运动→柱状面。
插值步骤:
图2-15 二元函数插值
图2-16 抛物线插值流程
(a)根据k点的(xk,yk)→周围四点a,b,c,d,满足xa=xc,xb=xd,ya=yb,yc=yd,xa<xk<xb,ya<yk<yb;
(b)A,B,C,D,过A,B用线性插值→E,过C,D用线性插值→F;
(c)过E,F用线性插值→K点。
(2)抛物线-直线插值
将导线AB、CD→抛物线ABE,CDF。插值步骤:
(1)据k点的(xk,yk)→a,b,c,d+e,f;
(2)据a,b,c,d,e,f→A,B,C,D,E,F,过A,B,E 用抛物线插值→U点,过C,D,F用抛物线插值→V点;
(3)U,V用线性插值→K点。
(3)抛物线-抛物线插值
(1)据k点的(xk,yk)→a,b,c,d+e,f+r,s,t;
(2)据a,b,c,d, e,f,r,s,t→A,B,C,D,E,F,R,S,T,
过A,B,E用抛物线插值→U点,过C,D,F用抛物线插值→V点,过R,S,T用抛物线插值→W点;
(3) 过U,V,W用抛物线插值→K点。
上述三种插值方法统一的程序流程图见P44图3-10,三种方法由变量II控制。
要求:读懂该流程图,有余力的学生编程上机。
222 数表的公式拟合
工程实际中常需要用一定的数学方法将一系列测试数据或统计数据拟合成近似的经验公式——曲线拟合。
插值法的实质是在几何上用严格通过各结点的曲线或曲面来近似代替列表函数曲线或曲面。但通过试(实)验所得的数据离散性很大,误差比较大,因此,插值法建立的公式必然保留了所有误差,此外,要构造这样的函数的复杂度或难度比较大。有鉴于此,采用构造近似曲线、曲面,此曲线、曲面并不严格通过所有结点,而是尽可能反映所给数据的趋势,这种利用所给数据建立拟合或近似曲线或曲面经验公式的过程称为曲线、曲面拟合或公式拟合。
本节介绍最常用最基本的单变量曲线拟合方法——最小二乘法。(其他常用的还有Bezier法、三次参数样条法、B样条法等)。
1)最小二乘法拟合的基本思想
根据离散点的大致分布规律,先确定拟合函数的类型,如多项式函数、指数函数、对数函数等,计算出各数据点横坐标处的函数值与纵坐标之间的偏差的平方,求其和并使之为最小值,从而解出函数的待定系数。
已知由线图或实验所得m个点的值为:(x1,y1),(x1,y1),……,(xm,ym),设拟合函数公式为:y=f(x),则每一结点处的偏差为: (i=1,2,…,m),偏差的平方和为:
求 min 函数f(x)的待定系数→ f(x)
拟合函数的类型,常选取初等函数,如对数函数、指数函数、代数多项式等。一般是根据数据曲线形态判断所采用的函数类型。最常用的是代数多项式拟合。本节只讨论在选定函数类型的情况下如何确定各系数值的问题。
2)最小二乘法的(代数)多项式拟合
设拟合公式为: (n次多项式)
已知m个点的值(x1,y1),(x1,y1),……,(xm,ym),且m>>n,结点偏差的平方和为:
为使 j=0,1,2,…,n
其中:(k=1,2,…,2m+1)
这是一个关于的n+1个线性方程组,求解该方程组→→f(x)
常用二次三项式拟合公式:
例1 介绍
程序流程图,见P44图3-13
要求:看懂该流程图,该流程图中采用了高斯消去法解联立方法(详见334节),有余力的学生编程上机。
第1章 绪论 1
11 程序设计语言概述 1
111 机器语言 1
112 汇编语言 2
113 高级语言 2
114 C语言 3
12 C语言的优点和缺点 4
121 C语言的优点 4
122 C语言的缺点 6
13 算法概述 7
131 算法的基本特征 7
132 算法的复杂度 8
133 算法的准确性 10
134 算法的稳定性 14
第2章 复数运算 18
21 复数的四则运算 18
211 [算法1] 复数乘法 18
212 [算法2] 复数除法 20
213 实例5 复数的四则运算 22
22 复数的常用函数运算 23
221 [算法3] 复数的乘幂 23
222 [算法4] 复数的n次方根 25
223 [算法5] 复数指数 27
224 [算法6] 复数对数 29
225 [算法7] 复数正弦 30
226 [算法8] 复数余弦 32
227 实例6 复数的函数运算 34
第3章 多项式计算 37
31 多项式的表示方法 37
311 系数表示法 37
312 点表示法 38
313 [算法9] 系数表示转化为点表示 38
314 [算法10] 点表示转化为系数表示 42
315 实例7 系数表示法与点表示法的转化 46
32 多项式运算 47
321 [算法11] 复系数多项式相乘 47
322 [算法12] 实系数多项式相乘 50
323 [算法13] 复系数多项式相除 52
324 [算法14] 实系数多项式相除 54
325 实例8 复系数多项式的乘除法 56
326 实例9 实系数多项式的乘除法 57
33 多项式的求值 59
331 [算法15] 一元多项式求值 59
332 [算法16] 一元多项式多组求值 60
333 [算法17] 二元多项式求值 63
334 实例10 一元多项式求值 65
335 实例11 二元多项式求值 66
第4章 矩阵计算 68
41 矩阵相乘 68
411 [算法18] 实矩阵相乘 68
412 [算法19] 复矩阵相乘 70
413 实例12 实矩阵与复矩阵的乘法 72
42 矩阵的秩与行列式值 73
421 [算法20] 求矩阵的秩 73
422 [算法21] 求一般矩阵的行列式值 76
423 [算法22] 求对称正定矩阵的行列式值 80
424 实例13 求矩阵的秩和行列式值 82
43 矩阵求逆 84
431 [算法23] 求一般复矩阵的逆 84
432 [算法24] 求对称正定矩阵的逆 90
433 [算法25] 求托伯利兹矩阵逆的Trench方法 92
434 实例14 验证矩阵求逆算法 97
435 实例15 验证T矩阵求逆算法 99
44 矩阵分解与相似变换 102
441 [算法26] 实对称矩阵的LDL分解 102
442 [算法27] 对称正定实矩阵的Cholesky分解 104
443 [算法28] 一般实矩阵的全选主元LU分解 107
444 [算法29] 一般实矩阵的QR分解 112
445 [算法30] 对称实矩阵相似变换为对称三对角阵 116
446 [算法31] 一般实矩阵相似变换为上Hessen-Burg矩阵 121
447 实例16 对一般实矩阵进行QR分解 126
448 实例17 对称矩阵的相似变换 127
449 实例18 一般实矩阵相似变换 129
45 矩阵特征值的计算 130
451 [算法32] 求上Hessen-Burg矩阵全部特征值的QR方法 130
452 [算法33] 求对称三对角阵的全部特征值 137
453 [算法34] 求对称矩阵特征值的雅可比法 143
454 [算法35] 求对称矩阵特征值的雅可比过关法 147
455 实例19 求上Hessen-Burg矩阵特征值 151
456 实例20 分别用两种雅克比法求对称矩阵特征值 152
第5章 线性代数方程组的求解 154
51 高斯消去法 154
511 [算法36] 求解复系数方程组的全选主元高斯消去法 155
512 [算法37] 求解实系数方程组的全选主元高斯消去法 160
513 [算法38] 求解复系数方程组的全选主元高斯-约当消去法 163
514 [算法39] 求解实系数方程组的全选主元高斯-约当消去法 168
515 [算法40] 求解大型稀疏系数矩阵方程组的高斯-约当消去法 171
516 [算法41] 求解三对角线方程组的追赶法 174
517 [算法42] 求解带型方程组的方法 176
518 实例21 解线性实系数方程组 179
519 实例22 解线性复系数方程组 180
5110 实例23 解三对角线方程组 182
52 矩阵分解法 184
521 [算法43] 求解对称方程组的LDL分解法 184
522 [算法44] 求解对称正定方程组的Cholesky分解法 186
523 [算法45] 求解线性最小二乘问题的QR分解法 188
524 实例24 求解对称正定方程组 191
525 实例25 求解线性最小二乘问题 192
53 迭代方法 193
531 [算法46] 病态方程组的求解 193
532 [算法47] 雅克比迭代法 197
533 [算法48] 高斯-塞德尔迭代法 200
534 [算法49] 超松弛方法 203
535 [算法50] 求解对称正定方程组的共轭梯度方法 205
536 [算法51] 求解托伯利兹方程组的列文逊方法 209
537 实例26 解病态方程组 214
538 实例27 用迭代法解方程组 215
539 实例28 求解托伯利兹方程组 217
第6章 非线性方程与方程组的求解 219
61 非线性方程求根的基本过程 219
611 确定非线性方程实根的初始近似值或根的所在区间 219
612 求非线性方程根的精确解 221
62 求非线性方程一个实根的方法 221
621 [算法52] 对分法 221
622 [算法53] 牛顿法 223
623 [算法54] 插值法 226
624 [算法55] 埃特金迭代法 229
625 实例29 用对分法求非线性方程组的实根 232
626 实例30 用牛顿法求非线性方程组的实根 233
627 实例31 用插值法求非线性方程组的实根 235
628 实例32 用埃特金迭代法求非线性方程组的实根 237
63 求实系数多项式方程全部根的方法 238
631 [算法56] QR方法 238
632 实例33 用QR方法求解多项式的全部根 240
64 求非线性方程组一组实根的方法 241
641 [算法57] 梯度法 241
642 [算法58] 拟牛顿法 244
643 实例34 用梯度法计算非线性方程组的一组实根 250
644 实例35 用拟牛顿法计算非线性方程组的一组实根 252
第7章 代数插值法 254
71 拉格朗日插值法 254
711 [算法59] 线性插值 255
712 [算法60] 二次抛物线插值 256
713 [算法61] 全区间插值 259
714 实例36 拉格朗日插值 262
72 埃尔米特插值 263
721 [算法62] 埃尔米特不等距插值 263
722 [算法63] 埃尔米特等距插值 267
723 实例37 埃尔米特插值法 270
73 埃特金逐步插值 271
731 [算法64] 埃特金不等距插值 272
732 [算法65] 埃特金等距插值 275
733 实例38 埃特金插值 278
74 光滑插值 279
741 [算法66] 光滑不等距插值 279
742 [算法67] 光滑等距插值 283
743 实例39 光滑插值 286
75 三次样条插值 287
751 [算法68] 第一类边界条件的三次样条函数插值 287
752 [算法69] 第二类边界条件的三次样条函数插值 292
753 [算法70] 第三类边界条件的三次样条函数插值 296
754 实例40 样条插值法 301
76 连分式插值 303
761 [算法71] 连分式插值 304
762 实例41 验证连分式插值的函数 308
第8章 数值积分法 309
81 变步长求积法 310
811 [算法72] 变步长梯形求积法 310
812 [算法73] 自适应梯形求积法 313
813 [算法74] 变步长辛卜生求积法 316
814 [算法75] 变步长辛卜生二重积分方法 318
815 [算法76] 龙贝格积分 322
816 实例42 变步长积分法进行一重积分 325
817 实例43 变步长辛卜生积分法进行二重积分 326
82 高斯求积法 328
821 [算法77] 勒让德-高斯求积法 328
822 [算法78] 切比雪夫求积法 331
823 [算法79] 拉盖尔-高斯求积法 334
824 [算法80] 埃尔米特-高斯求积法 336
825 [算法81] 自适应高斯求积方法 337
826 实例44 有限区间高斯求积法 342
827 实例45 半无限区间内高斯求积法 343
828 实例46 无限区间内高斯求积法 345
83 连分式法 346
831 [算法82] 计算一重积分的连分式方法 346
832 [算法83] 计算二重积分的连分式方法 350
833 实例47 连分式法进行一重积分 354
834 实例48 连分式法进行二重积分 355
84 蒙特卡洛法 356
841 [算法84] 蒙特卡洛法进行一重积分 356
842 [算法85] 蒙特卡洛法进行二重积分 358
843 实例49 一重积分的蒙特卡洛法 360
844 实例50 二重积分的蒙特卡洛法 361
第9章 常微分方程(组)初值问题的求解 363
91 欧拉方法 364
911 [算法86] 定步长欧拉方法 364
912 [算法87] 变步长欧拉方法 366
913 [算法88] 改进的欧拉方法 370
914 实例51 欧拉方法求常微分方程数值解 372
92 龙格-库塔方法 376
921 [算法89] 定步长龙格-库塔方法 376
922 [算法90] 变步长龙格-库塔方法 379
923 [算法91] 变步长基尔方法 383
924 实例52 龙格-库塔方法求常微分方程的初值问题 386
93 线性多步法 390
931 [算法92] 阿当姆斯预报校正法 390
932 [算法93] 哈明方法 394
933 [算法94] 全区间积分的双边法 399
934 实例53 线性多步法求常微分方程组初值问题 401
第10章 拟合与逼近 405
101 一元多项式拟合 405
1011 [算法95] 最小二乘拟合 405
1012 [算法96] 最佳一致逼近的里米兹方法 412
1013 实例54 一元多项式拟合 417
102 矩形区域曲面拟合 419
1021 [算法97] 矩形区域最小二乘曲面拟合 419
1022 实例55 二元多项式拟合 428
第11章 特殊函数 430
111 连分式级数和指数积分 430
1111 [算法98] 连分式级数求值 430
1112 [算法99] 指数积分 433
1113 实例56 连分式级数求值 436
1114 实例57 指数积分求值 438
112 伽马函数 439
1121 [算法100] 伽马函数 439
1122 [算法101] 贝塔函数 441
1123 [算法102] 阶乘 442
1124 实例58 伽马函数和贝塔函数求值 443
1125 实例59 阶乘求值 444
113 不完全伽马函数 445
1131 [算法103] 不完全伽马函数 445
1132 [算法104] 误差函数 448
1133 [算法105] 卡方分布函数 450
1134 实例60 不完全伽马函数求值 451
1135 实例61 误差函数求值 452
1136 实例62 卡方分布函数求值 453
114 不完全贝塔函数 454
1141 [算法106] 不完全贝塔函数 454
1142 [算法107] 学生分布函数 457
1143 [算法108] 累积二项式分布函数 458
1144 实例63 不完全贝塔函数求值 459
115 贝塞尔函数 461
1151 [算法109] 第一类整数阶贝塞尔函数 461
1152 [算法110] 第二类整数阶贝塞尔函数 466
1153 [算法111] 变型第一类整数阶贝塞尔函数 469
1154 [算法112] 变型第二类整数阶贝塞尔函数 473
1155 实例64 贝塞尔函数求值 476
1156 实例65 变型贝塞尔函数求值 477
116 Carlson椭圆积分 479
1161 [算法113] 第一类椭圆积分 479
1162 [算法114] 第一类椭圆积分的退化形式 481
1163 [算法115] 第二类椭圆积分 483
1164 [算法116] 第三类椭圆积分 486
1165 实例66 第一类勒让德椭圆函数积分求值 490
1166 实例67 第二类勒让德椭圆函数积分求值 492
第12章 极值问题 494
121 一维极值求解方法 494
1211 [算法117] 确定极小值点所在的区间 494
1212 [算法118] 一维黄金分割搜索 499
1213 [算法119] 一维Brent方法 502
1214 [算法120] 使用一阶导数的Brent方法 506
1215 实例68 使用黄金分割搜索法求极值 511
1216 实例69 使用Brent法求极值 513
1217 实例70 使用带导数的Brent法求极值 515
122 多元函数求极值 517
1221 [算法121] 不需要导数的一维搜索 517
1222 [算法122] 需要导数的一维搜索 519
1223 [算法123] Powell方法 522
1224 [算法124] 共轭梯度法 525
1225 [算法125] 准牛顿法 531
1226 实例71 验证不使用导数的一维搜索 536
1227 实例72 用Powell算法求极值 537
1228 实例73 用共轭梯度法求极值 539
1229 实例74 用准牛顿法求极值 540
123 单纯形法 542
1231 [算法126] 求无约束条件下n维极值的单纯形法 542
1232 [算法127] 求有约束条件下n维极值的单纯形法 548
1233 [算法128] 解线性规划问题的单纯形法 556
1234 实例75 用单纯形法求无约束条件下N维的极值 568
1235 实例76 用单纯形法求有约束条件下N维的极值 569
1236 实例77 求解线性规划问题 571
第13章 随机数产生与统计描述 574
131 均匀分布随机序列 574
1311 [算法129] 产生0到1之间均匀分布的一个随机数 574
1312 [算法130] 产生0到1之间均匀分布的随机数序列 576
1313 [算法131] 产生任意区间内均匀分布的一个随机整数 577
1314 [算法132] 产生任意区间内均匀分布的随机整数序列 578
1315 实例78 产生0到1之间均匀分布的随机数序列 580
1316 实例79 产生任意区间内均匀分布的随机整数序列 581
132 正态分布随机序列 582
1321 [算法133] 产生任意均值与方差的正态分布的一个随机数 582
1322 [算法134] 产生任意均值与方差的正态分布的随机数序列 585
1323 实例80 产生任意均值与方差的正态分布的一个随机数 587
1324 实例81 产生任意均值与方差的正态分布的随机数序列 588
133 统计描述 589
1331 [算法135] 分布的矩 589
1332 [算法136] 方差相同时的t分布检验 591
1333 [算法137] 方差不同时的t分布检验 594
1334 [算法138] 方差的F检验 596
1335 [算法139] 卡方检验 599
1336 实例82 计算随机样本的矩 601
1337 实例83 t分布检验 602
1338 实例84 F分布检验 605
1339 实例85 检验卡方检验的算法 607
第14章 查找 609
141 基本查找 609
1411 [算法140] 有序数组的二分查找 609
1412 [算法141] 无序数组同时查找最大和最小的元素 611
1413 [算法142] 无序数组查找第M小的元素 613
1414 实例86 基本查找 615
142 结构体和磁盘文件的查找 617
1421 [算法143] 无序结构体数组的顺序查找 617
1422 [算法144] 磁盘文件中记录的顺序查找 618
1423 实例87 结构体数组和文件中的查找 619
143 哈希查找 622
1431 [算法145] 字符串哈希函数 622
1432 [算法146] 哈希函数 626
1433 [算法147] 向哈希表中插入元素 628
1434 [算法148] 在哈希表中查找元素 629
1435 [算法149] 在哈希表中删除元素 631
1436 实例88 构造哈希表并进行查找 632
第15章 排序 636
151 插入排序 636
1511 [算法150] 直接插入排序 636
1512 [算法151] 希尔排序 637
1513 实例89 插入排序 639
152 交换排序 641
1521 [算法152] 气泡排序 641
1522 [算法153] 快速排序 642
1523 实例90 交换排序 644
153 选择排序 646
1531 [算法154] 直接选择排序 646
1532 [算法155] 堆排序 647
1533 实例91 选择排序 650
154 线性时间排序 651
1541 [算法156] 计数排序 651
1542 [算法157] 基数排序 653
1543 实例92 线性时间排序 656
155 归并排序 657
1551 [算法158] 二路归并排序 658
1552 实例93 二路归并排序 660
第16章 数学变换与滤波 662
161 快速傅里叶变换 662
1611 [算法159] 复数据快速傅里叶变换 662
1612 [算法160] 复数据快速傅里叶逆变换 666
1613 [算法161] 实数据快速傅里叶变换 669
1614 实例94 验证傅里叶变换的函数 671
162 其他常用变换 674
1621 [算法162] 快速沃尔什变换 674
1622 [算法163] 快速哈达玛变换 678
1623 [算法164] 快速余弦变换 682
1624 实例95 验证沃尔什变换和哈达玛的函数 684
1625 实例96 验证离散余弦变换的函数 687
163 平滑和滤波 688
1631 [算法165] 五点三次平滑 689
1632 [算法166] α-β-γ滤波 690
1633 实例97 验证五点三次平滑 692
1634 实例98 验证α-β-γ滤波算法 693
2L的说“计算机没什么前景”?不认同。
转到回答:
程序员就是写程序,写程序就是写计算机编程语言,让计算机去执行。
所以成为一个程序员就要学编程语言。
学编程只是第一步。
作一个真正合格的程序员,应该具有的素质:
1:团队精神和协作能力
2:文档习惯
3:规范化的代码编写习惯
4:需求理解能力
5:模块化思维能力
6:测试习惯
7:学习和总结的能力
作为高级程序员,乃至于设计师而言,除了应该具备上述全部素质之外,还需要具备以下素质:
1、 需求分析能力
2、 整体框架能力
3、 流程处理能力
4、 模块分解能力
5、 整体项目评估能力
6、 团队组织管理能力
另外:
1,激情
2,自学好学
3,聪明
4,隐性的经验
5,技术多样性
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)