当前位置:首页 » 操作系统 » 算法设计与实现

算法设计与实现

发布时间: 2023-05-20 01:56:37

Ⅰ pid控制算法的DSP程序设计与实现

typedef struct PID {

int SetPoint; // 设定目标 Desired value

int Proportion; // 比例常数 Proportional Const
int Integral; // 积分常数 Integral Const
int Derivative; // 微分常数 Derivative Const

unsigned int LastError; // Error[-1]
unsigned int PrevError; // Error[-2]
unsigned int SumError; // Sums of Errors

// double Lastout; //上次输出
unsigned int E1; // e1>e2
unsigned int E2; //

int Pmax;//上限
int Pmin;//下限

} PID;

/*====================================================================================================
PID计算部分,遇限消弱积分PID防饱和,积分分离算法实现
=====================================================================================================*/

int PIDCalc( PID *pp, unsigned int NextPoint )
{
int dError,
Error;

Error = pp->SetPoint - NextPoint; //偏差
if (Error<=-pp->E1) return (pp->Pmin); //饱和
else if (Error>=pp->E1)
return (pp->Pmax);
else
{
dError = pp->LastError - pp->PrevError; // 当前微分
pp->PrevError = pp->LastError;
pp->LastError = Error;
if (Error>=pp->E2||Error<=-pp->E2) //分离
return (pp->Proportion * Error // 比例项
+ pp->Derivative * dError );//PD,考虑限幅
else //位置式
{
pp->SumError += Error; // 积分
return (pp->Proportion * Error // 比例项
+ pp->Integral * pp->SumError // 积分项
+ pp->Derivative * dError // 微分项 //PID
);
}
}
}

Ⅱ 数据结构算法设计C++实现

所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:
输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。
输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。 这里,我们简单介绍几种排序方法,直接插入排序、希儿排序、冒泡排序、快速排序、直接选择排序,文中所提及的代码在IE6下测试通过。 直接插入排序基本思想
假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。 算法描述
function InsertSort(arr) { //插入排序->直接插入法排序
var st = new Date();
var temp, j;
for(var i=1; i<arr.length; i++) {
if((arr[i]) < (arr[i-1])) {
temp = arr[i];
j = i-1;
do {
arr[j+1] = arr[j];
j--;
}
while (j>-1 && (temp) < (arr[j]));
arr[j+1] = temp;
}//endif
}
status = (new Date() - st) + ' ms';
return arr;
} 希尔排序基本思想
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。 算法描述
function ShellSort(arr) { //插入排序->希儿排序
var st = new Date();
var increment = arr.length;
do {
increment = (increment/3|0) + 1;
arr = ShellPass(arr, increment);
}
while (increment > 1) status = (new Date() - st) + ' ms';
return arr;
}
function ShellPass(arr, d) { //希儿排序分段执行函数
var temp, j;
for(var i=d; i<arr.length; i++) {
if((arr[i]) < (arr[i-d])) {
temp = arr[i]; j = i-d;
do {
arr[j+d] = arr[j];
j = j-d;
}
while (j>-1 && (temp) < (arr[j]));
arr[j+d] = temp;
}//endif
}
return arr;
} 再举个例子:#include "iostream.h"
void shellSort(int *arr, int len, int *p, int len1);
int main()
{
int num[15]={100,12,20,31,1,5,44,66,61,200,30,80,150,4,8};
int i;
cout<<"待排数据d=(5,3,1): ";
for(i=0;i<15;i++)
{
cout<<num[i]<<" ";
}
int s[3]={5,3,1};
shellSort(num,15, s,3);
cout<<"\n";
return 0;
} void shellSort(int *arr, int len, int *p, int len1)
{
for (int i = 0; i < len1; i++)
{
int d = p[i];
for (int n = 0; n < d; n ++)
{
for (int j = n + d; j < len; j = j + d)
{
if (arr[j] < arr[j - d])
{
int tmp = arr[j];
for (int k = j - d; k >= 0 && arr[k] > tmp; k = k - d)
{
arr[k + d] = arr[k];
}
arr[k + d] = tmp;
}
}
}
cout<<"第"<<i+1<<"趟排序结果:";
for(int m=0;m<15;m++)
cout<<arr[m]<<" ";
cout<<"\n";
}
}
冒泡排序基本思想
将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
算法描述
function BubbleSort(arr) { //交换排序->冒泡排序
var st = new Date();
var temp;
var exchange;
for(var i=0; i<arr.length; i++) {
exchange = false;
for(var j=arr.length-2; j>=i; j--) {
if((arr[j+1]) < (arr[j])) {
temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
exchange = true;
}
}
if(!exchange) break;
}
status = (new Date() - st) + ' ms';
return arr;
} 快速排序基本思想
将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。
在R[low..high]中任选一个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pivotpos-1)和R[pivotpos+1..high],并使左边子区间中所有记录的关键字均小于等于基准记录(不妨记为pivot)的关键字pivot.key,右边的子区间中所有记录的关键字均大于等于pivot.key,而基准记录pivot则位于正确的位置(pivotpos)上,它无须参加后续的排序。 算法描述
function QuickSort(arr) { //交换排序->快速排序
if (arguments.length>1) {
var low = arguments[1];
var high = arguments[2];
} else {
var low = 0;
var high = arr.length-1;
}
if(low < high){
// function Partition
var i = low;
var j = high;
var pivot = arr[i];
while(i<j) {
while(i<j && arr[j]>=pivot)
j--;
if(i<j)
arr[i++] = arr[j];
while(i<j && arr[i]<=pivot)
i++;
if(i<j)
arr[j--] = arr[i];
}//endwhile
arr[i] = pivot;
// end function
var pivotpos = i; //Partition(arr,low,high);
QuickSort(arr, low, pivotpos-1);
QuickSort(arr, pivotpos+1, high);
} else
return;
return arr;
} 直接选择排序基本思想
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:无序区为R[1..n],有序区为空。
②第1趟排序
在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1..1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……
③第i趟排序
第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R[i..n](1≤i≤n-1)。该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R[i]交换,使R[1..i]和R[i+1..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
这样,n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果。 算法描述
function SelectSort(arr) { //选择排序->直接选择排序
var st = new Date();
var temp;
for(var i=0; i<arr.length; i++) {
var k = i;
for(var j=i+1; j<arr.length; j++) {
if((arr[j]) < (arr[k]))
k = j;
}
if (k != i){
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
status = (new Date() - st) + ' ms';
return arr;
}
从运行速度上来看,快速排序是最快的。 另外把二分查找算法也放这里算了:template<class Type> int BinarySearch(Type a[],const Type& x,int n) { int left=0; int right=n-1; while(left<=right){ int middle=(left+right)/2; if (x==a[middle]) return middle; if (x>a[middle]) left=middle+1; else right=middle-1; } return -1; }

Ⅲ 算法设计与程序实现:java,100元的具体划分方案,可选面值有1元,10元,20元,50元,100元.

for( int a=0,loopCountA=100/100; a<=loopCountA; a++ )
for( int b=0,loopCountB=(100-a*100)/50; b<=loopCountB; b++ )
for( int c=0,loopCountC=(100-a*100-b*50)/20; c<=loopCountC; c++ )
for( int d=0,loopCountD=(100-a*100-b*50-c*20)/10; d<=loopCountD; d++ )
for( int e=0,loopCountE=(100-a*100-b*50-c*20-d*10)/1; e<=loopCountE; e+=10 )
if( (a*100+b*50+c*20+d*10+e)==100 )
System.out.println("1元:"+e+"张;10元:"+d+"张;20元:"+c+"张;50元:"+b+"张;100元:"+a+"张。");

改进了下,速度快了一些。

Ⅳ 基于小波变换和全变分的图像去噪算法设计与实现本科毕设难吗

题目基于小波变换的图像去噪方法研究学生姓名陈菲菲学号 1113024020 所在学院物理与电信工程学院专业班级通信工程专业1 101 班指导教师陈莉完成地点物理与电信工程学院实验中心 201 5年5月渗厅 20日 I 毕业论文﹙设计﹚任务书院(系) 物理与电信工程学院专业班握喊野级通信 1 101 班学生姓名陈菲菲一、毕业论文﹙设计﹚题目基于小波变换的图像去噪方法研究二、毕业论文﹙设计﹚工作自 201 5年3月1日起至 201 5年6月20 日止三、毕业论文﹙设计﹚进行地点: 物理与电信工程学院实验室四、毕业论文﹙设计﹚的内容 1、图像处理中,输入的是质量低的图像,输出的是改善质量后的图像。常用的图像处理方法有图像增强、复原、编码、压缩等。一般图像的能量主要集中在低频区域中,只有图像的细节部的能量才处于高频区域中。因为在图像的数字化和传输中常有噪声出现,而这部分干扰信息主要集中在高频区域内,所以消去噪声的一般方法是衰减高频分量或称低通滤波,但与之同时好的噪方法应该是既能消去噪声对图像的影响又不使图像细节变模糊。为了改善图像质量,从图像提取有效信息,必须对图像进行去噪预处理。设计任务: (1 )整理文献,研究现有基于小波变换的图像去噪算法,尝试对现有算法做出改进; (2 )在 MATLAB 下仿真验证基于小波变换的图像去噪算法。 2 、要求以论文形式提交设计成果,应掌握撰写毕业论文的方法, 应突出“目标,原理,方法,结论”的要素,对所研究内容作出详细有条理的阐述。进度安排: 1-3 周:查找资料,文献。 4-7 周:研究现有图像去噪技术,对基于小波变换的图像去噪算法作详细研究整理。 8-11 周: 研究基于小波的图像去噪算法,在 MATLAB 下对算法效果真验证。 12-14 周:分析试验结果,对比各种算法的优点和缺点,尝试段喊改进算法。 15-17 周:撰写毕业论文,完成毕业答辩。指导教师陈莉系(教研室) 系( 教研室) 主任签名批准日期 接受论文( 设计) 任务开始执行日期 学生签名 II 基于小波变换的图像去噪方法研究陈菲菲( 陕西理工学院物理与电信工程学院通信 1 101 班,陕西汉中 72300 0) 指导教师: 陈莉[摘要] 图像去噪是信号处理中的一个经典问题, 随着小波理论的不断完善,它以自身良好的时频特性在图像去噪领域受到越来越多的关注。基于小波变换的去噪方法有很多

热点内容
电子产品存储要求 发布:2025-04-23 07:58:30 浏览:214
imac存储硬盘位置 发布:2025-04-23 07:55:18 浏览:327
sql远程连接端口 发布:2025-04-23 07:55:16 浏览:782
vmos脚本不生效 发布:2025-04-23 07:48:25 浏览:991
奔驰怎么连接安卓的手机 发布:2025-04-23 07:39:54 浏览:594
ipad怎么设置长密码 发布:2025-04-23 07:39:54 浏览:573
冷媒压缩机 发布:2025-04-23 07:39:53 浏览:223
php1970 发布:2025-04-23 07:30:36 浏览:854
c语言中e的表示 发布:2025-04-23 07:12:25 浏览:810
活跃度算法 发布:2025-04-23 07:10:41 浏览:110