第一篇:实验二 用Mathematica实现单纯形法
实验二 用Mathematica实现单纯形法
一、实验目的
(1)学习并学会使用Mathematica软件。(2)掌握单纯形法的计算机实现的方法。
二、实验原理
算法的具体步骤如下:书30页 Matnmatica中基本语法的补充:
(一)LinnearProgramming[c,m,b],其中c是行向量,b是列向量,m是矩阵,自变量用列向量x表示,在满足mx>=b且x>=0的区域,求cx的最小值点。需要注意的几点是>=号,以及目标函数求最小值。
举例说明:
minfx 32x3x12x1x2x36x12x24x31s.t.3x2x4x20
231x1,x2,x30
分析与求解:
第三个式子可以改造成两个
3x12x24x32和03x12x24x320
x1x2x36x2x24x3121最后得到用于编写程序的表示形式为3x12x24x3203x2x4x20231x1,x2,x30
输入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}}
(三)表作为向量和矩阵
一层表在线性代数中表示向量, 二层表表示矩阵.例如,矩阵
24
35
可以用数表{{2,3},{4,5}}表示.输入A={{2,3},{4,5}} 则输出{{2,3},{4,5}} 命令MatrixForm[A]把矩阵A显示成通常的矩阵形式.例如,输入命令: MatrixForm[A] 则输出
2435
注:一般情况下,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]。
三、单纯形法解题
maxZ70x1120x2100x3100x4150x58x14x25x33x42x53604x5x27x36x43x520013x110x29x35x49x5300s.t.6x19x25x38x49x51508x4x5x3x2x10012345x1,x2,x3,x4,x50
编写程序如下
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.设1A111122A131,B03124211,4求3AB2A及ATB.则输出3AB及ATB的运算结果分别为
1024414143310
42
41042124810252.设A0312123341231,求A.653.minf=-0.75x1+150x2-0.02x3+6x4
6x200.x304x90.2x5149x200.x302x30.5x014s.t
x13x1,x2,x,x034
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的定义为: N1X[k]通常令ej2Nx[n]en0j2Nnk,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算法思想: 设序列长度为N2L,L为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。 将长度为N2L的序列x[n](n0,1,...,N1),先按n的奇偶分成两组: x[2r]x1[r]x[2r1]x2[r],r=0,1,…,N/2-1 DFT化为: N1N/21N/21X[k]DFT{x[n]}N/21n0x[n]WnkN2rkr0x[2r]W2rkNr0x[2r1]WN(2r1)kN/21r0N/21x1[r]Wx1[r]W2rkNWWkNr0N/21x2[r]WN r0rkN/2kNr0x2[r]WN/22rkrk上式中利用了旋转因子的可约性,即:WNN/21NrkN/21rkWN/2。又令 rkX1[k]r0x[1r]W,/X2[k]2r0x[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/2WN/2X1[N2N/21rkr(kN/2),则后半段的DFT值表达式: rkk]r0x1[r]W2N/2r(Nk)N/21r0x1[r]WN/2X1[k],同样,X2[N2k]X2[k] (k=0,1,…,N/2-1),所以后半段(k=N/2,…,N-1)的DFT值可以用前半段k值表达式获得,中间还利用到WN(N2k)NWN2Wk得到后半段的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算法思想: 设序列长度为N2L,L为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。 在把X[k]按k的奇偶分组之前,把输入按n的顺序分成前后两半: N1N/21nkNN1X[k]DFT{x[n]}N/21N/21x[n]Wn0(nn0N2)kx[n]WnkNnN/2x[n]WNnkn0N/21x[n]WnkNn0x[nNkN2]WNnk Nn0[x[n]x[nN2NkN2]W2N]WN,k0,1,...,N1因为W2N1,则有WX[k](1),所以: kkN/21n0[x[n](1)x[nN2]]WN,k0,1,...,N1 nk按k的奇偶来讨论,k为偶数时: N/21X[2r]n0[x[n]x[nN2]]WN,k0,1,...,N1 N22rnN/21k为奇数时:X[2r1]前面已经推导过WNN/21n0[x[n]x[n]]WN(2r1)n,k0,1,...,N1 2rkWN/2,所以上面的两个等式可以写为: N2]]WN/2,r0,1,...,N/21 N2rnrkX[2r]n0[x[n]x[nN/21X[2r1]n0{[x[n]x[n]]WN}WN/2,r0,1,...,N/21 nnr通过上面的推导,X[k]的偶数点值X[2r]和奇数点值X[2r1]分别可以由组合而成的N/2点的序列来求得,其中偶数点值X[2r]为输入x[n]的前半段和后半段之和序列的N/2点DFT值,奇数点值X[2r1]为输入x[n]的前半段和后半段之差再与WN相乘序列的N/2点DFT值。 令x1[n]x[n]x[nN/21nN2],x2[n][x[n]x[nN/21N2]]WN,则有: nX[2r]n0x1[n]WrnN/2,X[2r1]n0x2[n]WrnN/2,r0,1,...,N21 这样,也可以用两个N/2点DFT来组合成一个N点DFT,组合过程如下图所示: x[n] x[n]x[nN2] x[nN2]-1 WNn [x[n]x[nN2]]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)cos516n,0n256的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的使用方法。 二、实验内容 编写计算yaxi14ii的程序。其中数据...... 题目: 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实现线性系统的时域分析