文档库 最新最全的文档下载
当前位置:文档库 › 传递函数的测量方法

传递函数的测量方法

传递函数的测量方法
传递函数的测量方法

传递函数的测量方法

一.测量原理

设输入激励为X (f ),系统(即受试的试件)检测点上的响应信号,即通过系统后在该响应

点的输出为Y (f ),则该系统的传递函数H (f )可以用下式表示:

)()

()(f X f Y f H =

如果,设输入激励为X (f )为常量k ,则该系统的传递函数H (f )可以用下式表示:

)()(f kY f H =

也就是说,我们在检测点上测到的响应信号,就是该系统的传递函数。

二.测量方法

1. 将控制加速度传感器固定在振动台的工作台面上。注意:如果试件是通过夹具安装在振动台

的工作台面上,则控制加速度传感器应该安装在夹具与试件的连接点附近。如果试件与夹具的连

接是通过多个连接点固定,则应该选择主要连接点,或者采取多点控制的方法。

2. 将测量加速度传感器固定在选择的测量点(即响应点)上。

3. 试验采用正弦扫频方式,试验加速度选择1g ,扫频速率为0.5 Oct/min (或者更慢一些),试 验频率范围可以选择自己需要的频率范围。在试验中屏幕上显示的该激励曲线(也就是控制曲

线)应该是一条平直的曲线。这就保证对被测量试件来说是受到一个常量激励。

注意:在测量传递函数时,最好是采用线性扫频。因为,线性扫频是等速度扫频,这对于高频

段共振点的搜索比较好,能大大减少共振点的遗漏。而对于对数扫频来说,在低频段,扫频速

度比较慢;在高频段。扫频速度就比较快,这就有可能遗漏共振点。不少人之所以喜欢在测量

传递函数时采用对数扫频,是因为对于同样频率段的扫频来说,线性扫频要比对数扫频使用的

时间要多。

4. 通过控制仪,选择不同的颜色在屏幕上显示响应曲线。该响应曲线就是系统的频响曲线,在

这里也是该系统的传递函数曲线。注意:该控制仪可以在屏幕上同时显示好几条曲线。

三.其他方法

1. 测量原理

在闭环反馈控制时,为了保证控制点上被控制的物理量不变,当被控制的试件由于本身的

频率特性而将输入的激励信号放大时,从控制点上检测到的响应信号也将随着变大,也就是反馈

信号变大。由于,通常都是采取负反馈控制,那么,反馈信号与输入信号综合后再输入到系统中,

就会使控制点上的响应信号变小,而返回到原来的量级。

反过来,如果被控制的试件由于本身的频率特性而将输入的激励信号缩小时,从控制点上检

测到的响应信号也将随着变小,也就是反馈信号变小,那么,反馈信号与输入信号综合后再输入

到系统中,就会使控制点上的响应信号变大,以保持原来的量级不变。

如果我们保持控制点的振动量级不变,则驱动到功率放大器的信号,即控制仪的输出信号必将随着被测试件的频率特性的变化而变化,这样。我们就间接得到了被测件的传递函数。如下图所示,驱动信号曲线与传递函数曲线对于控制信号曲线成为镜像对称。

需要注意的是,此时我们得到的传递函数实际上是振动台与被测试件的复合传递函数。由于振动台的传递函数是已知的,所以,复合传递函数上的峰谷点,除去振动台的峰谷点外,就是被测试件的了。而且,振动台本身传递函数曲线是比较光滑的;所以,复合传递函数的变化,基本上反映了被测试件传递函数的变化。

2.测量方法

(1)将控制加速度传感器固定在振动台的工作台面上。如果试件是通过夹具安装在振动台的工作台面上,则控制加速度传感器应该安装在夹具与试件的连接点附近。如果试件与夹具的连接是通过多个连接点固定,则应该选择主要连接点,或者采取多点控制的方法。

注意:此时得到的复合传递函数中应该包括夹具的频率特性。

(2)试验采用正弦扫频方式,试验加速度选择1g,扫频速率为0.5 Oct/min(或者更慢一些);如果采用线性扫频,则扫频速度可采用1 Hz/s;试验频率范围可以选择自己需要的频率范围。此时,在试验中屏幕上显示的控制曲线应该是一条平直的曲线。这就保证对被测量试件来说处在一个常量控制状态中。

(3)通过控制仪,选择不同的颜色在屏幕上显示驱动曲线。该驱动曲线翻转180°,就是系统的频响曲线,也就是该系统的复合传递函数曲线。

(4)从上面的分析可以看到,用这种方法得到的传递函数是振动台和被测试件的复合传递函数。如果有夹具的话,还要包括夹具的传递函数,所以,这种方法只是大概地了解被测试件的频率响应情况。

由于,这种方法比较简单,所以,许多试验人员还是经常采用这种方法来估测被测试件的传递函数。当然,被测试件的主要峰谷点还是能够测出来的。

通过函数绘制一阶二阶传递函数伯德图

关于一阶二阶传递函数的伯德图 一阶惯性系统的通式为: 将式子两边同时除以a0得 令0 0a K b =为系统静态灵敏度; 0 1a a =τ为系统时间常数; 则有 )()()1( s KX s Y s =+τ 故有 ) 1()()()(+==s K s X s Y s H τ 以液柱式温度计为例,传递函数为 )1(1)()()(+==s s X s Y s H τ 可得频率响应函数 )1j (1)(+= τωs H )()()(001t x b t y a dt t dy a =+)()()(0001t x a b t y dt t dy a a =+

可得传递函数的幅频与相频特性 2)1(1 )()(τωωω+==j H A ωτωω?arctan )()(-=∠=j H 在MATLAB 上输入程序(此时令1=τ) num=[1]; den=[1,1]; figure sys=tf(num,den); bode(sys);grid on 可得bode 图

二阶惯性系统的通式为: 将式子两边同时除以a 0得 令0 0a K b =为系统静态灵敏度; 20n a a = ω为系统无阻尼固有频率; 1 012a a a =ξ为系统阻尼器 传递函数为 12) ()()(22++==n n s s K s X s Y s H ωξω 可得传递函数的幅频与相频特性 2222)(4)1(1 )()(2n n K j H A ωωξωωωω+-== )()()()(001222t x b t y a dt t dy a dt t y d a =++)()()()(00012202t x a b t y dt t dy a a dt t y d a a =++

C++中函数调用时的三种参数传递方式

在C++中,参数传递的方式是“实虚结合”。 ?按值传递(pass by value) ?地址传递(pass by pointer) ?引用传递(pass by reference) 按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用。这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”。 使用这种方式,调用函数本省不对实参进行操作,也就是说,即使形参的值在函数中发生了变化,实参的值也完全不会受到影响,仍为调用前的值。 [cpp]view plaincopy 1./* 2. pass By value 3.*/ 4.#include https://www.wendangku.net/doc/2d6440772.html,ing namespace std; 6.void swap(int,int); 7.int main() 8.{ 9.int a = 3, b = 4; 10. cout << "a = " << a << ", b = " 11. << b << endl; 12. swap(a,b); 13. cout << "a = " << a << ", b = " 14. << b << endl; 15.return 0; 16.} 17.void swap(int x, int y) 18.{ 19.int t = x; 20. x = y; 21. y = t; 22.}

如果在函数定义时将形参说明成指针,对这样的函数进行调用时就需要指定地址值形式的实参。这时的参数传递方式就是地址传递方式。 地址传递与按值传递的不同在于,它把实参的存储地址传送给对应的形参,从而使得形参指针和实参指针指向同一个地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。 [cpp]view plaincopy 1.#include https://www.wendangku.net/doc/2d6440772.html,ing namespace std; 3.void swap(int*,int*); 4.int main() 5.{ 6.int a = 3, b = 4; 7. cout << "a = " << a << ", b = " 8. << b << endl; 9. swap(&a,&b); 10. cout << "a = " << a << ", b = " 11. << b << endl; 12. system("pause"); 13.return 0; 14.} 15.void swap(int *x,int *y) 16.{ 17.int t = *x; 18. *x = *y; 19. *y = t; 20.} 按值传递方式容易理解,但形参值的改变不能对实参产生影响。 地址传递方式虽然可以使得形参的改变对相应的实参有效,但如果在函数中反复利用指针进行间接访问,会使程序容易产生错误且难以阅读。

函数参数传递的原理

函数参数传递的原理 参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。 形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。 实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。 等号、函数名称、括弧和参数,是函数的四个组成部分。 函数“=SUM(1,2,3)”,1、2和3就是SUM函数的参数,没有参数1、2、3,函数SUM 则无从求值。 函数“=VLOOKUP(2,A:C,3,)”,没有参数2、A:C和3,函数VLOOKUP如何在A:C 区域查找A列中是2那一行第3列的数值? 当然,也有不需要参数的函数,如“=PI()”、“=NOW()”、“TODAY()”等。 函数参数传递的原理C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。 首先,我们看一下,下面一个简单的调用例程: int Add (int a,int b,int c) { return a+b+c; }

二阶系统的性能指标

一、二阶系统传递函数的标准形式 二阶系统的闭环传递函数写成标准形式为:22 2 2)()(n n n s s s R s C ωξωω++= 式中,ξ为阻尼比;n ω为无阻尼自振频率。 所以,二阶系统的特征方程为:022=++n n s s ωξω 由上式解得二阶系统的二个特征根(即闭环极点)为:2 2.11ξωξω-±-=n n j s 随着阻尼比ξ取值的不同,二阶系统的特征根(即闭环极点)也不相同。 二、单位阶跃函数作用下二阶系统的过渡过程(针对欠阻尼状态,10<<ξ ) 令)(1)(t t r =,则有s s R 1 )(= ,二阶系统在单位阶跃函数作用下输出信号的拉氏变换为:2 2222 22)()(1 ) )((211 2)(d n d d n d n n d n d n n n n n s s s s j s j s s s s s s s C ωξωωωξωωξωξωωξωωξωξωωξωω++? -+++-=-++++- =?++= 式中,2 1ξωω-=n d 为有阻尼自振频率 对上式进行反拉氏变换,得: ) sin(11) sin 1(cos 1sin cos 1)(2 2 ?ωξ ωξ ξ ωωωξωωξωξωξωξω+-- =-+-=?- -=----t e t t e t e t e t c d t d d t d t d n d t n n n n 式中,ξ ξ?2 1-=arctg 由上式看出,对应10<<ξ时的过渡过程,)(t c 为衰减的正弦振荡曲线。其衰减速度取决 ?角的定义

于n ξω值的大小,其衰减振荡的频率便是有阻尼自振频率d ω,即衰减振荡的周期为: 2 122ξ ωπ ωπ -= = n d d T 三、二阶系统的性能指标 1.上升时间tr :上升时间是响应曲线由零上升到稳态值所需要的时间。 根据定义,当r t t =时,1)(=r t c 。 即 0sin 1cos 2 =-+ r d r d t t ωξ ξ ω 或 n n r d t tg ξωξωω2 1-=,)(?πω-=tg t tg r d 所以,上升时间为:2 1ξ ω?π--= n r t 2.峰值时间tp :过渡过程曲线达到第一个峰值所需的时间。 ??ωtg t tg dt t dc p d t t p =+?==)(0) ( ( ,3,2,,0πππω=p d t ) 由于峰值时间tp 是过渡过程曲线达到第一个峰值所需的时间,故取πω=p d t 即 21ξ ωπωπ-= = n d p t 3.最大超调量p σ 最大超调量为:%100) ()()(?∞∞-= c c t c p p σ % 100% 100)sin 1(cos % 100)sin 1(cos 2 12 2 ?=??-+ -=?-+-=-- --ξξπ ξωξωσπξξ πωξ ξ ωe e t t e p t p d p d t p n p n 式中,)(p t c 为过渡过程曲线第一次达到的最大输出值;)(∞c 为过渡过程的稳态值()(∞c =1)。

函数调用参数传递类型(java)的用法介绍.

函数调用参数传递类型(java)的用法介绍. java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ;

TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 {

总结Java方法(函数)传值和传引用的问题

总结Java方法(函数)传值和传引用的问题 java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清。 (一)基本数据类型:传值,方法不会改变实参的值。 public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 。 (二)对象类型参数:传引用,方法体内改变形参引用,不会改变实参的引用,但有可能改变实参对象的属性值。 举两个例子: (1)方法体内改变形参引用,但不会改变实参引用,实参值不变。 public class TestFun2 { public static void testStr(String str){ str="hello";//型参指向字符串“hello” } public static void main(String[] args) { String s="1" ;

TestFun2.testStr(s); System.out.println("s="+s); //实参s引用没变,值也不变 } } 执行结果打印:s=1 (2)方法体内,通过引用改变了实际参数对象的内容,注意是“内容”,引用还是不变的。 import java.util.HashMap; import java.util.Map; public class TestFun3 { public static void testMap(Map map){ map.put("key2","value2");//通过引用,改变了实参的内容 } public static void main(String[] args) { Map map = new HashMap(); map.put("key1", "value1"); new TestFun3().testMap(map); System.out.println("map size:"+map.size()); //map内容变化了 } } 执行结果,打印:map size:2 。可见在方法testMap()内改变了实参的内容。 (3)第二个例子是拿map举例的,还有经常涉及的是 StringBuffer : public class TestFun4 {

C语言函数参数传递(非常重要)

一、三道考题 开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: void Exchg1(int x, int y) { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x = ____, y=____. a = ____, b=____. 问下划线的部分应是什么,请完成。 考题二,程序代码如下: void Exchg2(int *px, int *py) { int tmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py); } main() { int a = 4; int b = 6; Exchg2(&a, &b); printf("a = %d, b = %d.\n", a, b); return(0); } 输出的结果为为: *px=____, *py=____.

a=____, b=____. 问下划线的部分应是什么,请完成。 考题三,程序代码如下: void Exchg3(int &x, int &y) { int tmp = x; x = y; y = tmp; printf("x = %d,y = %d\n", x, y); } main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x=____, y=____. a=____, b=____. 问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/ { int tmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d.\n", x, y); }

c语言值传递的3种形式

//全部摘自别的博客,以前对值传递很迷糊,看完豁然开朗,整理下,来百度文库赚点分。 一、三道考题 开讲之前,我先请你做三道题目。(嘿嘿,得先把你的头脑搞昏才行……唉呀,谁扔我鸡蛋?) 考题一,程序代码如下: void Exchg1(int x, int y) { inttmp; tmp = x; x = y; y = tmp; printf("x = %d, y = %d\n", x, y); } main() { int a = 4,b = 6; Exchg1(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x = ____, y=____. a = ____, b=____. 问下划线的部分应是什么,请完成。 考题二,程序代码如下: void Exchg2(int *px, int *py) { inttmp = *px; *px = *py; *py = tmp; printf("*px = %d, *py = %d.\n", *px, *py); } main() { int a = 4; int b = 6; Exchg2(&a, &b);

printf("a = %d, b = %d.\n", a, b); return(0); } 输出的结果为为: *px=____, *py=____. a=____, b=____. 问下划线的部分应是什么,请完成。 考题三,程序代码如下: void Exchg3(int&x, int&y) { inttmp = x; x = y; y = tmp; printf("x = %d,y = %d\n", x, y); } main() { int a = 4; int b = 6; Exchg3(a, b); printf("a = %d, b = %d\n", a, b); return(0); } 输出的结果为: x=____, y=____. a=____, b=____. 问下划线的部分应是什么,请完成。你不在机子上试,能作出来吗?你对你写出的答案有多大的把握?正确的答案,想知道吗?(呵呵,让我慢慢地告诉你吧!) 好,废话少说,继续我们的探索之旅了。 我们都知道:C语言中函数参数的传递有:值传递、地址传递、引用传递这三种形式。题一为值传递,题二为地址传递,题三为引用传递。不过,正是这几种参数传递的形式,曾把我给搞得晕头转向。我相信也有很多人与我有同感吧? 下面请让我逐个地谈谈这三种传递形式。 二、函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看考题一中Exchg1函数的定义: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数*/ {

C语言中参数传递

二.参数传递 函数的形参的初始化和变量的初始化一样,如果形参具有非引用类型,则复制实参的值,如果形参为引用类型,则它是实参的别名。 1.非引用实参 普通的非引用类型的函数通过复制对应的实参实现初始化。当用实参副本初始化形参时,函数并没有调用所传递的实参本身,因此不会修改实参的值。 注解:非引用形参表示对应实参的局部副本,对这类行参的修改仅仅改变了局部副本的值,一旦函数执行结束,这些局部变量的值也就没有了。 a. 指针形参 指针形参与其他非引用类型的行参一样,如果将新指针赋给行参,主调函数使用的实参指针的值没有改变。事实上被复制的指针只影响对指针的赋值。指针形参是const类型还是非const类型,将影响函数调用所使用的实参。 b. const行参 在调用函数时,如果该函数使用非引用的非const形参,则既给该函数传递const实参也可传递非const的实参(因为改变形参不影响const的实参,所以const实参不会被改变)。如果将形参定义为非引用的const类型,则在函数中,不可以改变实参的局部副本,由于实参是以副本的形式传递,因此传递给函数形参既可是const也可是非const对象。 注意:尽管函数的形参是const,但是编译器却将该行参声明视为普通的int型。 void fcn(const int i); void fcn(int i); 为了兼顾C语言,认为这两种定义并不区别。 c. 复制实参的局限性 不适合复制实参的情况包括: 当需要在函数中修改实参的值时 当需要以大型对象作为实参传递时,对实际的应用而言,复制对象所付出的时间和存储空间代价往往很大。 但没有办法实习对象的复制时 对于以上几种情况,有效的办法是将形参定义为引用或指针。 2.引用实参 与所有引用一样,引用形参直接关联到其所绑定的对象,而并非这些对象的副本。定义引

C语言入门教程10(函数参数的传递和值的返回)

前面我们说的都是无参数无返回值的函数,实际程序中,我们经常使用到带参数有返回值的函数。 一、函数参数传递 1.形式参数和实际参数 函数的调用值把一些表达式作为参数传递给函数。函数定义中的参数是形式参数,函数的调用者提供给函数的参数叫实际参数。在函数调用之前,实际参数的值将被拷贝到这些形式参数中。 2.参数传递 先看一个例子: void a(int); /*注意函数声明的形式*/ main() { int num; scanf(%d,&num); a(num); /*注意调用形式*/ } void a(int num_back) /*注意定义形式*/ { printf(%d\n,num_back); } 在主函数中,先定义一个变量,然后输入一个值,在a()这个函数中输出。当程序运行a(num);这一步时,把num的值赋值给num_back,在运行程序过程中,把实际参数的值传给形式参数,这就是函数参数的传递。 形参和实参可能不只一个,如果多于一个时,函数声明、调用、定义的形式都要一一对应,不仅个数要对应,参数的数据类型也要对应。 void a(int,float); main() { int num1; float num2; scanf(%d,&num1); scanf(%f,&num2); a(num1,num2); } void a(int num1_back,float num2_back) { printf(%d,%f\n,num1_back,num2_back);

} 上面的例子中,函数有两个参数,一个是整型,一个是浮点型,那么在声明、调用、定义的时候,不仅个数要一样,类型也要对应。如果不对应,有可能使的编译错误,即使没错误,也有可能让数据传递过程中出现错误。 再看一个例子: void a(int); main() { int num; scanf(%d,&num); a(num); } void a(int num) { printf(%d\n,num); } 看上面的例子,形式参数和实际参数的标识符都是num,程序把实际参数num的值传递给形式参数num。有些人可能就不明白了,既然两个都是num,为什么还要传递呢?干脆这样不就行了吗: void a(); main() { int num; scanf(%d,&num); a(); } void a() { printf(%d\n,num); } 其实不然,这就要涉及到标识符作用域的问题。作用域的意思就是说,哪些变量在哪些范围内有效。一个标识符在一个语句块中声明,那么这个标识符仅在当前和更低的语句块中可见,在函数外部的其实地方不可见,其他地方同名的标识符不受影响,后面我们会系统讲解作用域的问题。在这儿你就要知道两个同名的变量在不同的函数中是互不干扰的。

c语言函数调用三种方式传值调用,引用调用和传地址调

C语言函数调用三种方式传值调用,引用调用和传地址调 我想,你只要看了C语言上关于传值函数调用的测试题,一切都会了然于胸:1. 考题一:程序代码如下: void Exchg1(int x, int y) { int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } void main() { int a=4,b=6; Exchg1 (a,b) ; printf(“a=%d,b=%d\n”,a,b) } 输出的结果: x=____, y=____ a=____, b=____ 问下划线的部分应是什么,请完成。 2. 考题二:代码如下。 Exchg2(int *px, int *py) { int tmp=*px; *px=*py; *py=tmp; print(“*px=%d,*py=%d\n”,*px,*py); } main() { int a=4; int b=6; Exchg2(&a,&b); Print(“a=%d,b=%d\n”, a, b); }

输出的结果为: *px=____, *py=____ a=____, b=____ 问下划线的部分应是什么,请完成。 3. 考题三: Exchg2(int &x, int &y) { int tmp=x; x=y; y=tmp; print(“x=%d,y=%d\n”,x,y); } main() { int a=4; int b=6; Exchg2(a,b); Print(“a=%d,b=%d\n”, a, b); } 二.函数参数传递方式之一:值传递 1.值传递的一个错误认识 先看题一中Exchg1函数的定义: void Exchg1(int x, int y) //定义中的x,y变量被称为Exchg1函数的形式参数{ int tmp; tmp=x; x=y; y=tmp; printf(“x=%d,y=%d\n”,x,y) } 问:你认为这个函数是在做什么呀 答:好像是对参数x,y的值对调吧 请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下:void main() {

二阶系统的传递函数

系统闭环传递函数标准形式: 取ζ分别取0,0.1,0.5,0.707,1,3,7进行matlab分析 Matlab代码: >> zeta1=0;num1=[4];den1=[4 0 4]; >> sys1=tf(num1,den1); %建立ζ=0时闭环传递函数模型>> p1=roots(den1) %计算系统特征根判断系统稳定性 p1 = 0 + 1.0000i 0 - 1.0000i >> t=0:0.05:10; %设定仿真时间为10s >> y1=step(sys1,t); %求取ζ=0时系统的单位阶跃响应>> zeta2=0.1;num2=[4];den2=[1 0.4 4]; >> sys2=tf(num2,den2); %建立ζ=0.1时闭环传递函数模型>> p2=roots(den2) p2 = -0.2000 + 1.9900i -0.2000 - 1.9900i >> y2=step(sys2,t); %求取ζ=0.1时系统的单位阶跃响应>> zeta3=0.5;num3=[4];den3=[1 2 4]; >> sys3=tf(num3,den3); %建立ζ=0.5时闭环传递函数模型

>> p3=roots(den3) p3 = -1.0000 + 1.7321i -1.0000 - 1.7321i >> y3=step(sys3,t); %求取ζ=0.5时系统的单位阶跃响应>> zeta4=0.707;num4=[4];den4=[1 2.828 4]; >> sys4=tf(num4,den4); %建立ζ=0.707时闭环传递函数模型>> p4=roots(den4) p4 = -1.4140 + 1.4144i -1.4140 - 1.4144i >> y4=step(sys4,t); %求取ζ=0.707时系统的单位阶跃响应 >> zeta5=1;num5=[4];den5=[1 4 4]; >> sys5=tf(num5,den5); %建立ζ=1时闭环传递函数模型>> p5=roots(den5) p5 = -2 -2 >> y5=step(sys5,t); %求取ζ=1时系统的单位阶跃响

自控-二阶系统Matlab仿真

自动控制原理 二阶系统性能分析Matlab 仿真大作业附题目+ 完整报告内容

设二阶控制系统如图1所示,其中开环传递函数 ) 1(10 )2()(2+=+=s s s s s G n n ξωω 图1 图2 图3 要求: 1、分别用如图2和图3所示的测速反馈控制和比例微分控制两种方式改善系统的性能,如果要求改善后系统的阻尼比ξ =0.707,则和 分别取多少? 解: 由)1(10 )2()(2 += +=s s s s s G n n ξωω得10 21,10,102===ξωωn t K d T

对于测速反馈控制,其开环传递函数为:) 2()s (2 2n t n n K s s G ωξωω++=; 闭环传递函数为:2 2 2)2 (2)(n n n t n s K s s ωωωξωφ+++= ; 所以当n t K ωξ2 1+=0.707时,347.02)707.0(t =÷?-=n K ωξ; 对于比例微分控制,其开环传递函数为:)2()1()(2 n n d s s s T s G ξωω++=; 闭环传递函数为:) )2 1(2)1()(2 22 n n n d n d s T s s T s ωωωξωφ++++=; 所以当n d T ωξ2 1 +=0.707时,347.02)707.0(=÷?-=n d T ωξ; 2、请用MATLAB 分别画出第1小题中的3个系统对单位阶跃输入的响应图; 解: ①图一的闭环传递函数为: 2 22 2)(n n n s s s ωξωωφ++=,10 21 ,10n ==ξω Matlab 代码如下: clc clear wn=sqrt(10); zeta=1/(2*sqrt(10)); t=0:0.1:12; Gs=tf(wn^2,[1,2*zeta*wn,wn^2]); step(Gs,t)

深入了解C语言(函数的参数传递和函数使用参数的方法)

深入了解C语言(函数的参数传递和函数使用参数的方法) C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了. 本文通过一个个实际案例程序来讲解C语言. 研究案例一 工具: Turboc C v2.0,Debug,MASM v5.0,NASM 实例C程序: /* example1.c */ char ch; int e_main() { e_putchar(ch); } 目标内容:C语言调用函数的方法与细节 我们使用的C编译器是16位的Turboc C v2.0,它生成的是16位的代码,比较简单,方便我们来研究.同时我们也需要用到DOS下的DEBUG来进行反汇编.由于我们很多案例中的程序并不是完整的C程序,所以Turboc下的Tlink并不能为我们生成目标程序,所以我将使用MASM 中的link.exe,同时里面的https://www.wendangku.net/doc/2d6440772.html,也可以为我们把exe文件转换成bin文件. 这个程序没有main函数,我们用e_main来代替main函数.这样我们能避开C语言对main函数进行一系列处理的代码.同样,我们也用e_putchar()来代替我们平常使用的putchar().这里"e"的意思就是"example". 没有了main函数,我们的C程序就没有了入口,所以在开始编译这段C代码之前,我还得写几行简单的汇编代码,通过它来作为我们程序的入口. ; C程序的入口start.asm [BITS 16] [global start] [extern _e_main] start: call _e_main 按照C语言的习惯,所以C总的名词都要自动在前面加一个"_"下划线.所以,我们在C中的e_main函数,如果要在汇编中调用,就变成了_e_main函数.这段汇编代码只有一句:call _e_main,就是调用我们在C中的e_main函数

C++语言中函数参数传递方式的图示说明

C++语言中函数参数传递方式的图示说明 摘要:学习C++语言中函数参数传递方式的关键是给出函数调用过程中内存各段内容的变化图示。本文针对C++语言中三种函数参数传递方式,辅以代码段内容图示和堆栈段内容图示,从机理上详细解释了函数参数的传递过程。实践表明,这种图示说明的方法在教学中取得了非常良好的效果。 关键词:函数调用;参数传递;代码段;堆栈段 1背景 “C++程序设计”是高等学校计算机专业或非计算机专业学生的必修课。对于非计算机专业的学生,C++语言是他们真正学习和使用计算机语言进行编程的关键入门,对于以后在其专业应用开发中具有至关重要的作用。即使以后使用其他编程语言进行专业项目的开发,如VB、C和Java语言,C++语言由于其概念的广泛性和综合性,也能够使得他们很快学习并掌握这些编程语言。而对于计算机专业的学生来说,“C++程序设计”是“数据结构”、“算法设计”等核心课程的先修课,同时,“C++程序设计”中涉及的部分硬件知识也是其学习计算机原理的重要基础。 但是,C++作为入门程序语言课程,对于初学者来说确实难度较大。周立章对自己的教学实践进行总结,强调分层教学、案例教学和对计算机实验进行改革的思想[1];李新霞在C++的前驱语言C语言的教学实践中也表达了类似的思想[2]。因此,案例教学对C++语言来说是必不可少的。 对于大多数学生来说,C++程序设计学习中存在三个难点:(1)函数参数的传递;(2)指针变量的使用;(3)虚函数和多态性机制。 函数和类作为C++语言中的两种基本模块,分别支持C++语言进行面向过程的开发和面向对象的开发,而不论是何种开发方法,函数都是不可缺少的。一个完整的函数使用过程包括函数定义和函数调用,有时存在函数声明,而函数调用过程中,在主调函数和被调函数之间发生着数据的交互,表现为函数参数的传递和被调函数的返回值。 其中,对于函数参数传递方式及相关教学研究,得到了很多关注。马新将函数参数传递方式分为值传递方式和地址传递方式,并归纳总结了选用何种方式的条件[3];刘志华将函数参数传递方式分为简单变量作参数、指针作参数、引用作参数、数组作参数和字符串作参数共五种方式,并对每一种情况进行了实例描述[4];谭庆将函数参数传递方式分为传普通值调用、传地址值调用和引用调用三种方式,并对其使用方法进行了总结[5];王萍、谭浩强和陈志泊在其编写的相应教材中也对C++中函数参数传递方式给予了重点关注[6-8]。 本文就函数参数的传递方式,利用图示说明的方法进行研究,旨在搞清各种函数参数传递方式的本质,为函数的学习奠定坚实的基础。

指针与参数传递

指针与参数传递 摘要指针是C语言的精髓之一,也是学习的难点;函数参数是传递信息的重要接口。本文从指针作函数参数的角度,来阐明参数传递的方式和指针的本质,为C语言的学习和应用提供参考。 关键词C语言;指针;参数 C语言规定所有参数均以“传值”的方式进行传递,被调函数获得的仅是实际参数的拷贝(这个拷贝值赋给形式参数)。因为这个特性,函数可以放心使用这个拷贝值,而不必担心修改了实际参数的值。 如果我们需要通过函数调用来改变程序中某些变量(本文只涉及自动型变量)的值,通常有2个方法:一是将函数的返回值赋给该变量;二是利用函数参数,用该变量的地址(即指针)作为实际参数,通过指针来间接访问该变量。本文讨论的是第二种方法。 程序1、2是在很多C教材中会见到的经典的例子,程序试图交换a、b两个变量的值。 程序1中的swap1函数并不能交换实际参数a、b的值。函数调用仅仅将a、b的值传递给了形式参数x、y。形参与实参占用的是不同的内存空间,swap1只是交换了形式参数x、y的值,对a、b没有任何影响。 程序2中,函数swap2的两个形参是整型指针,函数调用时实际参数为a、b 的地址,这两个地址将拷贝给形参x、y,这意味着x、y是分别指向变量a、b的指针,对*x、*y的引用就是对a、b的引用,因此,函数swap2能成功交换主调函数中变量a、b的值。 很多初学者认为只要将参数改为指针就可以解决一切类似问题,其实不然。注意下面2个程序区别: 程序的意图是:在主函数中定义整型指针mp,通过调用fun函数使mp指向malloc函数申请的能存储一个整型数据的空间,最后利用mp间接访问该空间,将整型数据1存入。 程序3是错误的,如图1所示,mp和形式参数fp都是指针变量,会分配到内存空间,mp定义了却没有初始化,它的存储内容是随机的(图中用“?”表示),调用fun 函数仅仅将mp的值(即这个随机值)赋给fp,但fp的值立刻被malloc函数修改为208(假设malloc函数申请空间成功且对应内存首地址为208)。可见fun函数并未对mp产生影响,mp仍然是随机值,它指向的是一块未知空间或者非法地址。若将程序在windows环境下的PC上运行,通过指针mp对未知空间的间接访问操作(语句“*mp=1”)会导致程序异常。

vb过程间参数的传递

一、形式参数与实际参数 1 形式参数:就是在定义函数或过程的时候命名的参数。通俗讲就是一个记号。 2 实际参数:就是在执行时,调用函数或过程时,传递给函数或过程的参数。通俗讲就是实际值。 3 参数嘛,就是一个可变量,它随着使用者的不同而发生变化。举个例子,在中学的时候学过sin(x)函数,这里的x就是形式参数,当你需要求1的正弦值时,你会使用sin(1),这里的1就是实际参数。 4 形参和实参间的关系:两者是在调用的时候进行结合的,通常实参会将取值传递给形参,形参去之后进行函数过程运算,然后可能将某些值经过参数或函数符号返回给调用者。 在过程之间传递参数,形式参数和实际参数是很重要的概念。我们通常说形式参数是过程为了运行的需要预先在内存中保留的地址单元,而实际参数就是在调用过程时放入这些内存地址中进行处理的数据。如果形式参数是一个盒子,那么实际参数就是盒子里面装的东西。在参数传递的过程中,形式参数和实际参数的数据类型要一致。 二、参数传递 函数参数的传递方式有两种,一种是按地址传递,一种是按值传递。 按地址传递:调用函数时,不直接把实参的值“告诉”函数,而是把地址“告诉”它,函数根据这个地址来寻找并处理值,如果函数修改了这个值,也就修改了这个地址对应的值。 按值传递:把值复制一份再给函数,这个值只属于函数,函数对这个值的修改不影响原值。 VBScript中,要按地址传递可在形参前加 ByRef,要按值传递得在形参前加 ByVal,如果什么也不加则表示按地址传递。 1)按值传递

如果在声明过程时,形式参数名前面加上关键字“ByVal”,即规定了在调用此过程时该参数是按值传递的。按值传递参数时,传递的只是变量的副本。如果过程改变了这个值,则所做的改动只影响副本而不会影响变量本身。 代码1 ********************************** Private Sub Command1_Click() Dim num1 As Integer num1 = 5 Print num1 Call MySub(num1) Print num1 ' 输出结果为5 Call MySub2(num1) Print num1 ' 输出结果仍为5 End Sub Private Sub MySub(ByVal A As Integer) A = 10 End Sub Private Sub MySub2(ByVal A As String)

arm汇编语言调用C函数之参数传递

arm汇编语言调用C函数之参数传递 于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS 主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books ——Developer Guide的2.1节。这篇文档要讲的是汇编代码中对C函数调用时如何进行参数的传递以及如何从C函数正确返回。 不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。 我们先讨论一下形参个数为4的情况. 实例1: test_asm_args.asm //-------------------------------------------------------------------------------- IMPORT test_c_args ;声明test_c_args函数 AREA TEST_ASM, CODE, READONLY EXPORT test_asm_args test_asm_args STR lr, [sp, #-4]! ;保存当前lr ldr r0,=0x10 ;参数 1 ldr r1,=0x20 ;参数 2

ldr r2,=0x30 ;参数 3 ldr r3,=0x40 ;参数 4 bl test_c_args ;调用C函数 LDR pc, [sp], #4 ;将lr装进pc(返回main函数) END test_c_args.c //-------------------------------------------------------------------------------- void test_c_args(int a,int b,int c,int d) { printk("test_c_args:\n"); printk("%0x %0x %0x %0x\n",a,b,c,d); } main.c //-------------------------------------------------------------------------------- int main() { test_asm_args(); for(;;); } 程序从main函数开始执行,main调用了test_asm_args,test_asm_args 调用了test_c_args,最后从test_asm_args返回main。代码分别使用了

相关文档
相关文档 最新文档