搜档网
当前位置:搜档网 › 线性表实验报告

线性表实验报告

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

一.实验名称

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)

/* 用尾插法建立单链表*/

LinkedList LinkedListCreat( )

2. 约瑟夫环问题:任给正整数N和K,按下述方法可以得到1,2,…,n的一个置换,将

数字1,2,…,n环形排列,按顺时针方向自1开始报数,报到K时输出该位置上的数字,并使其出列。然后从他在顺时针方向的下一个数字继续报数,如此下去,直到所有的数字全部出列为止。例如N=10,K=3,则正确的出列顺序应为3,6,9,2,7,1,8,5,10,4。

3. 试单链表实现一个简单的电子通讯本管理软件,要求能查找联系地址,增加和删除

联系人。联系方式假定包括姓名、电话和地址。

基本要求:

1.上机前要做好准备工作,包括程序框图、数据结构以及算法。

2.按时实验

3.服从实验室老师的安排

4.独立实验,有问题可以讨论,但不得翻版。

5.遵守实验室的各项纪律。

四、概要设计

1.单链表的操作

(1)为了实现上述程序功能,需要定义单链表的抽象数据类型:

ADT LinkedList {

数据对象:D={ai|ai∈struct LNode set,i=0,1,2,…,n,n≥0}

数据关系:R={|ai,ai+1 ∈D}

基本操作:

LinkedListInit()

操作结果:构造了一个带头节点的空链表L;

LinkedListCreat()

初始条件:单链表L已存在;

操作结果:建立了一个带头节点的非空链表;

LinkedListClear(&L)

初始条件:单链表L已存在;

操作结果:将L重置为带头节点的空链表;

LinkedListEmpty(&L)

初始条件:单链表L已存在;

操作结果:如果链表L为空则返回1,链表L非空则返回0;

LinkedListLength(&L)

初始条件:单链表L已存在;

操作结果:返回单链表L中数据元素的个数,若L为空表则返回0;LinkedListTraverse(&L)

初始条件:单链表L已存在;

操作结果:依次返回单链表L中各节点的元素值,若L为空表则显示链表为空;LinkedListGet(&L,i)

初始条件:单链表L已存在;

操作结果:显示链表L中第i个节点个元素值,若链表L中没有第i个节点则显示查询位置不正确;

LinkedListLocate(&L,x)

初始条件:单链表L已存在;

操作结果:显示链表L中元素x的位置,若链表L中没有元素x则显示所查找元素不存在;LinkedListInsert(&L,i,x)

初始条件:单链表L已存在;

操作结果:在单链表L第i个节点后插入一个元素值为x的节点,L的长度加1,若单链表L中没有第i个节点则显示插入位置不正确;

LinkedListDel(&L,i)

初始条件:单链表L已存在;

操作结果:在单链表L中删除第i个节点,L的长度减1,若单链表L中没有第i个节点则显示删除位置不正确;

(2)本程序包含11个函数:

1. 主函数main()

2. 初始化单链表函数LinkListInit()

3. 清空单链表函数LinkedListClear()

4. 检查单链表是否为空函数LinkedListEmpty()

5. 遍历遍历单链表函数LinkedListTraverse()

6. 求单链表的长度函数LinkedListLength()

7. 从单链表表中查找元素函数LinkedListGet()

8 从单链表表中查找指定元素的位序函数LinkedListLocate()

9. 插入元素函数LinkedListInsert()

10. 删除元素函数LinkedListDel()

11.建立单链表函数LinkedListCreat( )

各函数之间的关系:

五.详细设计

1结点类型和指针类型

typedef struct LNode

{int data;

struct LNode *next;

} LNode,*LinkedList;

2单链表的基本操作

(1)初始化单链表

LinkedList LinkedListInit()

{LinkedList L;

L=(LinkedList)malloc(sizeof(LNode));

L->next=NULL;

return L;

}

(2)清空单链表

void LinkedListClear(LinkedList L)

{L->next=NULL;

printf("链表已经清空\n");

}

(3)检查单链表是否为空

int LinkedListEmpty(LinkedList L)

{if(L->next==NULL) return TRUE;

else return FALSE;

}

(4)遍历单链表

void LinkedListTraverse(LinkedList L)

{LinkedList p;

p=L->next;

if(p==NULL) printf("单链表为空表\n");

else

{printf("链表中的元素为:\n");

while(p!=NULL)

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

}

printf("\n");

}

(5)求单链表长度

int LinkedListLength (LinkedList L)

{LinkedList p;

int j;

p=L->next;

j=0;

while(p!=NULL)

{ j++;p=p->next; }

return j;

}

(6)从链表中查找元素

LinkedList LinkedListGet(LinkedList L,int i)

{LinkedList p;int j;

p=L->next; j=1;

while (p!=NULL && j

{p=p->next; j++; }

if (j==i) return p;

else return NULL;

}

(7)从链表中查找与给定元素值相同的元素在顺序表中的位置int LinkedListLocate ( LinkedList L, int x)

{LinkedList p;int j;

p=L->next; j=1;

while ( p!=NULL && p->data != x)

{p=p->next;j++;}

if(p) return j;

else return 0;

}

(8)向链表中插入元素

void LinkedListInsert(LinkedList L, int i, int x)

{LinkedList p,s;

int j;

j=1;p=L;

while(p&&j

{p=p->next;j++;}

if(p==NULL||j>i)

printf("插入位置不正确\n");

else {s=(LNode *)malloc(sizeof(LNode));

s->data=x;

s->next=p->next;

p->next=s;

printf("%d已插入到链表中\n",x);

}

}

(9)从链表中删除元素

void LinkedListDel(LinkedList L,int i)

{ LinkedList p,q;

int j;

j=1;p=L;

while(p->next&&j

{p=p->next;j++;}

if(p->next==NULL)

printf("删除位置不正确\n");

else {q=p->next;p->next=q->next;free(q);

printf("第%d个元素已从链表中删除\n",i);

}

}

(10)建立单链表

LinkedList LinkedListCreat( )

{ LinkedList L=LinkedListInit(),p,r;

int x;

r=L;

printf("请依次输入链表中的元素,输入负数时结束\n");

scanf("%d",&x);

while (x>=0)

{p=(LinkedList)malloc(sizeof(LNode));

p->data=x;

r->next=p;

r=p;

scanf("%d",&x);

}

r->next=NULL;

return L;

}

(11)主函数

main()

{

int i,h,d,e,x,j,n,q;

char ch;

LinkedList L,p;

while(q!=0) {

printf("请选择要进行的操作\n");

printf("1.初始化2.清空3.求链表长度4.检查链表是否为空\n");

printf("5.遍历链表6.从链表中查找元素\n");

printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");

printf("8.向链表中插入元素9. 从链表中删除元素\n");

printf("10.建立单链表\n");

printf("按其它键结束\n");

scanf("%d",&x);

switch(x)

{case 1:L=LinkedListInit();printf("链表已经初始化\n");break;

case 2:LinkedListClear(L);printf("\n");break;

case 3:printf("链表的长度为%d\n",LinkedListLength(L));break;

case 4:i= LinkedListEmpty(L);if(i)printf("链表为空\n");else printf("链表非空\n");break; case 5:LinkedListTraverse(L); break;

case 6:printf("请输入待查询元素在链表中的位置:");

scanf("%d",&j);

p=LinkedListGet(L,j);

if(p) printf("链表中第%d个元素的值为:%d\n",j,p->data);

else printf("查询位置不正确\n");

break;

case 7:printf("请输入待查询元素的值:");

scanf("%d",&e);

h=LinkedListLocate(L,e);

if(h)

printf("%d在链表中的位置是:%d\n",e,h);

else printf("链表中没有值为%d的元素\n",e);

break;

case 8:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n");

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

LinkedListInsert(L,d,e);

break;

case 9:if(LinkedListLength(L)==0)

printf("链表已经为空,不能删除\n");

else {printf("请输入待删除元素的位置:\n");

scanf("%d",&n);

LinkedListDel(L,n);}

break;

case 10:L=LinkedListCreat();

printf("\n");break;

default:q=0;}

}

}

六.测试结果

1、单链表的操作

(1)建立单链表:

选择1,然后选择10 ,输入1.2.3.4.5.6.7.8.9 最后一个负数

(2)求链表长度:

选择3,得到执行结果:链表的长度为9

(3)检查链表是否为空:

选择4,得到执行结果:单链表非空

(4)遍历链表:

选择5,得到执行结果:链表中的元素为 1,2,3,4,5,6,7,8,9,(5) 从链表中查找元素:

选择6,输入5,显示:链表中第5个元素的值为5

(6) 从链表中查找与给定元素值相同的元素在顺序表中的位置

选择7,输入2,显示: 2在链表中的位置是:2

选择7,输入25,显示:链表中没有值为25的元素

(7) 向链表中插入元素

选择8,输入(6,5),显示 5以插入到链表中

选择5:链表中的元素为 1,2,3,4,5,5,6,7,8,9,

(8) 从链表中删除元素

选择9,输入5,显示第5个元素已从表中删除

选择9,输入12,显示删除位置不正确

选择5,显示链表中的元素为链表中的元素为 1,2,3,4,5,6,7,8,9,

实验二约瑟夫环

1.问题描述

设有编号1,2,3。。。n(n>0)的N个人围成一个圈,每个人持有一个密码(正整数)。开始时从第k (1<=k<=n)个人按顺时针方向自1开始顺序报数,报到m(m为第K个人的密码)的人出圈,再以这个人顺时针方向上的下一个人的密码为m,并开始重新从1报数。如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。例如,设总人数n的初值为8,他们所持的密码分别为:3,10,7,1,4,8,4,5,开始报数人的编号k的初值为7,则出列顺序为:2,1,3,4,8,5,7,6

2.数据结构设计

问题中以序号标示某个人,所以结点的数据域设为一个整型类型的变量

当某人出圈后,报数的工作要从下一个人开始继续,剩下的人仍然围成一圈,可以使用循环表。由于出圈的人将不再属于圈内,意味着数据元素的删除。因此,算法中存有频繁的元素删除操作,存储结构宜采用链表。每个结点中既存储密码还存储初始位置,所以结点有两个数据域,一个指针域。另外,每个结点代表一个人所以,可以令尾结点指针指向首元结点来进行循环。

// 结点类

template

struct Node

{

// 数据成员:

ElemType data;

ElemType num; // 数据域

Node *next; // 指针域

// 构造函数:

Node(); // 无参数的构造函数

Node(ElemType item, ElemType item1,Node *link = NULL);

// 已知数数据元素值和指针建立结构

};

// 结点类的实现部分

template

Node::Node()

// 操作结果:构造指针域为空的结点

{

next = NULL;

}

template

Node::Node(ElemType item, ElemType item1,Node *link)

// 操作结果:构造一个数据域为item和item1,指针域为link的结点

{

data = item;

num = item1;

next = link;

}#endif

3.算法设计

编写一个函数实现结点的删除与输入工作,另编写一个主函数main()完成链表的创建与函数调用工作。

(1)插入

template

Status LinkList::Insert(int position, const ElemType &e)

// 操作结果:在线性表的第position个位置前插入元素e

// position的取值范围为1≤position≤Length()+1

// position合法时返回SUCCESS, 否则函数返回RANGE_ERROR

{

if (position < 1 || position > Length() + 1)

{ // position范围错

return RANGE_ERROR; // 位置不合法

}

else

{ // position合法

Node *tmpPtr;

// 取出指向第position-1个结点的指针

tmpPtr = GetElemPtr(position - 1);

Node *newPtr;

if(position>Length())

// 如果插入尾结点,则域指针指向首元结点

newPtr = new Node(e, position,head->next);

else

newPtr= new Node(e, position,tmpPtr->next);// 生成新结点tmpPtr->next = newPtr; // 将tmpPtr插入到链表中

curPosition = position; // 设置当前位置的序号

curPtr = newPtr; // 设置指向当前位置的指针

count++; // 插入成功后元素个数加1

return SUCCESS;

}

}

(2)删除

template

Status LinkList::Delete(int position, ElemType &e)

// 操作结果:删除线性表的第position个位置的元素, 并用e返回其值,

// position的取值范围为1≤position≤Length(),

// position合法时函数返回SUCCESS,否则函数返回RANGE_ERROR

{

// position合法

Node *tmpPtr;

if(position==1)

// 如果删除首元结点,取出指向尾结点的指针

tmpPtr=GetElemPtr(Length());

else

// 取出指向第position-1个结点的指针

tmpPtr = GetElemPtr(position - 1);

Node *nextPtr = tmpPtr->next;

if(position==1)

//头结点与新的首元结点相连

head->next=nextPtr->next; // nextPtr为tmpPtr的后继

tmpPtr->next = nextPtr->next; // 删除结点

e = nextPtr->data; // 用e返回被删结点元素值

if (position == Length())

{ // 删除尾结点,当前结点变为头结点

curPosition = 1; // 设置当前位置的序号

curPtr = head->next; // 设置指向当前位置的指针

}

else

{ // 删除非尾结点,当前结点变为第position个结点

curPosition = position; // 设置当前位置的序号

curPtr = tmpPtr->next; // 设置指向当前位置的指针}

count--; // 删除成功后元素个数减1

delete nextPtr; // 释放被删结点

return SUCCESS;

}

(3)出圈次序的算法描述

template

int LinkList::Pass(int position , int n ,ElemType &e)

{ int i;

curPtr = GetElemPtr(position); //当前指针指向position

curPosition=position; //记录当前位置

for(i=0;i

{curPtr = curPtr->next;

curPosition++;

}

cout<num<<" "; //输出起始位置

e=curPosition;

}

(4)主程序

#include"assistance.h"

#include"lk_list.h"

int POS(int n,int i) //计算当前位置的函数

{ if(n%i==0)

n=i;

else n=n%i;

return n; }

int main(){ int tmp,i,k=0,n=0,key;

int pos;

LinkList lc; //创建空链表

while(n<1||n>20) //限制人数

{ cout<<"请输入人数,人数小于20:";

cin>>n; }

cout<<"请输入每个人的密码,用空格分隔,密码大于0:"<

for(i=1;i<=n;i++)

{ cin>>tmp;

lc.Insert(i,tmp); //插入尾结点}

while(k<1||k>n)

{ cout<<"从几号开始?0

cin>>k; }

cout<<"出列顺序:";

for(i=n;i>0;i--)

{

if(i==n) //一开始,从k开始报数

{

lc.GetElem(k,key);

lc.Pass(k,key,tmp); //出列

pos=POS(tmp,i); //计算出列位置

lc.Delete(pos,tmp); //删除当前结点,当前指针指向当前位置的下游

}

else

{

lc.GetElem(key); //取当前位置的密码

lc.Pass(key,tmp); //从当前位置开始报数,并出列

pos=POS(tmp,i); //计算出列位置

lc.Delete(pos,tmp);

}

}

system("pause");

return 0;

}

九:心得体会

通过做这次实验,发现自己在数据结构这门课程中还有很多不足,有很多知识还没掌握实验的时候出现了很多错误,有很多知识还不能运用,最后在同学的帮助下,终于完成了任务。

因为以前的C语言没学好,这学期的数据结构感到学的时候有些吃力,在实验的时候,我所以的不足都体现出来了,如果没有同学的帮助,我程序中的问题可能

需要很长时间才会解决,所以以后还是要努力赶上来。

在这次实验中,我也得到了很多收获,比如链表的应用,以前总是弄不明白,通过这次实验,在链表这一方面我懂了很多,但还不能运用自如,需要更多的练习。

这次实验,对本学期所学习的内容也是一次巩固,让我加深了对学过知识的记忆。

总之,这次实验让我既发现了自身的很多不足,又增长了很多知识。

#include

#include

#define TRUE 1

#define FALSE 0

typedef struct LNode

{int data;

struct LNode *next;

} LNode,*LinkedList;

LinkedList LinkedListInit()

{LinkedList L;

L=(LinkedList)malloc(sizeof(LNode));

L->next=NULL;

return L;

}

void LinkedListClear(LinkedList L)

{L->next=NULL;

printf("链表已经清空\n");

}

int LinkedListEmpty(LinkedList L)

{if(L->next==NULL) return TRUE;

else return FALSE;

}

void LinkedListTraverse(LinkedList L)

{LinkedList p;

p=L->next;

if(p==NULL) printf("单链表为空表\n");

else

{printf("链表中的元素为:\n");

while(p!=NULL)

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

}

printf("\n");

}

int LinkedListLength (LinkedList L)

{LinkedList p;

int j;

p=L->next;

j=0;

while(p!=NULL)

{ j++;p=p->next; }

return j;

}

LinkedList LinkedListGet(LinkedList L,int i) {LinkedList p;int j;

p=L->next; j=1;

while (p!=NULL && j

{p=p->next; j++; }

if (j==i) return p;

else return NULL;

}

int LinkedListLocate ( LinkedList L, int x) {LinkedList p;int j;

p=L->next; j=1;

while ( p!=NULL && p->data != x)

{p=p->next;j++;}

if(p) return j;

else return 0;

}

void LinkedListInsert(LinkedList L, int i, int x) {LinkedList p,s;

int j;

j=1;p=L;

while(p&&j

{p=p->next;j++;}

if(p==NULL||j>i)

printf("插入位置不正确\n");

else {s=(LNode *)malloc(sizeof(LNode));

s->data=x;

s->next=p->next;

p->next=s;

printf("%d已插入到链表中\n",x);

}

}

void LinkedListDel(LinkedList L,int i)

{ LinkedList p,q;

int j;

j=1;p=L;

while(p->next&&j

{p=p->next;j++;}

if(p->next==NULL)

printf("删除位置不正确\n");

else {q=p->next;p->next=q->next;free(q); printf("第%d个元素已从链表中删除\n",i);

}

}

LinkedList LinkedListCreat( )

{ LinkedList L=LinkedListInit(),p,r;

int x;

r=L;

printf("请依次输入链表中的元素,输入负数时结束\n");

scanf("%d",&x);

while (x>=0)

{p=(LinkedList)malloc(sizeof(LNode));

p->data=x;

r->next=p;

r=p;

scanf("%d",&x);

}

r->next=NULL;

return L;

}

main()

{

int i,h,d,e,x,j,n,q;

char ch;

LinkedList L,p;

while(q!=0) {

printf("请选择要进行的操作\n");

printf("1.初始化2.清空3.求链表长度4.检查链表是否为空\n");

printf("5.遍历链表6.从链表中查找元素\n");

printf("7.从链表中查找与给定元素值相同的元素在顺序表中的位置\n");

printf("8.向链表中插入元素9. 从链表中删除元素\n");

printf("10.建立单链表\n");

printf("按其它键结束\n");

scanf("%d",&x);

switch(x)

{case 1:L=LinkedListInit();printf("链表已经初始化\n");break;

case 2:LinkedListClear(L);printf("\n");break;

case 3:printf("链表的长度为%d\n",LinkedListLength(L));break;

case 4:i= LinkedListEmpty(L);if(i)printf("链表为空\n");else printf("链表非空\n");break; case 5:LinkedListTraverse(L); break;

case 6:printf("请输入待查询元素在链表中的位置:");

scanf("%d",&j);

p=LinkedListGet(L,j);

if(p) printf("链表中第%d个元素的值为:%d\n",j,p->data);

else printf("查询位置不正确\n");

break;

case 7:printf("请输入待查询元素的值:");

scanf("%d",&e);

h=LinkedListLocate(L,e);

if(h)

printf("%d在链表中的位置是:%d\n",e,h);

else printf("链表中没有值为%d的元素\n",e);

break;

case 8:printf("请输入插入元素的位置和值(中间以空格或回车分隔):\n"); scanf("%d%d",&d,&e);

LinkedListInsert(L,d,e);

break;

case 9:if(LinkedListLength(L)==0)

printf("链表已经为空,不能删除\n");

else {printf("请输入待删除元素的位置:\n");

scanf("%d",&n);

LinkedListDel(L,n);}

break;

case 10:L=LinkedListCreat();

printf("\n");break;

default:q=0;}

}

}

线性系统理论大作业小组报告-汽车机器人建模

审定成绩: 重庆邮电大学 硕士研究生课程设计报告 (《线性系统理论》) 设计题目:汽车机器人建模 学院名称:自动化学院 学生姓名: 专业:控制科学与工程 仪器科学与技术 班级:自动化1班、2班 指导教师:蔡林沁 填表时间:2017年12月

重庆邮电大学

摘要 汽车被广泛的应用于城市交通中,它的方便、快速、高效给人们带来了很大便利,这大大改变了人们的生活. 研制出一种结构简单、控制有效、行驶安全的城市用无人智能驾驶车辆,将驾驶员解放出来,是大大降低交通事故的有效方法之一,应用现代控制理论设计出很多控制算法,对汽车进行控制是非常必要的,本文以汽车机器人为研究对象,对其进行建模和仿真,研究了其模型的能控能观性、稳定性,并通过极点配置和状态观测器对其进行控制,达到了一定的性能要求。这些研究为以后研究汽车的自动驾驶和路径导航,打下了一定的基础。 关键字:建模、能控性、能观性、稳定性、极点配置、状态观测器

目录 第一章绪论 (1) 第一节概述 (1) 第二节任务分工 (2) 第二章系统建模 (2) 2 系统建模 (2) 2.1运动学模型 (2) 2.2自然坐标系下模型 (4) 2.3具体数学模型 (6) 第三章系统分析 (7) 3.1 能控性 (7) 3.1.1 能控性判据 (7) 3.1.2 能控性的判定 (8) 3.2 能观性 (10) 3.2.1 能观性判据 (10) 3.2.2 能观测性的判定 (12) 3.3 稳定性 (13) 3.3.1 稳定性判据 (13) 3.3.2 稳定性的判定 (14) 第四章极点配置 (15) 4.1 极点配置概念 (15) 4.2 极点配置算法 (15) 4.3 极点的配置 (16) 4.4 极点配置后的阶跃响应 (17) 第五章状态观测器 (18) 5.1概念 (19) 5.2带有观测器的状态反馈 (20) 5.3代码实现 (21) 5.4 极点配置和状态观测器比较 (23)

线性系统理论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)要求求该系统的能控型矩阵,并验证该系统是不能控的。

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++;

线性系统理论课程报告

线性系统的坐标变换及其相关特性 坐标变换的概念: 系统坐标变换的几何意义就是换基,即把状态空间的坐标系由一个基底换为另一个基底。 坐标变换的代数表征: 对系统的坐标变换代数上等同于对其状态空间的基矩阵的一个线性非奇异变换。 线性时不变系统的坐标变换的一个状态空间描述: 对(1)式表征的线性时不变系统的状态空间描述,引入坐标变换即线性非奇异变换 ,则变换后的系统系统状态空间描述为: 推导过程如下: 此时,原系统的状态空间描述与变换后的系统的状态空间描述之间的系数矩阵有如下关系: 对线性时不变系统的(1),引入同样的线性非奇异变: x Ax Bu y Cx Du =+=+∑(1)1x p x -=: x Ax Bu y Cx Du =+=+∑(2)11x p x x p x --=?=1111()x p x p Ax Bu p Apx p Bu ----==+=+y Cx Du Cpx Du =+=+11,,,A p Ap B p B C Cp D D --====

换 ,则变换前后的系统的传递函数不变,即成立 。 进而得 基于上述讨论可得出在线性时不变系统变换下系统具有一些特性: (1)对线性时不变系统,不管是系统矩阵还是传递函数矩阵,其特征多项式在坐标变换下保持不变。 (2)对线性时不变系统,系统矩阵A 的特征值在坐标变换下保持不变,而特征向量在坐标变换下具有相同的变换关系,即对 的线性非奇异变换有: 线性时变系统的坐标变换的一个状态空间描述: 对线性时变的状态空间描述(3),引入坐标变换即线性非奇异变换 (4), 为可逆且连续可微,则变换后的状态空间描述为: 推导过程如下: 对 (4) 式两边关于 t 求导得: 1x p x -=()()G s G s =1111111()() [()] ()() G s Cp sI p Ap p B D C p sI p Ap p B D C sI A B D G s -------=-+=-+=-+=1x p x -=1,1,2,3i i v p v i -== : ()() ()()x A t x B t u y C t x D t u =+=+∑(3)()x p t x =()p t ()() ()()x A t x B t u y C t x D t u =+=+(5)()() x p t x p t x =+(6)

二阶倒立摆实验报告

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

2015年12月

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

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

实验报告一顺序表的操作

《数据结构》实验报告一 系别:班级: 学号:姓名: 日期:指导教师: 一、上机实验的问题和要求: 顺序表的查找、插入与删除。设计算法,实现线性结构上的顺序表的产生以及元素的查找、插入与删除。具体实现要求: 从键盘输入10个整数,产生顺序表,并输入结点值。 从键盘输入1个整数,在顺序表中查找该结点的位置。若找到,输出结点的位置;若找不到,则显示“找不到”。 从键盘输入2个整数,一个表示欲插入的位置i,另一个表示欲插入的数值x,将x插入在对应位置上,输出顺序表所有结点值,观察输出结果。 从键盘输入1个整数,表示欲删除结点的位置,输出顺序表所有结点值,观察输出结果。二、程序设计的基本思想,原理和算法描述: (包括程序的结构,数据结构,输入/输出设计,符号名说明等) 三、源程序及注释:

#include <> /*顺序表的定义:*/ #define ListSize 100 /*表空间大小可根据实际需要而定,这里假设为100*/ typedef int DataType; /*DataType可以是任何相应的数据类型如int, float或char*/ typedef struct { DataType data[ListSize]; /*向量data用于存放表结点*/ int length; /*当前的表长度*/ }SeqList; /*子函数的声明*/ void CreateList(SeqList * L,int n); /*创建顺序表函数*/ int LocateList(SeqList L,DataType x); /*查找顺序表*/ void InsertList(SeqList * L,DataType x,int i); /*在顺序表中插入结点x*/ void DeleteList(SeqList * L,int i);/*在顺序表中删除第i个结点*/ void PrintList(SeqList L,int n); /*打印顺序表中前n个结点*/ void main() { SeqList L; int n=10,x,i; /*欲建立的顺序表长度*/ =0;

线性表实验报告

一.实验名称 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)

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

线性系统理论实验报告 学院:电信学院 姓名:邵昌娟 学号:152085270006 专业:电气工程

线性系统理论Matlab实验报告 1、由分析可知系统的状态空间描述,因系统综合实质上是通过引入适当状态反馈矩阵K,使得闭环系统的特征值均位于复平面S的期望位置。而只有当特征根均位于S的左半平面时系统稳定。故当特征根是正数时系统不稳定,设计无意义。所以设满足题目中所需要求的系统的期望特征根分别为λ1*=-2,λ2*=-4。 (a) 判断系统的能控性,即得系统的能控性判别矩阵Q c,然后判断rankQ c,若rank Q c =n=2则可得系统可控;利用Matlab判断系统可控性的程序如图1(a)所示。由程序运行结果可知:rank Q c =n=2,故系统完全可控,可对其进行状态反馈设计。 (b) 求状态反馈器中的反馈矩阵K,因设系统的期望特征根分别为λ1*=-2,λ2*=-4;所以利用Matlab求反馈矩阵K的程序如图1(b)所示。由程序运行结果可知:K即为所求状态反馈控制器的状态反馈矩阵,即由该状态反馈矩阵所构成的状态反馈控制器能够满足题目要求。 图1(a) 系统的能控性图1(b) 状态反馈矩阵 2、(a) 求系统的能控型矩阵Q c,验证若rank Q c

数据结构- 顺序表的基本操作的实现-课程设计-实验报告

顺序表的基本操作的实现 一、实验目的 1、掌握使用VC++上机调试顺序表的基本方法; 2、掌握顺序表的基本操作:建立、插入、删除等运算。 二、实验仪器 安装VC++软件的计算机。 三、实验原理 利用线性表的特性以及顺序存储结构特点对线性表进行相关的基本操作四、实验内容 程序中演示了顺序表的创建、插入和删除。 程序如下: #include #include /*顺序表的定义:*/ #define ListSize 100 typedef struct { int data[ListSize]; /*向量data用于存放表结点*/ i nt length; /*当前的表长度*/ }SeqList; void main() { void CreateList(SeqList *L,int n); v oid PrintList(SeqList *L,int n); i nt LocateList(SeqList *L,int x); v oid InsertList(SeqList *L,int x,int i); v oid DeleteList(SeqList *L,int i); SeqList L;

i nt i,x; i nt n=10; L.length=0; c lrscr(); C reateList(&L,n); /*建立顺序表*/ P rintList(&L,n); /*打印建立后的顺序表*/ p rintf("INPUT THE RESEARCH ELEMENT"); s canf("%d",&x); i=LocateList(&L,x); p rintf("the research position is %d\n",i); /*顺序表查找*/ p rintf("input the position of insert:\n"); s canf("%d",&i); p rintf("input the value of insert\n"); s canf("%d",&x); I nsertList(&L,x,i); /*顺序表插入*/ P rintList(&L,n); /*打印插入后的顺序表*/ p rintf("input the position of delete\n"); s canf("%d",&i); D eleteList(&L,i); /*顺序表删除*/ P rintList(&L,n); /*打印删除后的顺序表*/ g etchar(); } /*顺序表的建立:*/ void CreateList(SeqList *L,int n) {int i; printf("please input n numbers\n"); for(i=1;i<=n;i++) scanf("%d",&L->data[i]); L->length=n;

数据结构线性表实验报告

实验报告 实验一线性表 实验目的: 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 图法判断系统稳定性

顺序表实验报告

嘉应学院计算机学院 实验报告 课程名称数据结构实验名称线性表实验地点锡科405 指导老师巫喜红实验时间第2-3周提交时间第3周 班级1303班姓名魏振辉学号131110108 一、实验目的和要求 编写一个程序algo2-1.cpp,实现顺序表的各种基本运算 二、实验环境、内容和方法 实验内容: 1.初始化线性表L; 2.依次采用尾插法插入a,b,c,d,e元素; 3.输出顺序表L; 4.输出顺序表L的长度; 5.判断顺序表L是否为空; 6.输出顺序表L的第3个元素; 7.输出元素a的位置; 8.在第4个元素位置上插入f元素; 9.输出顺序表L; 10.删除L的第3个元素; 11.输出顺序表L; 12.释放顺序表L。 实验环境:Windows xp Visual C++6.0 三、实验过程描述 (详见本文件夹) 四、结果分析 运行结果如下图所示: 初始化线性表,先定义一个变量num,用while循环配合switch语句的使用来达到在未选择退出即num不等

时一直提示操作的效果,每执行一次操都会先运行fflush(stdin)函数来清除缓存区,避免下次操作受到干扰; 1、往线性表里插入元素,位置和元素用空格隔开; 2、查询线性表是否为空 3、输出顺序表 4、查询线性表长度

5、查询某位置的元素。执行查询操作时先用if语句判断查询元素的函数LocateElem(L,e)返回的值来执行不的操作,当返回的值为0时则所查元素不在线性表中; 6、查询木元素的位置。用if语句判断是否正确输入; 7、删除某元素。 8、释放顺序表 9、退出。用if语句每次执行操作时都判断一次指令是否正确。 五、实验总结

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

实验一:线性表的基本操作 【实验目的】 学习掌握线性表的顺序存储结构、链式存储结构的设计与操作。对顺序表建立、插入、删除的基本操作,对单链表建立、插入、删除的基本操作算法。 【实验内容】 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;

现代控制理论课程报告

现代控制理论课程总结 学习心得 从经典控制论发展到现代控制论,是人类对控制技术认识上的一次飞跃。现代控制论是用状态空间方法表示,概念抽象,不易掌握。对于《现代控制理论》这门课程,在刚拿到课本的时候,没上张老师的课之前,咋一看,会认为开课的内容会是上学期学的控制理论基础的累赘或者简单的重复,更甚至我还以为是线性代数的复现呢!根本没有和现代控制论联系到一起。但后面随着老师讲课的风格的深入浅出,循循善诱,发现和自己想象的恰恰相反,张老师以她特有的讲课风格,精心准备的ppt 课件,向我们展示了现代控制理论发展过程,以及该掌握内容的方方面面,个人觉得,我们不仅掌握了现代控制理论的理论知识,更重要的是学会了掌握这门知识的严谨的逻辑思维和科学的学习方法,对以后学习其他知识及在工作上的需要大有裨益,总之学习了这门课让我受益匪浅。 由于我们学习这门课的课时不是很多,并结合我们学生学习的需求及所要掌握的课程深入程度,张老师根据我们教学安排需要,我们这学期学习的内容主要有:1.绪论;2.控制系统的状态表达式;3.控制系统状态表达式的解;4.线性系统的能空性和能观性;5.线性定常系统的综合。而状态变量和状态空间表达式、状态转移矩阵、系统的能控性与能观性以及线性定常系统的综合是本门课程的主要学习内容。当然学习的内容还包括老师根据多年教学经验及对该学科的研究的一些深入见解。 在现代科学技术飞速发展中,伴随着学科的高度分化和高度综合,各学科之间相互交叉、相互渗透,出现了横向科学。作为跨接于自然科学和社会科学的具有横向科学特点的现代控制理论已成为我国理工科大学高年级的必修课。 经典控制理论的特点 经典控制理论以拉氏变换为数学工具,以单输入-单输出的线性定常系统为主要的研究对象。将描述系统的微分方程或差分方程变换到复数域中,得到系统的传递函数,并以此作为基础在频率域中对系统进行分析和设计,确定控制器的结构和参数。通常是采用反馈控制,构成所谓闭环控制系统。经典控制理论具有明显的局限性,突出的是难以有效地应用于时变系统、多变量系统,也难以揭示系统更为深刻的特性。当把这种理论推广到更为复杂的系统时,经典控制理论就显得无能为力了,这是因为它的以下几个特点所决定。 1.经典控制理论只限于研究线性定常系统,即使对最简单的非线性系统也是无法处理的;这就从本质上忽略了系统结构的内在特性,也不能处理输入和输出皆大于1的系统。实际上,大多数工程对象都是多输入-多输出系统,尽管人们做了很多尝试,但是,用经典控制理论设计这类系统都没有得到满意的结果;2.经典控制理论采用试探法设计系统。即根据经验选用合适的、简单的、工程上易于实现的控制器,然后对系统进行分析,直至找到满意的结果为止。虽然这种设计方法具有实用等很多完整,从而促使现代控制理论的发展:对经典理论的精确化、数学化及理论化。优点,但是,在推理上却是不能令人满意的,效果也

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

东南大学自动化学院 实 验 报 告 课程名称: 自动控制基础 实验名称: 状态观测器的设计 院 (系): 自动化学院 专 业: 自动化 姓 名: 吴静 学 号: 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,代表控制信号,计算机通过数据卡将控制信号送给实际对象;