文档库 最新最全的文档下载
当前位置:文档库 › 线性表实验报告

线性表实验报告

线性表实验报告
线性表实验报告

2011-2012学年第一学期

数据结构课内实验报告

学院:计算机学院

专业:计算机科学与技术姓名:xxx

学号:xxxxxxxxx

指导老师:xxx

实验题目

1、实验目的

掌握线性表的各种基本运算和操作,熟悉线性表的结构,达到熟练运用的目的。

2、实验内容

A用线性表实现两个链表按某种规则的合并问题;

B:用线性表实现约瑟夫环问题;

C:用线性表实现一元多项式的加减运算问题;

3、数据结构及算法思想

A:用带头结点的链表存储数据并实现链表数据的排序输出。具体是比较两个A,B链表的长度,A短的输出abab....如果B短的输出bababa....

B:声明一个Node类型的不带头结点的单向循环链表,从键盘中输入n个人的密码,建立约瑟夫环,设定报数上限和初始的密码m,然后计数并删除第m个结点,更新m的数值,使用for循环重复上述的步骤,直到链表为空。

C:声明两个带头结点的链表,从键盘中输入各项的系数和指数,采用尾插法存进数据,然后实现两个链表中的数据能实现加减法,在

实行加法的时候,比较两个链表中的系数和指数是否相等,如果系数和指数相等则进行加法,在实行减法的时候主要将进行加法时要将数据copy到一个链表上,易于在减法进行时键盘输入数据不会改变然后对应的两个链表系数和指数相等时进行减法运算

4、模块化分

1:链表的合并

a:创建带头结点的链表

b:合并链表

c:输出合并后的结果

2:约瑟夫环

a创建循环单链表

b:在链表中输入数据

c:使用算法将按规则的人跳出来

d:打印出出列的序号

3:一元多项式的加减法

a:创建链表

b:将链表中的数据进行复制确保减法时数据不变

c:进行加减法的运算

d:打印出加减法的算式

5、详细设计及运行结果A:两个链表的合并(如下)

Linklist create(int m)

printf("请输入LA的长度\n\n");

scanf("%d",&m); LA=create(m);

printf("请输入LB的长度\n\n");

scanf("%d",&n);

merge(Linklist LA,Linklist LB,int m,int n)/

if(a

r->next=pa; r=pa; pa=pa->next;

a++ ; r->next=pb; r=pb; pb=pb->next;b++;

while(p->next!=NULL)

printf("%d ",p->next->data);p=p->next; printf("\n");

程序结束

B:约瑟夫环(如下):

Main函数//ElemType num; ElemType secret; struct node *next;

InitList(LinkList *L)

(*L)=(LinkList)malloc(sizeof(Node));

(*L)->next=*L;

Creat(LinkList L) Node *p,*s; int i,n;p=L;

printf("input n:"); scanf("%d",&n);

for(i=0;i

scanf("%d,%d",&s->num,&s->secret);

Output (LinkList L)//输出每个人的位置号和对应的密码while(p!=L)//L不为空

{

printf("%2d,%2d",p->num,p->secret);

printf("\n");

p=p->next;//指针后移

}

Y uesefu(LinkList L) Node *r,*s ;int m,t,n;

r=L->next;

while(1) else

if(r==L)

r=r->next;//循环链表

if(t!=m)//如果t!=m,指针后移

{

s=r;

r=r->next;

t++;

printf("the sequences is: %3d\n",r->num);

m=r->secret;//报m的人出列,将其的密码作为新的m值。

s->next=r->next; //删除报m的人

free(r);

t=1;//重新从1开始报数

n--;//人数减1.

r=s->next;

If(n==1)

printf("the sequences is: %3d\n",r->num); C:一元多项式的加减(如下)

int coef;//系数int exp;//指数Polylist polya; Polylist polyb; Polylist polyc,polyd;

Polylist polya_1,polyb_1;

polya= polycreat();

polyb= polycreat();

Polylist polycreat()

if(head->next=NULL) else

printf("申请空间失败,请重新申请空间!!\n"); rear= head;

printf("\n请输入第%d个多项式每项的系数,指数并且以0结束!!!\n\n",number); number++;

scanf("%d,%d",&c,&e);

while(c!= 0) else

q->coef= c;

q->exp= e;

rear->next= q;

rear=q;

scanf("%d,%d",&c,&e);

return 0;

rear->next= NULL; return(head);

Polylist copy(Polylist Poly)

Polynode *head, *rear, *q, *p;

while(p) else

q->coef= p->coef;

q->exp= p->exp;

rear->next=q;

rear= q;

p= p->next;

return 0;

rear->next= NULL; return head;

}

Polylist polyadd(Polylist polya,Polylist polyb)

Polynode *p, *q, *tail,*temp;

Polynode *c;

int sum;

p= polya->next;

q= polyb->next

while(p != NULL &&

q != NULL)

else

if(p->exp <

q->exp)

else return 0;

tail->next= p;

tail= p;p= p->next; if(p->exp ==

q->exp)

else

sum= p->coef +

q->coef;

tail->next= q;

tail= q;

q= q->next;

if(sum != 0) else

p->coef= sum;

tail->next= p; tail= p;

p= p->next; temp= q;

q= q->next; free(temp);

temp= p; p= p->next; free(temp);

temp= q; q= q->next; free(temp);

}

if(p != NULL)//判断是否A

和B是否还有剩余的结点

else

tail->next = p; tail->next = q;

return c; Polylist poly_re(Polylist Poly)

Polynode *poly;

poly= Poly->next;

while(poly) else

poly->coef= poly->coef *

(-1);//将原有的系数乘以

-1,使之成为减法

poly= poly->next;

return 0;

return Poly;

print(Polylist poly)

Polynode *rear; rear=poly->next;

printf("R(x) = ");

while(rear) else

if(rear->coef

> 0)

else break;

printf("+ %d *x^%d ",rear->coef, rear->exp);

printf("- %d*x^%d ",-1 * rear->coef,rear->exp);

rear= rear->next;

程序结束!

6、调试情况,设计技巧及体会A:两个链表的合并(如下)

B:约瑟夫环(如下):

在设计程序上采用的是不带头结点的循环单链表,

并且使用尾插法,然后用for条件控制循环C:一元多项式的加减(如下)

输入各项的系数和指数。

输入后运行的结果

7、源程序清单(电子版)

//两个链表的合并

#include

#include

typedef struct Node

{ int data;

struct Node *next;

}Node,*Linklist;

Linklist create(int m)

{

Node *s,*r;

int i=1;

int a;

Linklist L;

L=(Linklist)malloc(sizeof(Node));

L->next=NULL;//清空链表

r=L;

while(i<=m)

{

scanf("%d",&a);

s=(Node*)malloc(sizeof(Node));

s->data=a;

r->next=s;

r=s;

i++;//把数据存放到链表中

}

r->next=NULL;

return L;

}

void merge(Linklist LA,Linklist LB,int m,int n)//合并链表{

Node *pa,*pb,*r,*p;

Linklist LC,LD;

int a=1;

int b=1;

if(m

{

LD=LA;

LA=LB;

LB=LD;

}//判断长度,将长得置后

pa=LA->next;

pb=LB->next;

LC=LA;

LC->next=NULL;//清空

r=LC; //将LC头指针赋给赋给r while(pa!=NULL&&pb!=NULL)

{

if(a

{

r->next=pa;

r=pa;

pa=pa->next;

a++;

}

else//否则将B先行存入LC

{

r->next=pb;

r=pb;

pb=pb->next;

b++;

}

}

r->next=pa;

p=LC;

while(p->next!=NULL)

{

printf("%d ",p->next->data);

p=p->next;

}

printf("\n");

}

main()

{

int m,n;

Linklist LA,LB;

printf("请输入LA的长度\n\n"); scanf("%d",&m); LA=create(m);

printf("请输入LB的长度\n\n"); scanf("%d",&n);

LB=create(n);

merge(LA,LB,m,n);

}

//约瑟夫环源代码

#include

#include

typedef int ElemT ype;

typedef struct node

{

ElemT ype num;

ElemT ype secret;

struct node *next;

}Node,*LinkList;

void InitList(LinkList *L)

(*L)=(LinkList)malloc(sizeof(Node));

(*L)->next=*L; //循环单链表

}

void Creat(LinkList L)

{

Node *p,*s;

int i,n;

p=L;//头指针赋给P

printf("input n:");

scanf("%d",&n);

for(i=0;i

{

printf("please input the %d\\%d num and secret:",i+1,n);

s=(Node *)malloc(sizeof(Node));

scanf("%d,%d",&s->num,&s->secret);

p->next=s;//尾插法

p=s;

}

p->next=L;//循环单链表的判别条件

}

void Output (LinkList L)//输出每个人的位置号和对应的密码

{

Node *p;

p=L->next;

printf("the num and secret is:\n");

while(p!=L)//L不为空

{

printf("%2d,%2d",p->num,p->secret);

printf("\n");

p=p->next;//指针后移

}

printf("\n\n");

}

void Yuesefu(LinkList L)

{

Node *r,*s;

int m,t,n;

r=L->next;

t=1;//从一开始报数

n=0;

printf("please input m:");

scanf("%d",&m);

while(r!=L) //遍历循环链表,得到结点个数n

{

n++;

r=r->next;

}

while(1)

{

if(r==L)

r=r->next;//循环链表

if(t!=m)//如果t!=m,指针后移

{

s=r;

r=r->next;

t++;

}

else

{

printf("the sequences is: %3d\n",r->num);

m=r->secret;//报m的人出列,将其的密码作为新的m值。

s->next=r->next; //删除报m的人

free(r);

t=1;//重新从1开始报数

n--;//人数减1.

r=s->next;

if(n==1)//剩下最后一个人的时候直接输出其顺序号

{

printf("the sequences is: %3d\n",r->num);

break;

}

}

}

}

void main()

{

LinkList L;

InitList(&L);

Creat(L);

Output(L);

Yuesefu(L);

}

//一元多项式的加减法

/*只写了加减法*/

#include

#include

typedef struct polynode

{

int coef;//系数

int exp;//指数

struct polynode *next;

}Polynode,*Polylist;

Polylist polycreat()

{

Polynode *head, *rear, *q;

static int number= 1;//使用静态变量类型

int c,e;

head= (Polynode *)malloc(sizeof(Polynode));

if(head->next=NULL)

{

printf("申请空间失败,请重新申请空间!!\n");

}

else

rear= head;

printf("\n请输入第%d个多项式每项的系数,指数并且以0结束!!!\n\n",number);

number++;

scanf("%d,%d",&c,&e);

while(c!= 0)

{

q= (Polynode *)malloc(sizeof(Polynode));

q->coef= c;

q->exp= e;

rear->next= q;

rear= q;

scanf("%d,%d",&c,&e);

}

rear->next= NULL; //采用尾插法,tail记录当前生成的和多项式的尾节点return(head);

}

Polylist copy(Polylist Poly)

{

Polynode *head, *rear, *q, *p;

p= Poly->next;

head= (Polynode *)malloc(sizeof(Polynode));

rear= head;

while(p)

{

q= (Polynode *)malloc(sizeof(Polynode));

q->coef= p->coef;

q->exp= p->exp;

rear->next=q;

rear= q;

p= p->next;

}

rear->next= NULL;

return head;

}

Polylist polyadd(Polylist polya,Polylist polyb)//将两个多项式相加,然后将和多项式存放在polya中,然后释放多项式polyb

{

Polynode *p, *q, *tail,*temp;

Polynode *c;

int sum;

p= polya->next;//令p和q分别指向polya和polyb多项式链表的第一个结点

q= polyb->next;

//tail->next= NULL;

tail=polya;//tail指向多项式的尾结点

c= tail;//初始化

while(p != NULL && q != NULL)//当两个多项式都没有被执行完

{

if(p->exp < q->exp)//p指向的多项式的指数小于q指数,将p结点加入到和多项式中

{

tail->next= p;

tail= p;

p= p->next;

}

else if(p->exp == q->exp)//指数相等的时候,两个指数相加

{

sum= p->coef + q->coef;

if(sum != 0)//若系数和不等于0的时候,将系数和植入结点p,释放q,将指针后移

{

p->coef= sum;

tail->next= p;

tail= p;

p= p->next;

temp= q;

q= q->next;

free(temp);

}

else//等于0则删除p和q,然后指针指向下一个结点

{

temp= p; p= p->next; free(temp);

temp= q; q= q->next; free(temp);

}

}

else//将q结点植入到和多项式

{

tail->next= q;

tail= q;

q= q->next;

}

}

if(p != NULL)//判断是否A和B是否还有剩余的结点

tail->next = p;

else

tail->next = q;

return c;

}

Polylist poly_re(Polylist Poly)

{

Polynode *poly;

poly= Poly->next;

while(poly)

{

poly->coef= poly->coef * (-1);//将原有的系数乘以-1,使之成为减法

poly= poly->next;

}

return Poly;

}

void print(Polylist poly)

{

Polynode *rear;

rear=poly->next;

printf("R(x) = ");

while(rear)

{

if(rear->coef > 0)

printf("+ %d*x^%d ",rear->coef,rear->exp);

else

printf("- %d*x^%d ",-1 * rear->coef,rear->exp);

rear= rear->next;

}

}

main()

{

Polylist polya;

Polylist polyb;

Polylist polyc,polyd;

Polylist polya_1,polyb_1;

polya= polycreat();

polyb= polycreat();

printf("\n多项式a: ");

print(polya);

printf("\n\n多项式b: ");

print(polyb);

polya_1= copy(polya);//将A和B copy到两个链表中保持原有的数据不变polyb_1= copy(polyb);

printf("\n\n两个多项式的和:");

polyc= polyadd(polya,polyb);

print(polyc);

polya= polya_1;

polyb= polyb_1;//将原来的值返回给poly,使其的值不变以做底下的运算

printf("\n\n两个多项式的差(A-B):");

polyd= polyadd(polya,poly_re(polyb));

print(polyd);

polya= polya_1;

polyb= polyb_1; }

大一上期C语言实验报告1熟悉实验环境

成都工业学院·计算机工程学院 《程序设计基础》实验报告 1.实验目的 (1)熟悉C语言运行环境,了解和使用Visual6.0++集成开发环境(2)熟悉Visual6.0++环境的功能键和常用的功能菜单命令 (3)掌握C语言程序的书写格式和C语言程序的结构 (4)掌握C语言上机步骤,以及编辑、编译和运行一个C语言程序的方法 (5)熟悉Visual6.0++环境下的程序调试方法 2.实验内容 (1)按照实验步骤编辑、编译、运行第一个”Hello World”程序(2)利用实验指导中的第二个程序熟悉调试工具,在已知x,y值的情况下,计算出x和y的和、差、积、商,并显示出来(3)编写一个程序,输入a、b、c三个值,输出它们的和与平均值c 3.源程序 (1)#include void main() {printf(”Hello World”);} (2)#include void main() {int x=5,y=2; int s,d,p,q; s=x+y; d=x-y; p=x*y; q=x/y; printf(“和:%d差:%d积%d商:%d“,s,d,p,q);}

(3)#include void main() {int a,b,c.sum; float ave; Printf(“Please enter the a,b,c:”); scanf(“%d%d%d”,&a,&b,&c); sum=a+b+c; ave=(float)sum/3; printf(“sum=%d,ave=%f\n”,sum,ave);} 4.运行结果 (1) (2) (3)输入18、46、69测试得出答案如下

线性系统理论Matlab实践仿真报告

线性系统理论Matlab实验报告 1、本题目是在已知状态空间描述的情况下要求设计一个状态反馈控制器,从而使得系统具 有实数特征根,并要求要有一个根的模值要大于5,而特征根是正数是系统不稳定,这样的设计是无意义的,故而不妨设采用状态反馈后的两个期望特征根为-7,-9,这样满足题目中所需的要求。 (1)要对系统进行状态反馈的设计首先要判断其是否能控,即求出该系统的能控性判别矩阵,然后判断其秩,从而得出其是否可控; 判断能控程序设计如下: >> A=[-0.8 0.02;-0.02 0]; B=[0.05 1;0.001 0]; Qc=ctrb(A,B) Qc = 0.0500 1.0000 -0.0400 -0.8000 0.0010 0 -0.0010 -0.0200 Rc=rank(Qc) Rc =2 Qc = 0.0500 1.0000 -0.0400 -0.8000 0.0010 0 -0.0010 -0.0200 得出结果能控型判别矩阵的秩为2,故而该系统是完全可控的,故可以对其进行状态反馈设计。 (2)求取状态反馈器中的K,设的期望特征根为-7,-9; 其设计程序如下: >> A=[-0.8 0.02;-0.02 0]; B=[0.05 1;0.001 0]; P=[-7 -9]; k=place(A,B,P) k = 1.0e+003 * -0.0200 9.0000 0.0072 -0.4500 程序中所求出的k即为所求状态反馈控制器的状态反馈矩阵,即由该状态反馈矩阵所构成的状态反馈控制器能够满足题目要求。 2、(a)要求求该系统的能控型矩阵,并验证该系统是不能控的。

线性表实验报告

线性表实验报告 一、实验的目的要求 1、了解线性表的逻辑结构特性,以及这种结构特性在计算机内的两种存储结构。 2、掌握线性表的顺序存储结构的定义及其C语言实现。 3、掌握线性表的链式存储结构——单链表的定义及其C语言实现。 4、掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5、掌握线性表在链式存储结构——单链表中的各种基本操作。 6、认真阅读和掌握实验的程序。 7、上机运行本程序。 8、保存和打印出程序的运行结果,并结合程序进行分析。 二、实验的主要内容 题目:请编制C语言,利用链式存储方式来实现线性表的创建、插入、删除和查找等操作。 具体地说,就是要根据键盘输入的数据建立一个单链表,并输出该单链表;然后根据屏幕 菜单的选择,可以进行数据的插入或删除,并在插入或删除数据后,再输出单链表;最后 在屏幕菜单中选择0,即可结束程序的运行。 三、解题思路分析 在链表中插入数据,不需要进行大量的数据移动,只需要找到插入点即可,可以采用后插入的算法,在插入点的后面添加结点。在链表中删除数据,先找到删除点,然后进行指针赋值操作。 四、程序清单 #include #include #include typedef int ElemType; typedef struct LNode {ElemType data; struct LNode *next; }LNode;

LNode *L; LNode *creat_L(); void out_L(LNode *L); void insert_L(LNode *L,int i,ElemType e); ElemType delete_L(LNode *L,ElemType e); int locat_L(LNode *L,ElemType e); void main() {int i,k,loc; ElemType e,x; char ch; do{printf("\n"); printf("\n 1.建立单链表"); printf("\n 2.插入元素"); printf("\n 3.删除元素"); printf("\n 4.查找元素"); printf("\n 0.结束程序运行"); printf("\n================================"); printf("\n 请输入您的选择(1,2,3,4,0)"); scanf("%d",&k); switch(k) {case 1:{L=creat_L(); out_L(L); }break; case 2:{printf("\n请输入插入位置:"); scanf("%d",&i); printf("\n请输入要插入元素的值:");

C语言实验报告参考答案 原

C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.编写程序: (1) a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 (2)a=160,b=46,c=18,d=170, 编写求(a+b)/(b-c)*(c-d)的程序。 答案: (1) #include main() {

int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } (2) #include main() { int a,b,c,d; float x; a=160; b=46; c=18;

d=170; x=(a+b)/(b-c)*(c-d); printf("(a+b)/(b-c)*(c-d)=%f\n",x); } 3. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b 时,将0赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 2、(1) 编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7

C语言数据结构线性表的基本操作实验报告

实验一线性表的基本操作 一、实验目的与基本要求 1.掌握数据结构中的一些基本概念。数据、数据项、数据元素、数据类型和数据结构,以及它们之间的关系。 2.了解数据的逻辑结构和数据的存储结构之间的区别与联系;数据的运算与数据的逻辑结构的关系。 3.掌握顺序表和链表的基本操作:插入、删除、查找以及表的合并等运算。4.掌握运用C语言上机调试线性表的基本方法。 二、实验条件 1.硬件:一台微机 2.软件:操作系统和C语言系统 三、实验方法 确定存储结构后,上机调试实现线性表的基本运算。 四、实验内容 1.建立顺序表,基本操作包括:初始化,建立一个顺序存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 2.建立单链表,基本操作包括:初始化,建立一个链式存储的链表,输出顺序表,判断是否为空,取表中第i个元素,定位函数(返回第一个与x相等的元素位置),插入,删除。 3.假设有两个按数据元素值非递减有序排列的线性表A和B,均以顺序表作为存储结构。编写算法将A表和B表归并成一个按元素值非递增有序(允许值相同)排列的线性表C。(可以利用将B中元素插入A中,或新建C表)4.假设有两个按数据元素值非递减有序排列的线性表A和B,均以单链表作为存储结构。编写算法将A表和B表归并成一个按元素值递减有序(即非递增有序,允许值相同)排列的线性表C。 五、附源程序及算法程序流程图 1.源程序 (1)源程序(实验要求1和3) #include #include #include #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct arr {

全维状态观测器的设计

实 验 报 告 课程 线性系统理论基础 实验日期 2016年 6月 6 日 专业班级 姓名 学号 同组人 实验名称全维状态观测器的设计 评分 批阅教师签字 一、实验目的 1、 学习用状态观测器获取系统状态估计值的方法,了解全维状态观测器的 极点对状态的估计误差的影响; 2、 掌握全维状态观测器的设计方法; 3、 掌握带有状态观测器的状态反馈系统设计方法。 二、实验内容 开环系统? ??=+=cx y bu Ax x &,其中 []0100001,0,10061161A b c ????????===????????--???? a) 用状态反馈配置系统的闭环极点:5,322-±-j ; b) 设计全维状态观测器,观测器的极点为:10,325-±-j ; c) 研究观测器极点位置对估计状态逼近被估计值的影响; d) 求系统的传递函数(带观测器及不带观测器时); 绘制系统的输出阶跃响应曲线。 三、实验环境 MATLAB6、5 四、实验原理(或程序框图)及步骤

利用状态反馈可以使闭环系统的极点配置在所希望的位置上,其条件就是必须对全部状态变量都能进行测量,但在实际系统中,并不就是所有状态变量都能测量的,这就给状态反馈的实现造成了困难。因此要设法利用已知的信息(输出量y 与输入量x),通过一个模型重新构造系统状态以对状态变量进行估计。该模型就称为状态观测器。若状态观测器的阶次与系统的阶次就是相同的,这样的状态观测器就称为全维状态观测器或全阶观测器。 设系统完全可观,则可构造如图4-1所示的状态观测器 图4-1 全维状态观测器 为求出状态观测器的反馈ke 增益,与极点配置类似,也可有两种方法: 方法一:构造变换矩阵Q,使系统变成标准能观型,然后根据特征方程求出k e ; 方法二:就是可 采用Ackermann 公式: []T o e Q A k 1000)(1Λ-Φ=,其中O Q 为可观性矩阵。 利用对偶原理,可使设计问题大为简化。首先构造对偶系统 ???=+=ξ ηξξT T T b v c A & 然后可由变换法或Ackermann 公式求出极点配置的反馈k 增益,这也可

数据结构实验一题目一线性表实验报告

北京邮电大学电信工程学院 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 2.1 存储结构 带头结点的单链表

2.2 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中b、代码实现: Linklist::Linklist(int a[],int n)//头插法 {front=new Node; front->next=NULL; for(int i=n-1;i>=0;i--) {Node*s=new Node; s->data=a[i]; s->next=front->next; front->next=s; } } 2、尾插法

a、伪代码实现:a.在堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)//尾插法 {front=new Node; Node*r=front; for(int i=0;idata=a[i]; r->next=s; r=s; } r->next=NULL; } 时间复杂度:O(n) 3、按位查找 a、伪代码实现: 初始化工作指针p和计数器j,p指向第一个结点,j=1 循环以下操作,直到p为空或者j等于1 b1:p指向下一个结点 b2:j加1 若p为空,说明第i个元素不存在,抛出异常 否则,说明p指向的元素就是所查找的元素,返回元素地址 b、代码实现 Node* Linklist::Get(int i)//得到指向第i个数的指针 {Node*p=front->next; int j=1; while(p&&j!=i)//p非空且j不等于i,指针后移 {p=p->next; j++;

C语言实验报告参考答案

长沙理工大学2010C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include<> main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include <> main() { printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥\n"); } 2.编写程序: a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include<> main() { int a,b,c,x,y; a=150; b=20; c=45;

x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } 4. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include<> main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 3、编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7 a/c的商=3 a/b的余数=10 a/c的余数=15 4. 编译、连接无错,运行后屏幕上显示以下结果: c =-10 实验二顺序结构程序设计 四、程序清单 1.键盘输入与屏幕输出练习 问题1 D 。 问题2 改printf("%c,%c,%d\n",a,b,c);这条语句

二阶倒立摆实验报告

. I 线性系统实验报告 : 院系:航天学院 学号: . .

2015年12月

1.实验目的 1)熟悉Matlab/Simulink仿真; 2)掌握LQR控制器设计和调节; 3)理解控制理论在实际中的应用。 倒立摆研究的意义是,作为一个实验装置,它形象直观,简单,而且参数和形状易于改变;但它又是一个高阶次、多变量、非线性、强耦合、不确定的绝对不稳定系统的被控系统,必须采用十分有效的控制手段才能使之稳定。因此,许多新的控制理论,都通过倒立摆试验对理论加以实物验证,然后在应用到实际工程中去。因此,倒立摆成为控制理论中经久不衰的研究课题,是验证各种控制算法的一个优秀平台,故通过设计倒立摆的控制器,可以对控制学科中的控制理论有一个学习和实践机会。 2.实验容 1)建立直线二级倒立摆数学模型 对直线二级倒立摆进行数学建模,并将非线性数学模型在一定条件下化简成线性数学模型。对于倒立摆系统,由于其本身是自不稳定的系统,实验建立模型存在一定的困难,但是经过小心的假设忽略掉一些次要的因素后,倒立摆系统就是一个典型的运动的刚体系统,可以在惯性坐标系应用经典力学理论建立系统的动

力学方程。对于直线二级倒立摆,由于其复杂程度,在这里利用拉格朗日方程推导运动学方程。 由于模型的动力学方程中存在三角函数,因此方程是非线性的,通过小角度线性化处理,将动力学非线性方程变成线性方程,便于后续的工作的进行。 2)系统的MATLAB仿真 依据建立的数学模型,通过MATLAB仿真得出系统的开环特性,采取相应的控制策略,设计控制器,再加入到系统的闭环中,验证控制器的作用,并进一步调试。控制系统设计过程中需要分析容主要包括得出原未加控制器时系统的极点分布,系统的能观性,能控性。 3)LQR控制器设计与调节实验 利用线性二次型最优(LQR)调节器MATLAB仿真设计的参数结果对平面二阶倒立摆进行实际控制实验,参数微调得到较好的控制效果,记录实验曲线。 4)改变控制对象的模型参数实验 调整摆杆位置,将摆杆1朝下,摆杆2朝上修改模型参数、起摆条件和控制参数,重复3的容。 3.实验步骤

线性表逆置(顺序表)实验报告

实验一:线性表逆置(顺序表)实验报告 (一)问题的描述: 实现顺序表的逆置算法 (二)数据结构的设计: 顺序表是线性表的顺序存储形式,因此设计如下数据类型表示线性表: typedef struct { ElemType *elem; /* 存储空间基址*/ int length; /* 当前长度*/ int listsize; /* 当前分配的存储容量(以sizeof(ElemType)为单位) */ }SqList; (三)函数功能、参数说明及概要设计: 1.函数Status InitList(SqList *L) 功能说明:实现顺序表L的初始化 算法设计:为顺序表分配一块大小为LIST_INIT_SIZE的储存空间 2.函数int ListLength(SqList L) 功能说明:返回顺序表L长度 算法设计:返回顺序表中的length变量 3.函数Status ListInsert(SqList *L,int i,ElemType e) 功能说明:将元素e插入到顺序表L中的第i个节点 算法设计:判断顺序表是否已满,已满则加空间,未满则继续,将元素e插入到第i个元素之前,并将后面的元素依次往后移 4.函数Status ListTraverse(SqList L,void(*vi)(ElemType*)) 功能说明:依次对L的每个数据元素调用函数vi() 算法设计:依次对L的每个数据元素调用函数vi() 5.函数void Exchange(SqList *L) 功能说明:实现顺序表L的逆置 算法设计:用for循环将顺序表L中的第i个元素依次与第(i+length)个元素交换6.函数void print(ElemType *c) 功能说明:打印元素c 算法设计:打印元素c 2. (四)具体程序的实现

2010C语言实验报告参考答案

2010C语言实验报告参考答案

长沙理工大学2010C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include main() {

printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥50.5\n"); } 2.编写程序: a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include main() { int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y);

x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } 4. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a;

线性表实验报告

一.实验名称 1.线性表基本操作; 2.处理约瑟夫环问题 二.试验目的: 1.熟悉C语言的上机环境,掌握C语言的基本结构。 2.定义单链表的结点类型。 3.熟悉对单链表的一些基本操作和具体的函数定义。 4.通过单链表的定义掌握线性表的链式存储结构的特点。 5.熟悉对单链表的一些其它操作。 三.实验内容 1.编制一个演示单链表初始化、建立、遍历、求长度、查询、插入、删除等操作的程序。 2.编制一个能求解除约瑟夫环问题答案的程序。 实验一线性表表的基本操作问题描述: 1. 实现单链表的定义和基本操作。该程序包括单链表结构类型以及对单链表操作 的具体的函数定义 程序中的单链表(带头结点)结点为结构类型,结点值为整型。 /* 定义DataType为int类型*/ typedef int DataType; /* 单链表的结点类型*/ typedef struct LNode {DataType data; struct LNode *next; }LNode,*LinkedList; LinkedList LinkedListInit() //初始化单链表 void LinkedListClear(LinkedList L) //清空单链表 int LinkedListEmpty(LinkedList L)//检查单链表是否为空 void LinkedListTraverse(LinkedList L)//遍历单链表 int LinkedListLength(LinkedList L)//求单链表的长度 /* 从单链表表中查找元素*/ LinkedList LinkedListGet(LinkedList L,int i) /* 从单链表表中查找与给定元素值相同的元素在链表中的位置*/ int LinkedListLocate(LinkedList L, DataType x) void LinkedListInsert(LinkedList L,int i,DataType x) //向单链表中插入元素 /* 从单链表中删除元素*/ void LinkedListDel(LinkedList L,DataType x)

哈工大(威海)c语言实验报告册答案

实验1简单判定性问题求解 一、实验学时 完成本实验需4学时。 二、实验目的 1、阅读程序题 (1)掌握C语言数据类型,熟悉如何定义一个整型、字符型的变量,以及对它们赋值的方法; (2)掌握不同的类型数据之间赋值的规律; (3)掌握数据在内存中的存储方式; (4)学会输入、输出函数的基本格式和使用方法; (5)学会使用有关算术运算符、逻辑运算符、关系运算符,以及包含这些运算符的表达式。 2、编程题 (1)如何运用if-else判定性结构进行程序设计; (2)如何运用switch判定性结构进行程序设计。 3、调试题 (1)熟悉C程序的编辑、编译、连接和运行的过程。 三、实验指导 为了达到最佳的实验效果,以下提供几条适于编程的指导意见,可供参考。 1、阅读程序题应先运用自己在课堂所学的知识,推导出结果,在上机时输入计算机,印证自己推导的结果,注意观察数据在内存中的存储方式、含不同种运算符表达式的输出结果。 2、编程题必须首先画出流程图,并反复思考判断程序设计的正确性,完成程序的设计。要注意简单判定性问题的结构选择。 3、调试题应明确程序的调试、测试是一项非常烦琐的工作,也是非常重要的工作。对于初学者来说应该建立良好的习惯,在调试程序的时候,应该尽可能考虑到程序运行时各种可能情况。

四、实验内容 1、阅读程序题 (1)main( ) { /*定义字符型变量*/ char c1,c2; /*向字符变量赋以整数*/ c1=97; c2=98; printf("%c %c\n",c1,c2); /*以字符形式输出*/ printf("%d %d\n",c1,c2); /*以整数形式输出*/ } 思考:可否改成int c1,c2;输出结果是?相同 (2)main() { int a=7,b=5; printf("%d\n",b=b/a); } 思考:若将printf语句中%d变为%f,可否输出分式的值?可以(3)main() { int a=9; a+=a-=a+a; /*包含复合的赋值运算符的赋值表达式*/ printf("%d\n",a); } 思考:赋值表达式a+=a-=a+a的求解步骤? 第一步:a=a-(a+a)=-9 第二步a=a+a=18 (4)main() { int k=-1; printf("%d,%u\n",k,k);

数据结构线性表实验报告

实验报告 实验一线性表 实验目的: 1.理解线性表的逻辑结构特性; 2.熟练掌握线性表的顺序存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 3.熟练掌握线性表的链表存储结构的描述方法,以及在该存储结构下的基本操作;并能灵活运用; 4.掌握双向链表和循环链表的的描述方法,以及在该存储结构下的基本操作。 实验原理: 线性表顺序存储结构下的基本算法; 线性表链式存储结构下的基本算法; 实验内容: 2-21设计单循环链表,要求: (1)单循环链表抽象数据类型包括初始化操作、求数据元素个数操作、插入操作、删除操作、取消数据元素操作和判非空操作。 (2)设计一个测试主函数,实际运行验证所设计单循环链表的正确性。 2-22 .设计一个有序顺序表,要求: (1)有序顺序表的操作集合有如下操作:初始化、求数据元素个数、插入、删除和取数据元素。有序顺序表与顺序表的主要区别是:有序顺序表中的数据元素按数据元素值非递减有序。 (2)设计一个测试主函数,实际运行验证所设计有序顺序表的正确性。 (3)设计合并函数ListMerge(L1,L2,L3),功能是把有序顺序表L1和L2中的数据元素合并到L3,要求L3中的数据元素依然保持有序。并设计一个主函数,验证该合并函数的正确性。 程序代码: 2-21(1)头文件LinList.h如下: typedef struct node { DataType data; struct node *next; }SLNode; /*(1)初始化ListInitiate(SLNode * * head)*/ void ListInitiate(SLNode * * head) { /*如果有内存空间,申请头结点空间并使头指针head指向头结点*/ if((*head=(SLNode *)malloc(sizeof(SLNode)))==NULL)exit(1);

系统的能控性,能观测性,稳定性分析

实验报告 课程线性系统理论基础实验日期年月日 专业班级姓名学号同组人 实验名称系统的能控性、能观测性、稳定性分析及实现评分 批阅教师签字 一、实验目的 加深理解能观测性、能控性、稳定性、最小实现等观念。掌握如何使用MATLAB进行以下分析和实现。 1、系统的能观测性、能控性分析; 2、系统的稳定性分析; 3、系统的最小实现。 二、实验内容 (1)能控性、能观测性及系统实现 (a)了解以下命令的功能;自选对象模型,进行运算,并写出结

果。 gram, ctrb, obsv, lyap, ctrbf, obsvf, minreal ; (b )已知连续系统的传递函数模型,182710)(23++++=s s s a s s G ,当a 分别取-1,0,1时,判别系统的能控性与能观测性; (c )已知系统矩阵为???? ??????--=2101013333.06667.10666.6A ,??????????=110B ,[]201=C ,判别系统的能控性与能观测性; (d )求系统18 27101)(23++++= s s s s s G 的最小实现。 (2)稳定性 (a )代数法稳定性判据 已知单位反馈系统的开环传递函数为:) 20)(1()2(100)(+++=s s s s s G ,试对系统闭环判别其稳定性 (b )根轨迹法判断系统稳定性 已知一个单位负反馈系统开环传递函数为 ) 22)(6)(5()3()(2+++++=s s s s s s k s G ,试在系统的闭环根轨迹图上选择一点,求出该点的增益及其系统的闭环极点位置,并判断在该点系统闭环的稳定性。 (c )Bode 图法判断系统稳定性

C语言实验报告参考源代码

实验5三种基本结构的综合应用 4.一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=100;i<=999;i++) {for(j=2;j=i) /*三位数是素数时*/ {k=i%100; /*去掉百位数字*/ if(k>=10) /*十位数字不是0时*/ {for(m=2;m=k) /*两位数是素数时*/ {p=i%10; /*p为个位数字*/ for(q=2;q=p)n++;}}}} printf("%d\n",n);} Key:57 5.求[2,400]中相差为10的相邻素数对的对数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=2;i<=400;i++) {for(j=2;j=i) /*i是素数时*/ {for(k=i+1;k=k)break;} /*k是素数时终止if语句的外层循环*/ if(k>=i+10) /*[i+1,i+9]不是素数时*/ {for(q=2;q

线性表的基本操作实验报告

实验一:线性表的基本操作 【实验目的】 学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。 【实验内容】 1.顺序表的实践 1) 建立4个元素的顺序表s=sqlist[]={1,2,3,4,5},实现顺序表建立 的基本操作。 2) 在sqlist []={1,2,3,4,5}的元素4和5之间插入一个元素9,实现 顺序表插入的基本操作。 3) 在sqlist []={1,2,3,4,9,5}中删除指定位置(i=5)上的元素9, 实现顺序表的删除的基本操作。 2.单链表的实践 3.1) 建立一个包括头结点和4个结点的(5,4,2,1)的单链表,实现单链 表建立的基本操作。 2) 将该单链表的所有元素显示出来。 3) 在已建好的单链表中的指定位置(i=3)插入一个结点3,实现单链表插 入的基本操作。 4) 在一个包括头结点和5个结点的(5,4,3,2,1)的单链表的指定位置 (如i=2)删除一个结点,实现单链表删除的基本操作。 5) 实现单链表的求表长操作。 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了刚创

建的工程之中。 4.写好代码 5.编译->链接->调试 1、#include "stdio.h" #include "malloc.h" #define OK 1 #define OVERFLOW -2 #define ERROR 0 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef int ElemType; typedef int Status; typedef struct { ElemType *elem; int length; int listsize; } SqList; Status InitList( SqList &L ) { int i,n; L.elem = (ElemType*) malloc (LIST_INIT_SIZE*sizeof (ElemType)); if (!L.elem) return(OVERFLOW); printf("输入元素的个数:"); scanf("%d",&n); printf("输入各元素的值:"); for(i=0;i

系统的能控性、能观测性、稳定性分析

实 验 报 告 课程 线性系统理论基础 实验日期 年 月 日 专业班级 学号 同组人 实验名称 系统的能控性、能观测性、稳定性分析及实现 评分 批阅教师签字 一、实验目的 加深理解能观测性、能控性、稳定性、最小实现等观念。掌 握如何使用MATLAB 进行以下分析和实现。 1、系统的能观测性、能控性分析; 2、系统的稳定性分析; 3、系统的最小实现。 二、实验内容 (1)能控性、能观测性及系统实现 (a )了解以下命令的功能;自选对象模型,进行运算,并写出结 果。 gram, ctrb, obsv, lyap, ctrbf, obsvf, minreal ; (b )已知连续系统的传递函数模型,18 2710)(23++++=s s s a s s G ,当a 分别取-1,0,1时,判别系统的能控性与能观测性;

(c )已知系统矩阵为???? ??????--=2101013333.06667.10666.6A ,??????????=110B ,[]201=C ,判别系统的能控性与能观测性; (d )求系统18 27101)(23++++= s s s s s G 的最小实现。 (2)稳定性 (a )代数法稳定性判据 已知单位反馈系统的开环传递函数为:) 20)(1()2(100)(+++=s s s s s G ,试对系统闭环判别其稳定性 (b )根轨迹法判断系统稳定性 已知一个单位负反馈系统开环传递函数为 ) 22)(6)(5()3()(2+++++=s s s s s s k s G ,试在系统的闭环根轨迹图上选择一点,求出该点的增益及其系统的闭环极点位置,并判断在该点系统闭环的稳定性。 (c )Bode 图法判断系统稳定性 已知两个单位负反馈系统的开环传递函数分别为 s s s s G s s s s G 457.2)(,457.2)(232231-+=++= 用Bode 图法判断系统闭环的稳定性。 (d )判断下列系统是否状态渐近稳定、是否BIBO 稳定。 []x y u x x 0525,100050250100010-=????? ?????+??????????-=

实验报告二:线性表及其基本操作实验(2学时)

实验报告 实验二线性表及其基本操作实验(2学时) 实验目的: (1) 熟练掌握线性表ADT和相关算法描述、基本程序实现结构; (2) 以线性表的基本操作为基础实现相应的程序; (3) 掌握线性表的顺序存储结构和动态存储结构之区分。 实验内容:(类C算法的程序实现,任选其一。具体要求参见教学实验大纲) (1)一元多项式运算的C语言程序实现(加法必做,其它选做); (2) 有序表的合并; (3)集合的并、交、补运算; (4)约瑟夫问题的求解。 注:存储结构可以选用静态数组、动态数组、静态链表或动态链表之一。对链表也可以采用循环链表(含单向或双向)。 实验准备: 1) 计算机设备;2) 程序调试环境的准备,如TC环境;3)实验内容的算法分析与代码设计与分析准备。 实验步骤: 1.录入程序代码并进行调试和算法分析; 2.编写实验报告。 实验过程:(一元多项式的加法) 【算法描述】 定义两个指针qa和qb,分别指向多项式A和多项式B当前进行比较的某个结点,然后比较2个结点中的指数项,则有以下三种结果: 1、指针qa所指结点的指数值小于指针qb所指结点的指数值,则应摘取指针qa 所指的结点插入到“和多项式”链表当中去; 2、指针qa所指结点的指数值大于指针qb所指结点的指数值,则应摘取指针qb 所指的结点插入到“和多项式”链表当中去; 3、指针qa所指结点的指数值等于指针qb所指结点的指数值,则将两个结点的系数相加,若和数不等于零,则修改qa所指结点的系数值,同时释放qb所指结点。反之,从多项式A的链表删除相应结点,并释放指针qa和qb所指结点。【源程序】 #include #include typedef struct { float coef;

状态观测器的设计——报告

东南大学自动化学院 实 验 报 告 课程名称: 自动控制基础 实验名称: 状态观测器的设计 院 (系): 自动化学院 专 业: 自动化 姓 名: 吴静 学 号: 08008419 实 验 室: 机械动力楼417室 实验组别: 同组人员: 实验时间:2011年05月13日 评定成绩: 审阅教师: 一、实验目的 1. 理解观测器在自动控制设计中的作用 2. 理解观测器的极点设置 3. 会设计实用的状态观测器 二、实验原理 如果控制系统采用极点配置的方法来设计,就必须要得到系统的各个状态,然后才能用状态反馈进行极点配置。然而,大多数被控系统的实际状态是不能直接得到的,尽管系统是可以控制的。怎么办?如果能搭试一种装置将原系统的各个状态较准确地取出来,就可以实现系统极点任意配置。于是提出了利用被控系统的输入量和输出量重构原系统的状态,并用反馈来消除原系统和重构系统状态的误差,这样原系统的状态就能被等价取出,从而进行状态反馈,达到极点配置改善系统的目的,这个重构的系统就叫状态观测器。 另外,状态观测器可以用来监测被控系统的各个参量。 观测器的设计线路不是唯一的,本实验采用较实用的设计。 给一个被控二阶系统,其开环传递函数是G (s )=12 (1)(1)K T s T s ++ ,12 K K K =观测器如图示。

设被控系统状态方程 构造开环观测器,X ∧ Y ∧ 为状态向量和输出向量估值 由于初态不同,估值X ∧ 状态不能替代被控系统状态X ,为了使两者初态跟随,采用输出误差反馈调节,加入反馈量H(Y-Y)∧ ,即构造闭环观测器,闭环观测器对重构造的参数误差也有收敛作用。 也可写成 X =(A-HC)X +Bu+HY Y CX ? ∧ ∧ ∧∧ = 只要(A-HC )的特征根具有负实部,状态向量误差就按指数规律衰减,且极点可任意配置,一般地,(A-HC )的收敛速度要比被控系统的响应速度要快。工程上,取小于被控系统最小时间的3至5倍,若响应太快,H 就要很大,容易产生噪声干扰。 实验采用X =A X +Bu+H(Y-Y)? ∧ ∧∧ 结构,即输出误差反馈,而不是输出反馈形式。 取:1212min 35 20,5,2,0.5,0.2K K T T t λ-= =====,求解12g g ?????? 三、实验设备: THBDC-1实验平台 THBDC-1虚拟示波器 Matlab/Simulink 软件 四、实验步骤 按要求设计状态观测器 (一) 在Matlab 环境下实现对象的实时控制 1. 将ZhuangTai_model.mdl 复制到E:\MATLAB6p5\work 子目录下,运行matlab ,打开ZhuangTai_model.mdl 注:‘实际对象’模块对应外部的实际被控对象,在simulink 下它代表计算机与外部接口: ● DA1对应实验面板上的DA1,代表对象输出,输出通过数据卡传送给计算机; ● AD1对应实验面板上的AD1,代表控制信号,计算机通过数据卡将控制信号送给实际对象;

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