第一篇:實驗二 用Mathematica實現單純形法
實驗二 用Mathematica實現單純形法
一、實驗目的
(1)學習并學會使用Mathematica軟件。(2)掌握單純形法的計算機實現的方法。
二、實驗原理
算法的具體步驟如下:書30頁 Matnmatica中基本語法的補充:
(一)LinnearProgramming[c,m,b],其中c是行向量,b是列向量,m是矩陣,自變量用列向量x表示,在滿足mx>=b且x>=0的區域,求cx的最小值點。需要注意的幾點是>=號,以及目標函數求最小值。
舉例說明:
minf?x 3?2x?3x12?x1?x2?x3?6??x1?2x2?4x3?1s.t.?3x?2x?4x?20
23?1?x1,x2,x3?0?
分析與求解:
第三個式子可以改造成兩個
3x1?2x2?4x3?2和03x1?2x2?4x3?20
??x1?x2?x3??6?x?2x2?4x3?12?1?最后得到用于編寫程序的表示形式為??3x1?2x2?4x3??20?3x?2x?4x?2023?1??x1,x2,x3?0
輸入c={1,-2,-3};b={-6,12,20,-20};A={{-1,-1,-1},{1,-2,4},{3,2,4},{-3,-2,-4}};LinearProgramming[c,A,b] 得到最優解x={0,2,4} f=-16
(二)通用表的生成函數Table.表是存儲多個數、變量或算式等對象的一種數據結構。一個表用一對花括號表示,它的成員在括號內用逗號隔開,同一個表的成員可以有不同的數據類型,表的成員還可以是一個表(子表)。可以用“t[[n]]”來提取表t中的第n個元素。Mathematica中常用的建表函數是“Table”,其調用格式如下:
Table[f,{i,imin,imax,stepi},{j,jmin,jmax,stepj}] 表的通項為f(f是變量i和j的函數),min,max,step規定了初值、終值、步長,min和step的默認值為1。例如
輸入命令Table[n^3,{n,1,20,2}] 則輸出 {1,27,125,343,729,1331,2197,3375,4913,6859} 輸入命令Table[x*y,{x,3},{y,3}] 則輸出 {{1,2,3},{2,4,6},{3,6,9}}
(三)表作為向量和矩陣
一層表在線性代數中表示向量, 二層表表示矩陣.例如,矩陣
?2??4?
3??5??
可以用數表{{2,3},{4,5}}表示.輸入A={{2,3},{4,5}} 則輸出{{2,3},{4,5}} 命令MatrixForm[A]把矩陣A顯示成通常的矩陣形式.例如,輸入命令: MatrixForm[A] 則輸出
?2??4?3??5??
注:一般情況下,MatrixForm[A]所代表的矩陣A不能參與運算.(四)求矩陣A的轉置的命令:Transpose[A].(五)求方陣A的逆的命令:Inverse[A]
(六)()圓括號表示項的結合順序,如(x+(y^x+1/(2x)));[]方括號表示函數,如Log[x],BesselJ[x,1];{}大括號表示一個“表”(一組數字、任意表達式、函數等的集合),如{2x,Sin[12 Pi],{1+A,y*x}};[[]]雙方括號表示“表”或“表達式”的下標,如a[[2,3]]、{1,2,3}[[1]]=1。
(七)每次運行完成后程序會自動在輸入的式子前面加上In[n],n表示輸入命令的序列號,在輸出的答案上自動加上out[n]。
三、單純形法解題
maxZ?70x1?120x2?100x3?100x4?150x5?8x1?4x2?5x3?3x4?2x5?360?4x?5x2?7x3?6x4?3x5?200?1??3x1?10x2?9x3?5x4?9x5?300s.t.??6x1?9x2?5x3?8x4?9x5?150?8x?4x?5x?3x?2x?10012345???x1,x2,x3,x4,x5?0
編寫程序如下
A={{8,4,5,3,2,1,0,0,0,0}, {4,5,7,6,3,0,1,0,0,0}, {3,10,9,5,9,0,0,1,0,0}, {6,9,5,8,9,0,0,0,1,0}, {8,4,5,3,2,0,0,0,0,1}};c={70,120,100,100,150,0,0,0,0,0};b={360,200,300,150,100};a2=Length[b];a3=Dimensions[A][[2]];b1=Table[i+a3-a2,{i,a2}];b2=Table[i,{i,a3-a2}];b3=Table[i,{i,a3}];x=Table[0,{i,a3}];b4=Table[0,{i,a2}];c1=c[[b2]]-c[[b1]].Inverse[Transpose[Transpose[A][[b1]]]].Transpose[Transpose[A][[b2]]];
Label[100];For[i=1,i≤Length[b2],i=i+1,{ c1=c[[b2]]-c[[b1]].Inverse[Transpose[Transpose[A][[b1]]]].Transpose[Transpose[A][[b2]]];If[c1[[i]] ≤0,{Goto[endif]},{ For[j=1,j≤a2,j=j+1,{ If[(Inverse[Transpose[Transpose[A][[b1]]]].Transpose[A][[b2[[i]]]])[[j]] ≤0,{b4[[j]]=∞}, {b4[[j]]=((Inverse[Transpose[Transpose[A][[b1]]]].b)[[j]])((Inverse[Transpose[Transpose[A][[b1]]]].Transpose[A][[b2[[i]]]])[[j]])}] }];For[j=1,j≤a2,j=j+1,{ If[b4[[j]]==Min[b4],{m=b2[[i]];b2[[i]]=b1[[j]];b1[[j]]=m;Goto[100]}] }] }];Label[endif] }];x[[b1]]=Inverse[Transpose[Transpose[A][[b1]]]].b;Print[“the optimization is : ”];Print[N[x,4]];Print[“the optimization value is : ”];Print[N[c.x]];
實驗練習: 1.設??1?A??1??11?12?2A1??3??1?,B??0??3???12421??1?,??4?求3AB?2A及ATB.則輸出3AB及ATB的運算結果分別為
10244?14???14???33???10?
?4???2
??4??1??04212?4???8???10??2??52.設A??0??3?121233412??3??1?,求A.6?5??3.minf=-0.75x1+150x2-0.02x3+6x4
?6x20?0.x3?04x?9?0.2x514??9x20?0.x3?02x?3?0.5x014s.t?
x?13??x1,x2,x,x?034?
00
第二篇:用c語言實現單純形法的編程
用c語言實現單純形法的編程
#include “stdio.h” #include “math.h” #include 實驗3隊列實現楊輝三角 一、實驗目的 1.熟悉隊列的邏輯結構。2.回顧常用的存儲結構。 3.掌握System.Collection.Queue類的使用方法。 4.熟悉隊列的幾種典型應用,用隊列來解決一些編程問題。5.用循環隊列實現楊輝三角并測試。 二、實驗內容 楊輝三角是除了每一行的第一個元素和最后一個元素是1,其他元素的值是上一行與之相鄰的兩個元素之和。 1.實現循環隊列類 a)兩個構造函數 b)入隊 c)出隊 2.用順序循環隊列實現楊輝三角(一)程序分析 2.1存儲結構 用一片連續的存儲空間來存儲循環隊列中的數據元素,即采用順序存儲的方式。2.2 關鍵算法分析 1.出隊 1)自然語言描述: a.判斷隊列是否空 b.如果隊列空,拋出異常 c.如果隊列不空,則 i.ii.iii.元素出隊 移動對頭指針 隊列長度減1 代碼描述: publicvirtualobjectDequeue()//出隊 { } if(this._size == 0){ //隊下溢 } object obj2 = this._array[this._head];//出隊 this._array[this._head] = null;//刪除出隊元素 //移動隊頭指針 this._head =(this._head + 1)% this._array.Length;this._size--;return obj2;thrownewInvalidOperationException(“隊列為空”);時間復雜度:O(1)2.入隊 自然語言描述: d.判斷隊列是否滿 e.如果隊列滿,則擴容 f.如果隊列不滿,則 a)元素入隊 b)移動隊尾指針 c)隊列長度加1 代碼描述: publicvirtualvoidEnqueue(objectobj)//入隊 { } if(this._size == this._array.Length)//當數組滿員時 { //計算新容量 } this._array[this._tail] = obj;//入隊 this._tail =(this._tail + 1)% this._array.Length;//移動隊尾指針 this._size++;int capacity =(int)((this._array.Length * this._growFactor)/ 100L);if(capacity <(this._array.Length + _MinimumGrow)){ //最少要增長4個元素 } this.SetCapacity(capacity);//調整容量 capacity = this._array.Length + _MinimumGrow;時間復雜度:O(1)3.打印楊輝三角 自然語言描述: 要定義的變量: 1)行:n 2)列: i.ii.空格 j 數值 k 3)左肩:left 4)右肩:right 代碼描述: 三、程序運行結果 四、實驗心得 1.調試時出現的問題及解決的方法 2.心得體會 3.下一步的改進 實 驗 報 告 學生姓名: 學 號: 指導教師: 一、實驗室名稱:數字信號處理實驗室 二、實驗項目名稱:FFT的實現 三、實驗原理: 一.FFT算法思想: 1.DFT的定義: 對于有限長離散數字信號{x[n]},0 ? n ? N-1,其離散譜{x[k]}可以由離散付氏變換(DFT)求得。DFT的定義為: N?1X[k]?通常令e?j2?N?x[n]en?0?j2?Nnk,k=0,1,…N-1 ?WN,稱為旋轉因子。 2.直接計算DFT的問題及FFT的基本思想: 由DFT的定義可以看出,在x[n]為復數序列的情況下,完全直接運算N點DFT需要(N-1)2次復數乘法和N(N-1)次加法。因此,對于一些相當大的N值(如1024)來說,直接計算它的DFT所作的計算量是很大的。 FFT的基本思想在于,將原有的N點序列分成兩個較短的序列,這些序列的DFT可以很簡單的組合起來得到原序列的DFT。例如,若N為偶數,將原有的N 22點序列分成兩個(N/2)點序列,那么計算N點DFT將只需要約[(N/2)·2]=N/2次復數乘法。即比直接計算少作一半乘法。因子(N/2)2表示直接計算(N/2)點DFT所需要的乘法次數,而乘數2代表必須完成兩個DFT。上述處理方法可以反復使用,即(N/2)點的DFT計算也可以化成兩個(N/4)點的DFT(假定N/2為偶數),從而又少作一半的乘法。這樣一級一級的劃分下去一直到最后就劃分成兩點的FFT運算的情況。 3.基2按時間抽取(DIT)的FFT算法思想: 設序列長度為N?2L,L為整數(如果序列長度不滿足此條件,通過在后面補零讓其滿足)。 將長度為N?2L的序列x[n](n?0,1,...,N?1),先按n的奇偶分成兩組: x[2r]?x1[r]x[2r?1]?x2[r],r=0,1,…,N/2-1 DFT化為: N?1N/2?1N/2?1X[k]?DFT{x[n]}?N/2?1?n?0x[n]WnkN?2rk?r?0x[2r]W2rkN??r?0x[2r?1]WN(2r?1)kN/2?1???r?0N/2?1x1[r]Wx1[r]W2rkN?W?WkN?r?0N/2?1x2[r]WN ?r?0rkN/2kN?r?0x2[r]WN/22rkrk上式中利用了旋轉因子的可約性,即:WNN/?21NrkN?/21rk?WN/2。又令 rkX1[k]??r?0x[1r]W,/X2[k]?2?r?0x[r]WN2,則上式可以寫成: /2X[k]?X1[k]?WNX2[k](k=0,1,…,N/2-1) k可以看出,X1[k],X2[k]分別為從X[k]中取出的N/2點偶數點和奇數點序列的N/2點DFT值,所以,一個N點序列的DFT可以用兩個N/2點序列的DFT組合而成。但是,從上式可以看出,這樣的組合僅表示出了X[k]前N/2點的DFT值,還需要繼續利用X1[k],X2[k]表示X[k]的后半段本算法推導才完整。利用旋轉因子的周期性,有:WN/2?WN/2X1[N2N/2?1rkr(k?N/2),則后半段的DFT值表達式: rk?k]??r?0x1[r]W2N/2r(N?k)N/2?1??r?0x1[r]WN/2?X1[k],同樣,X2[N2?k]?X2[k] (k=0,1,…,N/2-1),所以后半段(k=N/2,…,N-1)的DFT值可以用前半段k值表達式獲得,中間還利用到WN(N2?k)N?WN2Wk得到后半段的X[k]值表達式??W,k為:X[k]?X1[k]?WNkX2[k](k=0,1,…,N/2-1)。 這樣,通過計算兩個N/2點序列x1[n],x2[n]的N/2點DFTX1[k],X2[k],可以組合得到N點序列的DFT值X[k],其組合過程如下圖所示: X1[k] X1[k]?WNkX2[k] X2[k] WNnk-1 X1[k]?WNkX2[k] 比如,一個N = 8點的FFT運算按照這種方法來計算FFT可以用下面的流程圖來表示: x(0)W0x(1)W0x(2)W0x(3)W2W0W1W0x(5)W0x(6)W0x(7)W2X(7)W3X(6)W2X(5)X(3)X(2)X(1)X(0)x(4)X(4) 4.基2按頻率抽取(DIF)的FFT算法思想: 設序列長度為N?2L,L為整數(如果序列長度不滿足此條件,通過在后面補零讓其滿足)。 在把X[k]按k的奇偶分組之前,把輸入按n的順序分成前后兩半: N?1N/2?1nkNN?1X[k]?DFT{x[n]}?N/2?1N/2?1?x[n]Wn?0?(n??n?0N2)kx[n]WnkN??n?N/2x[n]WNnk??n?0N/2?1x[n]WnkN??n?0x[n?NkN2]WNnk ?N?n?0[x[n]?x[n?N2NkN2]W2N]?WN,k?0,1,...,N?1因為W2N??1,則有WX[k]???(?1),所以: kkN/2?1?n?0[x[n]?(?1)x[n?N2]]?WN,k?0,1,...,N?1 nk按k的奇偶來討論,k為偶數時: N/2?1X[2r]??n?0[x[n]?x[n?N2]]?WN,k?0,1,...,N?1 N22rnN/2?1k為奇數時:X[2r?1]?前面已經推導過WNN/2?1?n?0[x[n]?x[n?]]?WN(2r?1)n,k?0,1,...,N?1 2rk?WN/2,所以上面的兩個等式可以寫為: N2]]?WN/2,r?0,1,...,N/2?1 N2rnrkX[2r]??n?0[x[n]?x[n?N/2?1X[2r?1]??n?0{[x[n]?x[n?]]?WN}WN/2,r?0,1,...,N/2?1 nnr通過上面的推導,X[k]的偶數點值X[2r]和奇數點值X[2r?1]分別可以由組合而成的N/2點的序列來求得,其中偶數點值X[2r]為輸入x[n]的前半段和后半段之和序列的N/2點DFT值,奇數點值X[2r?1]為輸入x[n]的前半段和后半段之差再與WN相乘序列的N/2點DFT值。 令x1[n]?x[n]?x[n?N/2?1nN2],x2[n]?[x[n]?x[n?N/2?1N2]]?WN,則有: nX[2r]??n?0x1[n]?WrnN/2,X[2r?1]??n?0x2[n]?WrnN/2,r?0,1,...,N2?1 這樣,也可以用兩個N/2點DFT來組合成一個N點DFT,組合過程如下圖所示: x[n] x[n]?x[n?N2] x[n?N2]-1 WNn [x[n]?x[n?N2]]WNn 二.在FFT計算中使用到的MATLAB命令: 函數fft(x)可以計算R點序列的R點DFT值;而fft(x,N)則計算R點序列的N點DFT,若R>N,則直接截取R點DFT的前N點,若R 四、實驗目的: 離散傅氏變換(DFT)的目的是把信號由時域變換到頻域,從而可以在頻域分析處理信息,得到的結果再由逆DFT變換到時域。FFT是DFT的一種快速算法。在數字信號處理系統中,FFT作為一個非常重要的工具經常使用,甚至成為DSP運算能力的一個考核因素。 本實驗通過直接計算DFT,利用FFT算法思想計算DFT,以及使用MATLAB函數中的FFT命令計算離散時間信號的頻譜,以加深對離散信號的DFT變換及FFT算法的理解。 五、實驗內容: a)計算實數序列x(n)?cos5?16n,0?n?256的256點DFT。 b)計算周期為1kHz的方波序列(占空比為50%,幅度取為+/-512,采樣頻率為25kHz,取256點長度)256點DFT。 六、實驗器材(設備、元器件): 安裝MATLAB軟件的PC機一臺,DSP實驗演示系統一套。 七、實驗步驟: (1)先利用DFT定義式,編程直接計算2個要求序列的DFT值。 (2)利用MATLAB中提供的FFT函數,計算2個要求序列的DFT值。(3)(拓展要求)不改變序列的點數,僅改變DFT計算點數(如變為計算1024點DFT值),觀察畫出來的頻譜與前面頻譜的差別,并解釋這種差別。通過這一步驟的分析,理解頻譜分辨力的概念,解釋如何提高頻譜分辨力。 (4)利用FFT的基本思想(基2-DIT或基2-DIF),自己編寫FFT計算函數,并用該函數計算要求序列的DFT值。并對前面3個結果進行對比。 (5)(拓展要求)嘗試對其他快速傅立葉變換算法(如Goertzel算法)進行MATLAB編程實現,并用它來計算要求的序列的DFT值。并與前面的結果進行對比。 (6)(拓展要求)在提供的DSP實驗板上演示要求的2種序列的FFT算法(基2-DIT),用示波器觀察實際計算出來的頻譜結果,并與理論結果對比。 八、實驗數據及結果分析: 程序:(1)對要求的2種序列直接進行DFT計算的程序 (2)對要求的2種序列進行基2-DIT和基2-DIF FFT算法程序(3)對要求的2種序列用MATLAB中提供的FFT函數進行計算的程序 結果:(1)對2種要求的序列直接進行DFT計算的頻域波形 (2)對2種要求的序列進行基2-DIT和基2-DIF FFT算法頻域波形(3)對2種要求的序列用MATLAB中提供的FFT函數計算的頻域波形。(4)(拓展要求)分析利用上面的方法畫出的信號頻譜與理論計算出來的頻譜之間的差異,并解釋這種差異。 (5)(拓展要求)保持序列點數不變,改變DFT計算點數(變為1024點),觀察頻譜的變化,并分析這種變化,由此討論如何提高頻譜分辨力的問題。 九、實驗結論: 十、總結及心得體會: 十一、對本實驗過程及方法、手段的改進建議: 實驗九 Servlet實現用戶留言板 專業班級: 軟件1102學號:201116040225姓名:李云娜 一、實驗目的綜合應用JSP+JavaBean+Servlet+JDBC技術,設計一個留言板,掌握Java Web開發的基本技術和方法。 二、實驗內容 1.設計數據庫,保存用戶及留言信息。 2.應用JSP技術,設計留言板主頁面。 3.應用JavaBean,保存留言信息。 4.應用Servlet技術,設計數據庫存儲控制和信息顯示控制。 5.設計JSP頁面,實現留言信息顯示。 三、實驗方案 四、實驗結果 五、分析和總結 文檔為doc格式 實驗二 小數運算的實現 一、實驗目的 1.掌握小數運算的原理。 2.熟悉CCS 開發軟件的使用; 3. 熟悉SIMULATOR的使用方法。 二、實驗內容 編寫計算y??axi?14ii的程序。其中數據...... 題目: 2013 PLC組態一體化教學實驗平臺設計與實現 單位部室:陽煤職教中心實踐教學部 專 業:機電一體化與自動控制 作 者:陳志鵬 指導教師: 年10月23日 PLC組態一體化教學實驗平...... 實驗一詞法分析器的設計與實現一、 實驗目的1. 了解并掌握詞法分析器的原理及工作過程
2. 理解詞法分析器的狀態圖表示方法二、 實驗內容用適當的程序設計語言編制一個詞法...... 實驗八網絡協議分析和實現1. 實驗目的
掌握網絡應用程序的開發方法;
掌握Client/ Server結構軟件的設計與開發方法
掌握Socket機制的工作原理2. 實驗前的準備
閱讀教材關于TC...... 串的模式匹配問題實驗總結 1實驗題目: 實現Index(S,T,pos)函數。其中,Index(S,T,pos)為串T在串S的第pos個字符后第一次出現的位置。 2實驗目的: 熟練掌握串模式匹配算法。 3...... 實驗5 利用三層交換機實現VLAN間路由 采用單臂路由的方式實現VLAN間的路由具有速度慢(受到接口帶寬限制)、轉發速率低(路由器采用軟件轉發,轉發速率比采用硬件轉發方式的交換機...... 大學物理實驗網絡視頻教學平臺的設計與實現 內容摘要 隨著網絡技術在教育中的應用日益廣泛和深入,網絡教育提供了越來越豐富的資源和環境,使網絡教學真正成為現實。構建基于...... 實驗二用MATLAB實現線性系統的時域分析 [實驗目的] 1.研究線性系統在典型輸入信號作用下的暫態響應; 2.熟悉線性系統的暫態性能指標; 3.研究二階系統重要參數阻尼比ξ對系統動態......Dn[K])K=i;for(i=0;i 第三篇:實驗三 隊列實現楊輝三角
第四篇:數字信號處理實驗-FFT的實現
第五篇:實驗10 Servlet實現用戶留言板
聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。 DSP實驗小數運算的實現(范文模版)
PLC一體化教學實驗平臺設計與實現
實驗一詞法分析器的設計與實現
實驗8 網絡協議分析和實現(綜合設計性)
串的模式匹配問題實驗總結(用C實現)
實驗五利用三層交換機實現VLAN間路由總結
大學物理實驗網絡視頻教學平臺的設計與實現(范文)
00講稿實驗二 用MATLAB實現線性系統的時域分析