数学建模常用软件选讲1

更新时间:2024-07-02 14:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数学建模常用软件选讲

第3章 lingo的使用

LINGO是Linear Interactive and General Optimizer的缩写,即“交互式的线性和通用优化求解器”,由美国LINDO系统公司(Lindo System Inc.)推出的,可以用于求解非线性规划,也可以用于一些线性和非线性方程组的求解等,功能十分强大,是求解优化模型的最佳选择。其特色在于内置建模语言,提供十几个内部函数,可以允许决策变量是整数(即整数规划,包括 0-1 整数规划),方便灵活,而且执行速度非常快。

3.1 Lingo程序特点:

(1)目标函数必须由“min =”或“max =”开头; (2)每条语句后必须使用分号“;”结束。 (3)变量与其系数间要有乘号。 3.2 线性规划问题

例 如何在LINGO中求解如下的LP问题:

mins.t.2x1?3x2x1?x2?350x1?1002x1?x2?600x1,x2?0

在模型窗口中输入如下代码: min=2*x1+3*x2; x1+x2>=350; x1>=100; 2*x1+x2<=600;

然后点击工具条上的按钮 即可。

3.3 二次规划问题

目标函数是二次函数,约束条件是线性的规划问题 例如:

minf?3x2?y2?xy?0.4y?1.2x?0.9y?1.1?s.t.?x?y?1?y?0.7?

min=3*x^2+y^2-x*y+0.4*y; 1.2*x+0.9*y>1.1; x+y=1; y<0.7;

3.4 非线性规划问题

《数学模型》(第三版)(姜启源等编)第四章第三节例1中,解法三得到一个非线性规划模型:

max z?2x1?3x2?4x3 s.. 1.5tx1?3x2?5x3?600 280x1?250x2?400x3?60000 x1(x1?80)?0 x2(x2?80)?0 x3(x3?80)?0

x1 , x2 , x3均为整数 输入lingo:

MAX= 2 * X1 + 3 * X2 + 4 * X3 ; 1.5 * X1 + 3 * X2 + 5 * X3 <= 600 ; 280 * X1 + 250 * X2 + 400 * X3 <= 60000 ; X1*( X1-80) >= 0 ; X2*( X2-80) >= 0 ; X3*( X3-80) >= 0 ;

@GIN( X1); @GIN( X2); @GIN( X3); 注:

变量界定函数实现对变量取值范围的附加限制,共4种: @bin(x) 限制x为0或1 @bnd(L,x,U) 限制L≤x≤U

@free(x) 取消对变量x的默认下界为0的限制,即x可以取任意实数 @gin(x) 限制x为整数

第5章 matlab的使用

Matlab是matrix laboratory的缩写,是矩阵实验室的意思,它是一个功能强大的数学工具软件。Matlab的产生是与数学计算紧密联系在一起的,1980年美国新墨西哥大学计算机科学系主任cleve Moler在给学生讲授线性代数课程时,发现学生利用高级语言编程解决线性代数问题花费很多时间,为了减轻学生编程的负担,用高级语言编写了最早的MATLAB。

Matlab语言是一种用于工程计算的高性能语言,它主要包括两大内容:核心函数和工具箱。Matlab的典型应用包括以下几个方面:数学计算、算法开发、建模及仿真、数据分析及可视化、科学及工程绘图、应用开发。

5.1 matlab的工作环境

1.启动和退出matlab

启动matlab程序与启动其它windows程序一样,通常通过单击桌面上的相应图标来执行。当然,也可以通过“开始”菜单中相应命令启动。

退出matlab时,也可以像退出其它windows程序一样操作,也可以在命令窗口中键入quit或exit来退出。

2.菜单和工具栏

Matlab的菜单和工具界面与windows程序的界面类似,用户只要稍加实践就可以掌握其功能和使用方法。菜单的内容会随着在命令窗口执行不同命令而作出相应改变。

3.命令窗口

命令窗口是matlab的主要交互窗口,用于输入命令并显示除图形以外的所有执行结果。Matlab命令窗口中的“>>”为运算提示符,表示matlab处于准备状态。当在提示符后输入一段程序或一段运算式后按“回车”键,matlab会给出计算结果,并再次进入准备状态。单击命令窗口右上角的箭头按钮可以使命令窗口脱离主窗口而成为一个独立的窗口。

常用控制命令及其功能: clc:清除命令窗口中的内容 clear:清除工作空间中的变量 clf:清除图形窗

type :显示指定的M文件的内容

exit/quit:结束matlab会话,程序完成,如果没有明确保存,则变量中的数据丢失

help :获取在线帮助 4.历史命令窗口

该窗口主要用于记录所有执行过的命令,在默认设置下,该窗口会保留自安装后所有使用过命令的历史记录,并标明使用时间。同时,用户可以通过用鼠标双击某一历史命令来重新执行该命令。与命令窗口类似,该窗口也可以成为一个独立的窗口。

选中该窗口,然后单击鼠标右键,弹出一个菜单,用户可以通过此菜单删除或粘贴历史记录,也可以为选中的表达式或命令创建一个M文件。

5.当前工作目录窗口

当前工作目录是指matlab运行文件时的目录。只有在当前工作目录或搜索路径下的文件、函数可以被运行或调用。在窗口中可显示或改变当前工作目录,还可以显示当前工作目录下的文件。

6.工作空间窗口

在工作空间窗口中将显示目前内存中所有的matlab变量的变量名、数据结构、字节数以及类型等信息。

5.2 基本运算与函数

在MATLAB下进行基本数学运算,只需将运算式直接打入提示号(>>)之后,并按入Enter键即可。例如:

>> (5*2+1.3-0.8)*10/25

ans =4.2000 又如: 求10的阶乘 >> prod(1:10)

15

求C30可用

>> nchoosek(30,15)

MATLAB会将运算结果直接存入一变量ans,代表MATLAB运算后的答案(Answer)并显示其数值于屏幕上。

我们也可将上述运算式的结果设定给另一个变量x: x = (5*2+1.3-0.8)*10^2/25 x = 42

此时MATLAB会直接显示x的值。

由上例可知,MATLAB认识所有一般常用到的加(+)、减(-)、乘(*)、除(/)的数学运算符号,以及幂次运算(^)。

若不想让MATLAB每次都显示运算结果,只需在运算式最后加上分号(;)即可,如下例:

y = sin(10)*exp(-0.3*4^2);

若要显示变量y的值,直接键入y即可: >>y y =-0.0045

在上例中,sin是正弦函数,exp是指数函数,这些都是MATLAB常用到的数学函数,函数里的参数必须用圆括号括起来。

1.三角函数

MATLAB常用的三角函数

名称 含义 名称 含义 名称 含义 Sin(x) 正弦 asin(x) 反正sec(x) 正割 弦 cos(x) 余弦 acos(x) 反余弦 csc(x) 余割 tan(x) 正切 atan(x) 反正切 asec(x) 反正割 cot(x) 余切 acot(x) 反余切 acsc(x) 反余割 pi:常数? 2.指数和对数函数

名称 含义 名称 含义 名称 含义 exp(x) E为底的指数 log10(x) 10为底的对数 pow2(x) 2为底的指数 log(x) 自然对数

log2(x) 2为底的对数 sqrt(x) 平方根 5.3 数组、矩阵及其运算

数组或矩阵是matlab最基础的内容之一,几乎所有的数据都是用数组的形式存储的,这就是matlab又被称为矩阵实验室的原因。

5.3.1 向量的创建

5.3.1.1 一维数组(向量)的创建

一维数组(向量)创建有直接输入法、步长生成法、定数线性采样法等。 1.直接输入法

(1)使用分号,创建一维列向量 >> x1=[pi;log10(100);7*2;2^3] x1 = 3.1416 2.0000 14.0000 8.0000

(2)使用空格或逗号,创建一维行数组

>> x2=[pi log10(100) 7*2 2^3] x2 =

3.1416 2.0000 14.0000 8.0000 2.步长生成法

采用通用格式a:step:b。其中a表示数组的第一个元素;step表示数组的间隔,即步长;b表示数组的最后一个元素。如果省略step,默认值为1。

>> x3=1:2:10 x3 =

1 3 5 7 9 3.定数线性采样法

在设定了总个数的条件下,均匀采样分布生成一维行向量。 采用通用格式:x=linspace(a,b,n)

其中a,b分别是数组的第一个和最后一个元素,n表示采样点数。 例如:

>> x=linspace(1,10,5) x =

1.0000 3.2500 5.5000 7.7500 10.0000 5.3.1.2 一维向量元素寻访和赋值 1.子向量的寻访

>> x=linspace(1,10,5) %定义向量 x =

1.0000 3.2500 5.5000 7.7500 10.0000

>> x(2) %查看向量第二个元素 ans = 3.2500

>> x([1 3 5]) %查看向量第一、三、五个元素组成的子向量 ans =

1.0000 5.5000 10.0000

>> x(3:5) %查看向量第三到第五个元素组成的子向量 ans =

5.5000 7.7500 10.0000 2.子向量的赋值 >> x(2)=5 x =

1.0000 5.0000 5.5000 7.7500 10.0000 >> x(4) = [] % 删除第四个元素

MATLAB亦可取出向量的一个元素或一部份来做运算:

y=x(2)*3+x(4) % 取出x的第二个元素3倍后和x的第四个元素来相加,最后赋给变量y。

5.3.4.向量的常用函数

min(x): 向量x的元素的最小值 max(x): 向量x的元素的最大值 mean(x): 向量x的元素的平均值 median(x): 向量x的元素的中位数 std(x): 向量x的元素的标准差 diff(x): 向量x的相邻元素的差 sort(x): 对向量x的元素进行排序 length(x): 向量x的元素个数

sum(x): 向量x的元素总和 prod(x): 向量x的元素总乘积 dot(x, y): 向量x和y的内 积

5.4 matlab求解数学问题

5.4.1 符号表达式的生成

在数学分析中,常常需要做极限、微分、求导数等运算,MATLAB称这些运算为符号运算。MATLAB的符号运算功能是通过调用符号运算工具箱内的工具实现,其内核是借用Maple数学软件。MATLAB的符号运算工具箱包含了微积分运算、化简和代换、解方程等几个方面的工具。

MATLAB符号运算工具箱处理的对象主要是符号变量与符号表达式。要实现其符号运算,首先需要将处理对象定义为符号变量或符号表达式,其定义格式如下:

格式1: sym(‘变量名’)或sym(‘表达式’) 功能:定义一个符号变量或符号表达式。 例如:

>>sym(‘x‘)%定义变量x为符号变量 >>sym(‘x+1')%定义表达式x+1为符号表达式

格式2: syms变量名1 变量名2 ?? 变量名n 功能:定义变量名1、变量2??、变量名n为符号变量。 注意是变量名之间要用空格或分号隔开 5.4.2 符号方程的求解 1.方程的解 命令格式

X=solve(‘eqn’) %直接求出方程eqn的根

X=solve(‘eqn’,’x’) %直接求关于指定变量的方程eqn的根 例如:求方程x2?5x?6?0的根

y=1; k=1; while k<=x y=y*k; k=k+1; end

自定义函数定义好后就可以调用,调用格式为:函数名(参数表)。 例2、利用例1编写的函数计算4!,10!,在命令窗口执行该函数,马上得到结果:

>> njc(4) ans = 24

5.6.2 matlab程序控制结构

matlab语言的程序结构与其它高级语言是一致的,分为顺序结构,循环结构,分支结构。

(1)顺序结构 —— 依次顺序执行程序的各条语句

(2)循环结构 —— 被重复执行的一组语句,循环是计算机解决问题的主要手段。

(3)分支结构——根据一定条件来选择执行各条语句。

5.6.2.1 循环语句 1.for — end循环 语法为:

for i = 表达式(表达式为一个向量) 可执行语句 end

例:利用for循环求1+2+3+4+5的值 sum=0; for i=1:5 sum=sum+i; end

2.while — end 循环

while循环将循环体中的语句循环执行不定次数。 语法为: while 表达式 循环体语句 end

表达式一般是由逻辑运算和关系运算以及一般运算组成的,以判断循环的进行和停止;只要表达式的值 非0,继续循环;直到表达式值为0,循环停止。

例:用while循环求1到100间整数的和 sum=0; i=1;

while i<=100 sum=sum+i; i=i+1; end sum

5.6.2.2分支结构 1.if-else-end结构 有三种格式

A)if 表达式 执行语句 end

B)if 表达式 语句1 else 语句2 end

C)if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 · · · else 语句n end

例如,从键盘中输入一个正数,然后判断是奇数(odd number)还是偶数(even number)。

s=input('please input positive integer:') if mod(s,2)==0

‘This is a even number!’

else

‘This is a odd number!’ end

2.switch分支结构

switch语句可以替代多分支的if语句,且switch语句简洁明了,可读性更好,其格式为:

switch 计算表达式 case 数值1 语句1 case 数值2 语句2 ? otherwise 语句n End

例:用switch结构将百分制的学生成绩转换为五种等级的成绩输出 clear

result=input('请输入学生的成绩:'); switch fix(result/10) case 9 y='优秀'; case 8 y='良好'; case 7 y='中等';

case 6 y='及格'; otherwise y='不及格'; end y

练习:输入10个学生成绩,并找出成绩最好的前三位,并输出其分数。 for i=1:10

grade(i)=input('请输入十个学生的成绩:') end

[value,idx]=sort(grade) fore3=grade(idx(8:10))

5.7 曲线拟合

在大量的应用领域中,人们经常面临用一个解析函数描述数据的问题,对这个问题有两种方法:在插值法里,数据假定是正确的,要求以某种方法估算出新的数据点;在曲线拟合或回归中,人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过每个数据点。

Matlab曲线拟合常见的有多项式拟合,其命令格式为:p=polyfit(x,y,N) 该函数对向量x,y所确定的原始数据构造N阶多项式p(x),使p(x)与已知数据点间函数值之差的平方和最小。当N=1时,多项式拟合就是线性拟合。一般而言,N个数据点可以确定一个N-1阶多项式。看一个例子:

x=linspace(0,1,11)

y=[-0.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.21] n1=1 n2=2

n10=10

p1=polyfit(x,y,n1) p2=polyfit(x,y,n2) p10=polyfit(x,y,n10) xi=linspace(0,1,100) z1=polyval(p1,xi) z2=polyval(p2,xi) z10=polyval(p10,xi)

plot(x,y,'or',xi,z1,'k:',xi,z2,'b-',xi,z10,'g*')

注意:由图可以看得出,二阶拟合比较好。一般来说,高阶多项式给出很差的数值特性,人们不应选择比所需的阶次高的多项式。随着多项式阶次的提高,曲线变得不够光滑,因为较高阶次多项式可多次求导。

也可以用命令curvefit(‘fun’,x0,x,y)作曲线拟合,例如,某数据近似符合规律y(t)?a?be?Kt,已知从100到1000时分别对应于(x0是初值,应适当取)

cdata=0.00001*[454 499 535 565 590 610 626 639 650 659] 求a,b,k使?(a?be?Kt?cdata)2尽可能地小。

i?110tdata=linspace(100,1000,10)

cdata=0.00001*[454 499 535 565 590 610 626 639 650 659] x0=[0.02,0.5,0.01] %x0=[0.001 0.0051 0.01]

x=curvefit('curvefun',x0,tdata,cdata) ydata=x(1)+x(2)*exp(-x(3)*tdata) plot(tdata,ydata,'r',tdata,cdata,'-b')

(完)

n10=10

p1=polyfit(x,y,n1) p2=polyfit(x,y,n2) p10=polyfit(x,y,n10) xi=linspace(0,1,100) z1=polyval(p1,xi) z2=polyval(p2,xi) z10=polyval(p10,xi)

plot(x,y,'or',xi,z1,'k:',xi,z2,'b-',xi,z10,'g*')

注意:由图可以看得出,二阶拟合比较好。一般来说,高阶多项式给出很差的数值特性,人们不应选择比所需的阶次高的多项式。随着多项式阶次的提高,曲线变得不够光滑,因为较高阶次多项式可多次求导。

也可以用命令curvefit(‘fun’,x0,x,y)作曲线拟合,例如,某数据近似符合规律y(t)?a?be?Kt,已知从100到1000时分别对应于(x0是初值,应适当取)

cdata=0.00001*[454 499 535 565 590 610 626 639 650 659] 求a,b,k使?(a?be?Kt?cdata)2尽可能地小。

i?110tdata=linspace(100,1000,10)

cdata=0.00001*[454 499 535 565 590 610 626 639 650 659] x0=[0.02,0.5,0.01] %x0=[0.001 0.0051 0.01]

x=curvefit('curvefun',x0,tdata,cdata) ydata=x(1)+x(2)*exp(-x(3)*tdata) plot(tdata,ydata,'r',tdata,cdata,'-b')

(完)

本文来源:https://www.bwwdw.com/article/v7z.html

Top