基本编程范文(精选3篇)
基本编程 第1篇
关键词:数据分析,函数极值,方差,傅里叶变换,滤波,卷积
1 最大值、最小值、平均值、中间值
最大值、 最小值、 平均值、 中间值和元素求和是数据分析中最基本的手段, 在很多研究的算法性能比较中经常看到它们的运用。
(1) 最大值采用max函数, 调用格式如下:
(2) 最小值使用min函数, 调用格式与max相同。
(3) 平均值使用mean函数, 调用格式如下:
(4) 中间值使用median函数, 调用格式与mean相同。
下面的代码说明了这些函数的用法:
执行上述代码可得到图1所示的结果。
2 数学函数极值与零点
工程上一个常见的问题是求函数的极值和零点。 这里极值的求解只介绍最小值的方法。 至于最大值的求解, 只需要把原函数乘以一个常数-1 得到一个新函数, 然后求这个新函数的最小值, 则新函数的最小值与原函数的最大值的自变量取值相同。
(1) 对于一元函数在指定区间内的最小值问题, Matlab使用函数fminbnd求解。 其调用格式如下:
值得注意的是: 函数fminbnd只能用于连续函数, 并且只能给出局部最小值。 当最小值在指定区间的边界上时, 收敛的速度很慢。
下面的代码用于计算正弦函数在[0, 10 区间内的最小值:
(2) 对于多元函数的最小值, Matlab使用函数fminsearch求解。 使用该函数时必须指定开始矢量X0, 然后返回在矢量X0 附近的局部最小值。 其调用格式如下:
下面的代码用于计算二元函数的局部最小值:
(3) 对于一元函数的零点, Matlab使用fzero函数求解。在寻找一元函数的零点时, 可以指定一个开始点或者指定一个区间。 当指定一个开始点时, 此函数在开始点附近寻找一个使得函数值变号的区间, 如果没有找到这样的区间, 则返回Na N; 如果知道零点所在的区间, 则可以使用一个包含两个元素的向量来指定此区间。 其调用格式如下:
值得注意的是: 函数fzero只能返回一个局部零点, 不能寻找所有的零点。 此外, 它的收敛速度与开始点或区间的选取有关, 尽可能猜出零点的大致范围, 然后在该范围内寻找零点。
下面的代码用于求解函数的零点:
%用匿名函数来表示函数
3 标准差和方差
在Matlab中, 向量x的标准方差有如下两种定义:
其中:, N是向量x的长度。 (1) 式称为有偏标准差, (2) 式称为无偏标准差。Matlab使用 (1) 式计算数据的标准差。方差是标准方差的平方。相应地, 方差也有两种定义。
(1) 标准方差使用std函数, 其调用格式如下:
(2) 方差使用var命令, 其调用格式如下:
下面的代码对于随机变量x验证2*x的方差是x的4 倍、2x标准方差是x的2 倍:
4 协方差和相关系数矩阵
在数理统计中, 协方差和相关系数是非常重要的随机变量的数字特征。对于给定的n维随机变量, x= (x1, x2, ..., xn) 定义协方差, 则称为随机变量x的协方差矩阵;定义相关系数, 则称为相关系数矩阵。
(1) Matlab使用函数cov计算随机变量的协方差矩阵, 其调用格式如下:
(2) Matlab使用函数corrcoef计算随机变量的相关系数矩阵, 其调用格式如下:
下面的代码用于计算随机变量的系数相关矩阵:
5 元素排序
Matlab可以对实数、 复数和字符串进行排序。 对复数矩阵进行排序时, 先按照复数的模进行排序, 如果模相等则按照其在区间的相角进行排序。
(1) 数据排序使sort用函数。 其调用格式如下:
(2) 对矩阵的行进行排序使用sortrows函数。 其调用格式如下:
下面的代码对复数矩阵和字符串数据进行排列:
6 有限差分
Matlab使用函数diff来计算差分, 其调用格式如下:
下面的代码利用有限差分计算正弦函数的导数:
执行该代码可得到图2 所示的结果。
7 梯度
对于一个二元函数f (x, y) , 定义其梯度为。Matlab使用函数gradient来计算梯度, 调用格式如下:
下面的代码计算二维高斯函数的梯度场:
执行上述代码可得到图3 所示的梯度场。 图3 中椭圆是二维高斯函数的等高线, 箭头的方向代表了梯度的方向, 箭头的长度表示梯度的模。 此图也验证了梯度场的基本性质之一: 梯度方向总是垂直于等高线。
8 滤波
Matlab使用函数filter函数实现一维数字滤波。 它是下列直接II型线性差分方程组的解, 可以用于FIR和IIR滤波:
其中: na和nb是向量a和b的长度。 该方程是n-1 阶线性方程。 该方程在Z域上的表现形式为:
函数filter的调用格式如下:
下面的代码实现对带噪声的正弦信号进行平均值滤波:
执行上面代码可得到图4 所示的结果。 可知平均值滤波方法能有效去除信号中的噪声。
一般在对信号做快速傅里叶变换之前经常需要去除信号中的直流成分或线性成分。 Matlab使用detrend函数实现此功能, 其调用格式如下:
下面的代码实现去除信号中的直流成分和线性成分:
执行上述代码可得到图5 所示的结果。
9 傅里叶变换
对信号进行分析通常可以在时域中进行, 也可以在频域中进行, 时域分析方法和频域分析各有优势。 傅里叶变换可以把信号从时域变换到频域, 因此它在信号分析中非常重要, 特别是在滤波器设计、 频谱分析等方面更是如此。
傅里叶变换既可以对连续信号进行分析, 也可以对离散信号进行分析。 其中, 连续信号的傅里叶变换实际上是要计算傅里叶积分。 这里只介绍离散型傅里叶变换。
(1) 对于一维离散傅里叶变换: 如果有一个向量x (n) , 其离散傅里叶变换的结果为X (k) , 则x (n) 和X (k) 之间的关系为:
其中N为向量x (n) 的长度。 Matlab使用函数FFT实现一维离散傅里叶变换, 其调用格式如下:
对于一维离散傅里叶逆变换, Matlab使用ifft函数实现, 其调用格式与fft基本相同, 只是多了一个选项:
与傅里叶变换函数经常配合使用的是fftshift函数。 为了绘图方便, Matlab使用该函数把傅里叶变换的结果频谱X (k) 转换为适合画图显示的格式。 对于一维信号进行操作时, fftshift把信号分为左半部分和右半部分, 然后交换其左右部分。当然, fftshift函数不仅可以调整一维傅里叶变换的结果, 也可以用于二维甚至多维傅里叶变换的调整。 其调用格式如下:
下面的代码用于计算单位冲击信号经过带阻滤波器前后的频谱:
执行上述代码, 可得到图6、 图7 所示的结果。 可以看出, 单位冲击信号的频谱是一个常数, 它通过一个带阻滤波器后的频谱等于带通滤波器的频率响应曲线。 这个结果验证了: 一个信号通过一个线性系统后的频谱等于信号频谱乘以线性系统的频率响应。
(2) 在图像处理中经常使用二维傅里叶变换来进行图像滤波等操作。 Matlab使用函数fft2 实现二维傅里叶变换。 它可以看成是对信号进行两次一维傅里叶变换。 其调用格式如下:
下面的代码用于分析图片的频谱:
10 卷积
假设向量u和向量v的卷积为w, 则记为w=u塥v。 如果u, v的长度分别为m, n, 则w的长度为m+n-1。 卷积的定义为:
其中: j是使得u (j) 和v (k+1-j) 有意义的任何值。
卷积的一个非常重要的性质是满足。 这里fft函数用于信号的傅里叶变换。 Matlab使用函数conv来计算卷积。 函数conv计算卷积时利用快速傅里叶变换来实现。
下面的代码实现信号向量的卷积运算:
考查C程序员的基本编程技能 第2篇
考试成绩能反映出考生的编程质量以及对C /C的理解程度,
但不能反映考生的智力和软件开发能力。
笔试时间90分钟。请考生认真答题,切勿轻视。
一、请填写BOOL , float, 指针变量 与“零值”比较的 if 语句。
(10分)
提示:这里“零值”可以是0, 0.0 , FALSE或者“空指针”。
例如 int 变量 n 与“零值”比较的 if 语句为:
if ( n == 0 )
if ( n != 0 )
以此类推。
请写出 BOOL flag 与“零值”比较的 if 语句:
请写出 float x 与“零值”比较的 if 语句:
请写出 char *p 与“零值”比较的 if 语句:
二、以下为Windows NT下的32位C 程序,请计算sizeof的值(10分)
char str[] = “Hello” ;
char *p = str ;int
n = 10;
请计算
sizeof (str ) =
sizeof ( p ) =
sizeof ( n ) =
void Func ( char str[100])
{请计算 sizeof( str ) = }
void *p = malloc( 100 );
请计算sizeof ( p ) =
三、简答题(25分)
1、头文件中的 ifndef/define/endif 干什么用?
2、#include 和
#include “filename.h” 有什么区别?
3、const 有什么用途?(请至少说明两种)
4、在C 程序中调用被 C编译器编译后的函数,
为什么要加 extern “C”声明?
5、请简述以下两个for循环的优缺点
// 第一个for (i=0; i{if (condition)
DoSomething;
else
DoOtherthing();}
优点:缺点:
// 第二个if (condition)
{for (i=0; i DoSomething();}
else{
for (i=0; i优点:缺点:
四、有关内存的思考题(20分)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;GetMemory(str);
strcpy(str, “hello world”);
printf(str);
}请问运行Test函数会有什么样的结果?答:
char *GetMemory(void)
{
char p[] = “hello world”;
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么样的结果?答:
Void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(
strcpy(str, “hello”);
printf(str);
}
请问运行Test函数会有什么样的结果?答:
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么样的结果?答:
五、编写strcpy函数(10分)
已知strcpy函数的.原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串,
(1)不调用C /C的字符串库函数,请编写函数 strcpy
(2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
谈数控编程中基本功能的使用 第3篇
1.1 数控编程的基本概念
数控编程是从零件图纸到获得数控加工程序的全过程。它的主要任务是计算加工走刀中的刀位点 (cutter location point简称CL点) 。刀位点一般取为刀具轴线与刀具表面的交点, 多轴加工中还要给出刀轴矢量。
1.2 数控编程技术的发展概况
为了解决数控加工中的程序编制问题, 20世纪50年代, MIT设计了一种专门用于机械零件数控加工程序编制的语言, 称为APT (Automatically Programmed Tool) 。采用APT语言编制数控程序具有程序简炼, 走刀控制灵活等优点, 但APT仍有许多不便之处:采用语言定义零件几何形状, 缺乏几何直观性;缺少对零件形状、刀具运动轨迹的直观图形显示和刀具轨迹的验证手段;难以和CAD数据库和CAPP系统有效连接;不容易做到高度的自动化, 集成化。在1978年, 法国达索飞机公司开始开发集三维设计、分析、NC加工一体化的系统, 称为CATI-A。随后很快出现了象EUCLID, UGII, INTER-
GRAPH, Pro/Engineering, Master CAM及NPU/
GNCP等系统, 这些系统都有效的解决了几何造型、零件几何形状的显示, 交互设计、修改及刀具轨迹生成, 走刀过程的仿真显示、验证等问题, 推动了CAD和CAM向一体化方向发展。到了20世纪80年代, 在CAD/CAM一体化概念的基础上, 逐步形成了计算机集成制造系统 (CIMS) 及并行工程 (CE) 的概念。目前, 数控编程系统正向集成化和智能化方向发展。
在集成化方面, 以开发符合STEP (Standard for the Exchange of Product Model Data) 标准的参数化特征造型系统为主, 目前已进行了大量卓有成效的工作, 是国内外开发的热点。
2 数控车床基本功能
数控车床的基本功能包括准备功能 (G功能) 、刀具功能 (T功能) 、主轴功能 (S功能) 、辅助功能 (M功能) 、进给功能 (F功能) 。
2.1 准备功能也称为G功能 (
或称G代码) , 它是用来控制机床动作方式的功能。G功能由地址符G和其后的两位数字组成, ISO标准中规定准备功能有G00-G99共100种。准备功能用来指定机床动作方式, 包括基本移动、程序暂停、平面选择、坐标设定、刀具补偿、基准点返回、固定循环、公英制转换等多种功能。
G代码有非模态G代码和模态G代码之分, 非模态G代码只限于被指令的程序段中有效, 而模态就是续效, 一经程序段中指定便一直有效, 直到以后程序段中出现同组另一指令或被其他指令取消才失效。
2.2 刀具功能也称为T功能, 包括选择的刀
具数量和种类、刀具的编码方式和自动换刀的方式及自动补偿编组号的地址字, 其自动补偿内容主要指刀具的刀位偏差及刀具半径补偿。
(1) 采用两位数的规定:首位数字一般表示刀具号, 常用0~8共9个数字, 其中0表示不转刀, 末位数表示刀具补偿的编组号, 常用0~8共9个数字, 其中0表示补偿量为零。例:T23表示将2号刀转到切削位置, 并执行第3组刀具补偿值;四位数的规定:对刀具较多的数控车床或车削中心, 其数控系统一般规定, 其后续数字为四位数, 前2位为刀具号, 后两位为刀具补偿的编组号。
例如:T0404表示选择4号刀, 4号偏置值;T0300表示选择3号刀, 刀具偏置取消。
(2) 采用T、D指令编程。利用T功能选择刀具, 利用D功能选择相关的刀具偏置值。在定义这两个参数时, 其编程的顺序为T、D。T和D可以编写在一起也可以单独编写, 例如:T4D04表示选择4号刀, 采用刀具偏置值表4号的偏置尺寸;T4D12表示仍用4号刀, 采用刀具偏置值表12号的偏置尺寸;T2表示选择2号刀, 采用与该刀相关的刀具偏置尺寸。
2.3 主轴转速指令功能S, 表示机床主轴的
转速, 由地址S和其后的数字组成, 其表示方法有三种:
(1) 转速。S表示主轴转速, 单位r/min, 如S1000表示主轴转速为1000r/min。
(2) 线速度。在恒线速状态下, S表示切削点的线速度, 单位为m/min。如S50表示切削点的线速度恒定为50m/min。
(3) 代码。用代码表示主轴速度时, S后面的数字不直接表示转速或线速度数值, 而只是主轴转速的代号。如某机床用S00~S99表示100种转速, S40表示主轴转速为1200r/min, S41表示主轴转速为1230r/min, S00表示主轴速为0r/min, S99表示最高转速。
2.4 辅助功能也称M功能,
用以指令数控机床中的辅助装置的开关动作或状态, 辅助功能是用地址M及其后续数字一般为两位数。主要用于控制机床各种辅助功能的开关动作以及零件程序的走向。M功能有非模态功能和模态功能两种形式。
由于数控机床实际使用的符合ISO标准的这种地址符其标准的程度与G指令一样不高, 指定代码少, 不指定和永不指定代码多, 因此M功能代码常因数控系统生产厂家及机床结构的差异和规格的不同而有所差别。因此, 编程人员必须熟悉具体所使用数控系统的M功能指令的功能含义, 不可盲目套用。
2.5 进给功能, 也称F功能, 表示刀具中心运动时的进给速度,
由F和其后的若干数字组成。对于数控车床, 其进给方式可以分为:每分钟进给和每转进给两种。
(1) 每分钟进给:即刀具每分钟走的距离单位为mm/min, 与车床转速大小无关, 其进给进度不随主轴转速的变化而变化。和普通车床的走刀量概念有区别, 用G94配合指令 (或不用指令) 现大多数经济型数控车床都采用这种进给方式来指令, 对于初学者来说, F功能数值的确定往往不合理, 主要是缺少切削方面的知识, 对于F值的确定, 可用公式F值=车床转速×所选走刀量来计算, 如车削—外圆, 主轴转速分别定为400r/min和600r/min, 而走刀量都选为0.3mm/r, 则F值分别为F120和F180。但相对于切削进给速度而言, 它的每转进给量都是一致的。在这里的车床转速和所选走刀量, 都是根据材料种类、直径大小、刀具吃刀深度等因素而定的与普通车床的走刀量选择基本一致。
(2) 每转进给:即车床主轴每转一圈, 刀具向进给方向移动的距离, 单位为mm/r, 主轴每转刀具的进给量用F后续的数值直接指令, 用G95配合指令, 如G95 F0.3表示主轴每转一圈, 刀具向进给方向移动0.3mm/r, 与普通车床的走刀量概念完全相同。其进行的速度随主轴的变化而变化的。对于F功能数值的指定范围要参照机床系统说明书中所规定的数值范围进给设定, 不可超出指定的范围。
注意事项如下:
(1) 不同系统的G、M指令有所差异。虽然一些基本指令的含义所有系统都一样, 但一定要注意所用机床的数控系统及编程说明书, 了解代码的具体含义。
(2) 一定注意G、M指令的模态和非模态代码。
(3) 注意代码的格式要求 (不同系统会有所不同) 以及代码的默认值。
数控机床是一种通过数字信息, 控制机床按给定的运动轨迹, 进行自动加工的机电一体化的加工装备, 不仅要熟悉零件工艺要求, 正确处理工艺问题, 而且要熟练地掌握数控机床上加工零件的基本功能的使用, 从而提高学生解决实际问题和自主分析问题的能力。
参考文献
[1]李郝林.机床数控技术[M].北京:机械工业出版社, 2002.
[2]周济.数控加工技术[M].北京:国防工业出版社, 2003.
[3]苟帅.BCB5编程员指南[M].北京:北京希望电子出版社, 2002.
[4]彭晓南.数控技术[M].北京:机械工业出版社, 2004.