演算法設計與實現
Ⅰ 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) 指導教師: 陳莉[摘要] 圖像去噪是信號處理中的一個經典問題, 隨著小波理論的不斷完善,它以自身良好的時頻特性在圖像去噪領域受到越來越多的關注。基於小波變換的去噪方法有很多