当前位置:首页 > 代码 > 正文

数学建模小程序代码(数学建模程序模板)

admin 发布:2022-12-19 20:00 139


今天给各位分享数学建模小程序代码的知识,其中也会对数学建模程序模板进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

数学建模用什么编程?python行吗

如果是编辑公式的话,python中直接可以进行计算,如

计算c=a+b,在python代码中可以表示为:

a=1

b=2

c=a+b

print(c)

输出结果是:3

如果你要进行其他计算的话,可以使用math模块

这个是安装Python环境后自带的一个模块,可以直接调用

更多python math模块的调用可以参考如下网页

网页链接

数学建模灰色预测程序代码?

这里写了四个函数,方便在Matlab里面调用,分别是GM(1,1),残差GM(1,1),新陈代谢GM(1,1),Verhust自己写得难免有所疏忽,需要的朋友自己找本书本来试验一下。。

Gm(1,1)

function [px0,ab,rel]=gm11(x0,number)

%[px0,ab,rel]=gm11(x0,number)

%px0为预测数列,rel为平均相对误差,rel为平均相对误差(为百分比)

%默认的number参数为原数组大小

if nargin==1 %对输入矩阵进行判断,如不是一维列矩阵,进行转置变换

number=max(size(x0));

end

n=max(size(x0)); %取输入数据的样本量

x1=zeros(size(x0));

for k=1:n

for i=1:k

x1(k)=x1(k)+x0(i); %计算累加值,并将值赋予矩阵be

end

end

z=zeros(size(x0));

for k=2:n

z(k)=0.5*(x1(k)+x1(k-1)); %计算数据矩阵B的第一列数据

end

y=x0';

y(1)=[];

b(:,1)=-z';

b(:,2)=1;

b(1,:)=[];

ab=inv(b'*b)*b'*y; %计算参数 矩阵

a=ab(1);

b=ab(2);

px0(1)=x0(1);

%求还原值系列

for k=1:number-1

px0(k+1)=(1-exp(a)) * ( x0(1)-b/a ) * exp(-a*k);

end

temp=px0(1:n);

x0;

temp=(temp-x0)./x0; %相对误差

temp(1)=[]; %删除第一个为零的误差

temp=abs(temp);

rel=sum(temp)/(n-1)*100;

残差Gm(1,1)

function [px0,ab,rel]=ccgm11(x0,number)

%[px0,ab,rel]=gm11(x0,number)

%px0为残差预测数列,ab为求得的系数,rel为平均相对误差(为百分比)

%默认的number参数为原数组大小

if nargin==1

number=max(size(x0));

end

n=max(size(x0)); %数组大小..

[px0,ab,rel]=gm11(x0,number);

wucha=x0-px0(1:n);

i=n;

%求后面的同号的数目.

while(wucha(i)*wucha(i-1)0 i=2)

i=i-1;

end

start=i;

length=n-i+1;

new=wucha(start:n);

if length=4

pwucha=gm11(new);

px0(start:n)=px0(start:n)+pwucha

clear wucha;

wucha=px0-x0;

wucha=wucha./x0; %相对误差

wucha=abs(wucha);

rel=sum(wucha)/(n-1)*100;

end

verhust

function [px0,ab,rel]=verhust(x1,number)

%[px0,ab,rel]=verhust(x0,number)

%px0为预测数列,rel为平均相对误差,rel为平均相对误差(为百分比)

%默认的number参数为原数组大小

if nargin==1

number=max(size(x1));

end

n=max(size(x1));

x0(1)=x1(1);

for k=2:n

x0(k)=x1(k)-x1(k-1);

z(k)=0.5*(x1(k)+x1(k-1));

end

x0;

z;

B=[-(z(2:n))' (z(2:n).^2)'];

B;

Y=(x0(2:n))';

Y;

ab=inv(B'*B)*B'*Y;

a=ab(1);b=ab(2);

for k=1:number

px0(k)=(a*x1(1))/(b*x1(1)+(a-b*x1(1)).*exp(a*(k-1)));

end

temp=px0(1:n);

x1;

temp=(temp-x1)./x1; %相对误差

temp(1)=[]; %删除第一个为零的误差

temp=abs(temp);

rel=sum(temp)/(n-1)*100;

新陈代谢Gm(1,1)

function [px0,ab,rel]=xcdxgm11(x0,number,step)

%[px0,ab,rel]=xcdxgm11(x0,number,step)

%x0为原系列,number为要预测的数目,step为基本步长

%px0为预测数列,rel为平均相对误差,rel为平均相对误差(为百分比)

%默认的number参数为原数组大小

%模型假设预测的数据和原始数据都要大于等于5

if nargin==1

number=max(size(x0));

step=max(size(x0));

end

if nargin==2

step=max(size(x0));

end

n=max(size(x0));

if nstep | n5

error('此模型要求至少有五个原始数据,并且原始数据个数要大于新陈代谢的步长.');

end

[px0,ab,rel]=gm11(x0,n);

last=n;

x0;

px0;

while lastnumber

begin=last-step+1;

temp=px0(begin:last);

temp=gm11(temp,step+1);

last=last+1;

px0(last)=temp(step+1);

end

数学建模各种算法MATLAB的编程代码,越详细越好

灰色预测

x=[0.11 0.49 0.50 0.23 0.27 0.02 -0.02 0.26 -0.25 0.08 ...

0.52 0.13 -0.01 0.52 0.57 0.01 0.32 -0.15 0.45 0.07 0.66...

0.58 0.51 0.53 0.49 0.38 0.33 0.29 0.32 0.03 0.39];

format long; %设置计算精度

if length(x(:,1))==1 %对输入矩阵进行判断,如不是一维列矩阵,进行转置变换

x=x';

end

n=length(x); %取输入数据的样本量

z=0;

for i=1:n %计算累加值,并将值赋予矩阵be

z=z+x(i,:);

be(i,:)=z;

end

for i=2:n %对原始数列平行移位

y(i-1,:)=x(i,:);

end

for i=1:n-1 %计算数据矩阵B的第一列数据

c(i,:)=-0.5*(be(i,:)+be(i+1,:));

end

for j=1:n-1 %计算数据矩阵B的第二列数据

e(j,:)=1;

end

for i=1:n-1 %构造数据矩阵B

B(i,1)=c(i,:);

B(i,2)=e(i,:);

end

alpha=inv(B'*B)*B'*y; %计算参数 矩阵

for i=1:n+1 %计算数据估计值的累加数列,如改为n+1为n+m可预测后m-1个值

ago(i,:)=(x(1,:)-alpha(2,:)/alpha(1,:))*exp(-alpha(1,:)*(i-1))+alpha(2,:)/alpha(1,:);

end

var(1,:)=ago(1,:)

for i=1:n %如改n为n+m-1,可预测后m-1个值

var(i+1,:)=ago(i+1,:)-ago(i,:); %估计值的累加数列的还原,并计算出下一预测值

end

for i=1:n

error(i,:)=var(i,:)-x(i,:); %计算残差

end

c=std(error)/std(x) %调用统计工具箱的标准差函数计算后验差的比值c

需要有关数学建模的各种matlab代码,急求~~~~

这个可不是一般的多……

附录一 MATLAB常用函数

1、特殊变量与常数

ans 计算结果的变量名 computer 确定运行的计算机

eps 浮点相对精度 Inf 无穷大

I 虚数单位 inputname 输入参数名

NaN 非数 nargin 输入参数个数

nargout 输出参数的数目 pi 圆周率

nargoutchk 有效的输出参数数目 realmax 最大正浮点数

realmin 最小正浮点数 varargin 实际输入 的参量

varargout 实际返回的参量

操作符与特殊字符

+ 加 - 减

* 矩阵乘法 .* 数组乘(对应元素相乘)

^ 矩阵幂 .^ 数组幂(各个元素求幂)

\ 左除或反斜杠 / 右除或斜面杠

./ 数组除(对应元素除) kron Kronecker张量积

: 冒号 () 圆括

[] 方括 . 小数点

.. 父目录 ... 继续

, 逗号(分割多条命令) ; 分号(禁止结果显示)

% 注释 ! 感叹号

' 转置或引用 = 赋值

== 相等 不等于

逻辑与 | 逻辑或

~ 逻辑非 xor 逻辑异或

2、基本数学函数

abs 绝对值和复数模长 acos,acodh 反余弦,反双曲余弦

acot,acoth 反余切,反双曲余切 acsc,acsch 反余割,反双曲余割

angle 相角 asec,asech 反正割,反双曲正割

secant 正切 asin,asinh 反正弦,反双曲正弦

atan,atanh 反正切,双曲正切 tangent 正切

atan2 四象限反正切 ceil 向着无穷大舍入

complex 建立一个复数 conj 复数配对

cos,cosh 余弦,双曲余弦 csc,csch 余切,双曲余切

cot,coth 余切,双曲余切 exp 指数

fix 朝0方向取整 floor 朝负无穷取整

gcd 最大公因数 imag 复数值的虚部

lcm 最小公倍数 log 自然对数

log2 以2为底的对数 log10 常用对数

mod 有符号的求余 nchoosek 二项式系数和全部组合数

real 复数的实部 rem 相除后求余

round 取整为最近的整数 sec,sech 正割,双曲正割

sign 符号数 sin,sinh 正弦,双曲正弦

sqrt 平方根 tan,tanh 正切,双曲正切

3、基本矩阵和矩阵操作

blkding 从输入参量建立块对角矩阵 eye 单位矩阵

linespace 产生线性间隔的向量 logspace 产生对数间隔的向量

numel 元素个数 ones 产生全为1的数组

rand 均匀颁随机数和数组 randn 正态分布随机数和数组

zeros 建立一个全0矩阵 :(colon) 等间隔向量

cat 连接数组 diag 对角矩阵和矩阵对角线

fliplr 从左自右翻转矩阵 flipud 从上到下翻转矩阵

repmat 复制一个数组 reshape 改造矩阵

roy90 矩阵翻转90度 tril 矩阵的下三角

triu 矩阵的上三角 dot 向量点集

cross 向量叉集 ismember 检测一个集合的元素

intersect 向量的交集 setxor 向量异或集

setdiff 向是的差集 union 向量的并集

数值分析和傅立叶变换

cumprod 累积 cumsum 累加

cumtrapz 累计梯形法计算数值微分 factor 质因子

inpolygon 删除多边形区域内的点 max 最大值

mean 数组的均值 mediam 中值

min 最小值 perms 所有可能的转换

polyarea 多边形区域 primes 生成质数列表

prod 数组元素的乘积 rectint 矩形交集区域

sort 按升序排列矩阵元素 sortrows 按升序排列行

std 标准偏差 sum 求和

trapz 梯形数值积分 var 方差

del2 离散拉普拉斯 diff 差值和微分估计

gradient 数值梯度 cov 协方差矩阵

corrcoef 相关系数 conv2 二维卷积

conv 卷积和多项式乘法 filter IIR或FIR滤波器

deconv 反卷积和多项式除法 filter2 二维数字滤波器

cplxpair 将复数值分类为共轭对 fft 一维的快速傅立叶变换

fft2 二维快速傅立叶变换 fftshift 将FFT的DC分量移到频谱中心

ifft 一维快速反傅立叶变换 ifft2 二维傅立叶反变换

ifftn 多维快速傅立叶变换 ifftshift 反FFT偏移

nextpow2 最靠近的2的幂次 unwrap 校正相位角

多项式与插值

conv 卷积和多项式乘法 roots 多项式的根

poly 具有设定根的多项式 polyder 多项式微分

polyeig 多项式的特征根 polyfit 多项式拟合

polyint 解析多项式积分 polyval 多项式求值

polyvalm 矩阵变量多项式求值 residue 部分分式展开

interp1 一维插值 interp2 二维插值

interp3 三维插值 interpft 使用FFT的一维插值

interpn 多维插值 meshgrid 为3维点生成x和y的网格

ndgrid 生成多维函数和插值的数组 pchip 分段3次Hermite插值多项式

ppval 分段多项式的值 spline 3次样条数据插值

绘图函数

bar 竖直条图 barh 水平条图

hist 直方图 histc 直方图计数

hold 保持当前图形 loglog x,y对数坐标图

pie 饼状图 plot 绘二维图

polar 极坐标图 semilogy y轴对数坐标图

semilogx x轴对数坐标 subplot 绘制子图

bar3 数值3D竖条图 bar3h 水平3D条形图

comet3 3D慧星图 cylinder 圆柱体

fill3 填充的3D多边形 plot3 3维空间绘图

quiver3 3D震动(速度)图 slice 体积薄片图

sphere 球 stem3 绘制离散表面数据

waterfall 绘制瀑布 trisurf 三角表面

clabel 增加轮廓标签到等高线图中 datetick 数据格式标记

grid 加网格线 gtext 用鼠标将文本放在2D图中

legend 图注 plotyy 左右边都绘Y轴

title 标题 xlabel X轴标签

ylabel Y轴标签 zlabel Z轴标签

contour 等高线图 contourc 等高线计算

contourf 填充的等高线图 hidden 网格线消影

meshc 连接网格/等高线 mesh 具有参考轴的3D网格

peaks 具有两个变量的采样函数 surf 3D阴影表面图

surface 建立表面低层对象 surfc 海浪和等高线的结合

surfl 具有光照的3D阴影表面 trimesh 三角网格图

数学建模里的一道用lingo解答的问题,求代码!!

这道题目里面是不是欠缺几个条件:煤机生产费用应该是一个固定成本加一个可变成本吧,要是这样的话,我就假设固定成本是100每次,可变成本是10元/台。

10和100这两个数是乱写的,你自己改啊

!x是每次生产的台数,y是每次库存的台数;

x1=y2+40;

x2+y2=y3+60;

y3+x3=80;

min=10*(x1+x2+x3)+100*(c1+c2+c3)+4*(y1+y2+y3);

!c是确定每次是否生产,lingo默认0/0等于0,如果x非零c等于1,如果x=0,c等于0;

c1=x1/x1;

c2=x2/x2;

c3=x3/x3;

@bin(c1);

@bin(c2);

@bin(c3);

其实我觉得bin的约束要不要可以自己看,我觉得加上可能保险点,但是去掉的话是个线性规划,这个看自己

帮忙写个Matlab小程序

我们学校的数学建模上机课也有Mathlab程序,看看下面有没有你要找的。

一 基本运算

1 求

输入(12+2*(7-4))/3^2执行

2 输入x = (5*2+1.3-0.8)*10^2/25执行

再输入y= 2*x+1执行

3 执行clear命令。观察结果

4计算圆面积Area = ,半径r = 2,则可键入

r=2;area=pi*r^2; area

问:语句末尾加分号与不加分号有何区别?请试验之

5常用函数

名称 含义 名称 含义

sin 正弦 exp E为底的指数

cos 余弦 log 自然对数

tan 正切 log10 10为底的对数

cot 余切 log2 2为底的对数

asin 反正弦 abs 绝对值

acos 反余弦

例:1)执行y = sin(10)*exp(-0.3*4^2)

2) 想计算 的值

输入y1=2*sin(0.3*pi)/(1+sqrt(5))执行之

若又想计算 ,可以简便地用操作:先按á键则会出现上面输入过的指令 y1=2*sin(0.3*pi)/(1+sqrt(5)) ;然后移动光标,把y1改成y2;把 sin 改成 cos 便可。即得

y2=2*cos(0.3*pi)/(1+sqrt(5))然后执行之。

系统默认4位有效数字,若想提高精度则可如下:

digits(10);sym(y2,'d') 执行就可精确到小数点后10位,还可将10改为其它数字试验

二 矩阵运算

1要得到矩阵 ,

可输入A = [1,2,3; 4,5,6; 7,8,9] 执行,观察结果

还可分行输入

A=[1,2,3

4,5,6

7,8,9]

效果相同

2 注意 %号后的语句为注释,练习时不必输入

a=[1,4,6,8,10] %一维矩阵

a(3) % a的第三个元素

ans =

6

»x =[1 2 3 4 5 6 7 8

4 5 6 7 8 9 10 11]; %二维2x8 矩阵

执行后双击左边Workspace里的x,观察之

» x(3) % x的第三个元素

ans =

2

» x([1 2 5]) % x的第一、二、五个元素

ans =

1 4 3

如需要还可定义b=x([1 2 5])执行后结果为

b =

1 4 3

x(2,3) % x的第二行第三列的元素

ans =

6

x(1:5) % x的第前五个元素

ans =

1 4 2 5 3

» x(10:end) % x的第十个元素后的元素

ans =

8 6 9 7 10 8 11

执行后双击左边Workspace里的x,观察是哪十个元素

» x(10:-1:2) % x的第十个元素和第二个元素的倒排

ans =

8 5 7 4 6 3 5 2 4

» x(find(x5)) % x中大于5的元素

ans =

6 7 8 6 9 7 10 8 11

» x(4)=100 %给x的第四个元素重新给值

x =

1 2 3 4 5 6 7 8

4 100 6 7 8 9 10 11

» x(3)=[] % 删除第三个元素(不是二维数组)

x =

Columns 1 through 12

1 4 100 3 6 4 7 5 8 6 9 7

Columns 13 through 15

10 8 11

» x(16)=1 % 加入第十六个元素

x =

Columns 1 through 12

1 4 100 3 6 4 7 5 8 6 9 7

Columns 13 through 16

10 8 11 1

3 如不需要以前的变量时,为不干扰以后计算,可执行clear清除以前的变量

当元素很多的时候,则须采用以下的方式:

» x=(1:2:121); % 以起始值为1,增量值为2,终止值为121的矩阵

» x=linspace(0,1,100); % 利用linspace,生成以0为起始值,1为终止值,元素数目为100的矩阵

»a=[] %空矩阵

a =

[]

» zeros(2,2) %全为0的矩阵

ans =

0 0

0 0

» ones(3,3) %全为1的矩阵

ans =

1 1 1

1 1 1

1 1 1

» rand(2,4); %随机矩阵

4另外一种定义矩阵的方式

»a=1:7; b=11:2:23;

»c=[b a]; %利用上面建立的阵列 a 及阵列 b ,组成新阵列c

»d=[b ; a]; %利用a及b,组成新矩阵d

执行后双击左边Workspace里的c与d,比较之

再如 已知y=[-1,6,15,7,31,2,4,5];

x=y(3:5) %x为y的第三到第五个元素组成的新向量

或 x=[y(5),y(3),y(7)] %x为y的第五、第三、第七个元素组成的新向量

或这样更简单 x=y([5,3,7])

5 输入矩阵x=[4,8,12,10,23;6,3,15,13,19;9,1,2,18,14;11,7,5,21,17]

依次输入下列命令并执行,观察结果,各命令分别有什么作用?

max(x)

min(x) (问:如何得到整个矩阵的最小值与最大值?)

[m,n]=size(x)

L=length(x)

y=x’

a=x( :,2)

b=x( :,2)’

c=x(3, :)

d=x(1 :3,3 :5)

y(2,3)=y(2,3)/2

y(2, :)=y(2, :)/2

y( :,4)=y( :,4)+y( :,2)

6 点运算 执行下列命令,指出点运算的作用

x=1 :8 (或对另外的向量或矩阵来作)

y=2.^x

z=x./y

w=x.^2

u=sin(x)

常用命令

min 最小值 max 最大值

mean 平均值 std 标准差

sort 排序 diff 相邻元素的差

length 个数 sum 总和

dot 内积 cross 外积

三 画图

二维图形

命 令 含 义 plot绘图函数的叁数

plot 建立向量或矩阵各队队向量的图形 字元 颜色 字元 图线型态

loglog x、y轴都取对数标度建立图形 y 黄色 . 点

semilogx x轴用于对数标度,y轴线性标度绘制图形 k 黑色 o 圆

semilogy y轴用于对数标度,x轴线性标度绘制图形 w 白色 x x

title 给图形加标题 b 蓝色 + +

xlabel 给x轴加标记 g 绿色 * *

ylabel 给y轴加标记 r 红色 - 实线

text 在图形指定的位置上加文本字符串 c 亮青色 : 点线

gtext 在鼠标的位置上加文本字符串 m 锰紫色 -. 点虚线

grid 打开网格线 -- 虚线

hold on 命令用于在已画好的图形上添加新的图形

1 x=0:0.001:10; % 0到10的1000个点(每隔0.001画一个点)的x座标

y=sin(x); % 对应的y座标

plot(x,y); % 绘图

注:matlab画图实际上就是描点连线,因此如果点取得不密,画出来就成了折线图,请试验之

2 Y=sin(10*x);

plot(x,y,'r:',x,Y,'b') % 同时画两个函数

3 若要改变颜色,在座标对后面加上相关字串即可:

x=0:0.01:10;

plot(x,sin(x),'r')

4 若要同时改变颜色及图线型态(Line style),也是在坐标对后面加上相关字串即可:

plot(x,sin(x),'r*')

5 用axis([xmin,xmax,ymin,ymax])函数来调整图轴的范围

axis([0,6,-1.5,1])

6 MATLAB也可对图形加上各种注解与处理:(见上表)

xlabel('x轴'); % x轴注解

ylabel('y轴'); % y轴注解

title('余弦函数'); % 图形标题

legend('y = cos(x)'); % 图形注解

gtext('y = cos(x)'); % 图形注解 ,用鼠标定位注解位置

grid on; % 显示格线

7画椭圆

a = [0:pi/50:2*pi]'; %角度

X = cos(a)*3; %参数方程

Y = sin(a)*2;

plot(X,Y);

xlabel('x'), ylabel('y');

title('椭圆')

8 绘制函数 在0 ≤ x ≤ 1时的曲线。

x=0:0.1:1

y=x.*exp(-x) %为什么用点运算?若不用会怎样

plot(x,y),xlabel('x'),ylabel('y'),title('y=x*exp(-x)')

9 画出衰减振荡曲线 与它的包络线 及 。t 的取值范围是[0, 4π] 。

t=0:pi/50:4*pi;

y0=exp(-t/3);

y=exp(-t/3).*sin(3*t);

plot(t,y,'-r',t,y0,':b',t,-y0,':b') % -r表示红色实线,:b表示蓝色点线,看上表

grid

10 在同一个画面上建立几个坐标系, 用subplot(m,n,p)命令;把一个画面分成m×n个图形区域, p代表当前的区域号,在每个区域中分别画一个图,如

x=linspace(0,2*pi,30); y=sin(x); z=cos(x);

u=2*sin(x).*cos(x); v=sin(x)./cos(x);

subplot(2,2,1),plot(x,y),axis([0 2*pi -1 1]),title('sin(x)')

subplot(2,2,2),plot(x,z),axis([0 2*pi -1 1]),title('cos(x)')

subplot(2,2,3),plot(x,u),axis([0 2*pi -1 1]),title('2sin(x)cos(x)')

subplot(2,2,4),plot(x,v),axis([0 2*pi -20 20]),title('sin(x)/cos(x)')

三维图形

11三维螺旋线:

t=0:pi/50:10*pi;

plot3(sin(t),cos(t),t) %参数方程

grid %添加网格

12 t=linspace(0,20*pi, 501);

plot3(t.*sin(t), t.*cos(t), t); %注意点乘

也可以同时画出两条曲线,格式与二维情况类似,兹不举例。

13用mesh命令画曲面

画出由函数 形成的立体网状图:

a=linspace(-2, 2, 25); % 在x轴上从(-2,2)取25点

b=linspace(-2, 2, 25); % 在y轴上取25点

[x,y]=meshgrid(a, b); % x和y都是21x21的矩阵

z=x.*exp(-x.^2-y.^2); % 计算函数值,z也是21x21的矩阵

mesh(x, y, z); % 画出立体网状图

14 surf和mesh的用法类似:

a=linspace(-2, 2, 25); % 在x轴上取25点

b=linspace(-2, 2, 25); % 在y轴上取25点

[x,y]=meshgrid(a, b); % x和y都是21x21的矩阵

z=x.*exp(-x.^2-y.^2); % 计算函数值,z也是21x21的矩阵

surf(x, y, z); % 画出立体曲面图

四 程序设计

1 M-文件: 上面所做的运算都是在命令窗口中输入一条或两三条命令,然后执行,再输入,再执行,以这样交谈式的方式进行。如果为了解决某一问题需要很多命令,这样做就很不方便了。这时我们把解决某一问题的所有命令集中放在一个文档里,命名、保存。然后只要在命令窗口中输入文档名,执行即可。

例:(1)编写文档:点击MATLAB指令窗口上面最左端的图标 ,即新建文件,就可打开MATLAB文件编辑器。用户即可在空白窗口中编写程序。例如输入下面的程序:

x=linspace(0,2*pi,20);

y=sin(x);

plot(x,y,'r+')

title('2D plot')

(2)点击文件编辑器上面工具条中的保存 ,命名(例如将上面的程序命名为picture),然后保存。像这样在MATLAB文件编辑器中编写的文件叫M-文件(M-file)。

(3)运行:i)在命令窗口中输入文件名(如上面的picture),然后执行。

ii)或直接在文件编辑器上面的工具条中找到debug(即调试),点击,再找到run(即运行),再点击即可。

同学们可以把前面画图的一些问题放在文件编辑器里再做一下。

2 自己编写函数:我们经常用到的像sin、cos、exp这样的一些函数都是MATLAB软件自身所带的函数,因此直接应用即可,但有时我们为了解决一些问题需要自己编写函数。自己编写函数有两个基本要求i)必须在MATLAB文件编辑器中编写。ii)函数名和文件名必须相同。 例: 编写函数 , 计算f(1)f(2)+f2(3)

(1)打开MATLAB文件编辑器,输入

function Y= fun1(x) % 表示Y是x的函数,x是自变量,fun1是函数名

Y=(x^3 - 2*x^2 + x - 6.3)/(x^2 + 0.05*x - 3.14);

然后保存。

注:在自己编写的函数前都要写上function,表示这是自己定义的函数。fun1表示函数名,那么最后文件名也应命名为fun1。

(2)这样在命令窗口中就可以像应用sin、cos那样来使用函数fun1,如:在命令窗口中输入 fun1(1)*fun1(2)+fun1(3)*fun1(3) 结果为:

ans =

-12.6023

3 for循环语句(这里的for语句与C语言中的for语句不同,要更简单一些)

例:一个简单的for循环示例。

for i=1:10; % i依次取1,2,…10,.

x(i)=2*i; % 对每个i值,重复执行该指令

end; % 表示循环结束,每一个for要对应一个end

x % 要求显示运行后数组x的值。

输入后观察结果,体会for语句的作用。

注:在MATLAB里(在C语言中也一样), 的作用表示把等号右边的值送给左边的变量,这和数学中相等的意思不同。下面的例子中都要这样理解,否则就不能明白程序的含义。

4 while循环语句

例: Fibonacci 数列:1,1,2,3,5,8,… 即: ,( 1,2,3…)现要求该数列中第一个大于10000 的元素。

a(1)=1;a(2)=1;i=2;

while a(i)=10000

a(i+1)=a(i-1)+a(i);

i=i+1;

end;

i,a(i),

5(1)if-end语句,例:

cost=10;number=12;

if number8

sums=number*0.95*cost;

end,

sums

(2)if-else-end语句,例:

cost=10;number=5; % 改变number的初值,看结果有何不同

if number8

sums=number*0.95*cost;

else sums=number*0.5*cost;

end,

sums

6 例:用for 循环语句来寻找Fibonacc 数列中第一个大于10000 的元素。

n=100;a=ones(1,n); % a是一个一行,n列的所有元素为1的矩阵

for i=3:n

a(i)=a(i-1)+a(i-2);

if a(i)=10000

a(i),

break; % 表示跳出循环

end;

end, i

7 练习:课本264页,参考例4右边的流程图11.4,编程序求解例4,自己设置误差,并与书上的结果比较。

五 拟合与插值

曲 线 拟 合 和 插 值 函 数

polyfit(x, y, n) 对描述n阶多项式y=f(x)的数据进行最小二乘曲线拟合

interp1(x, y, xo) 1维线性插值

interp1(x, y, xo, ' spline ') 1维3次样条插值

interp1(x, y, xo, ' cubic ') 1维3次插值

interp2(x, y, Z, xi, yi) 2维线性插值

interp2(x, y, Z, xi, yi, ' cubic') 2维3次插值

1 插值

看课本266页§11.2第一段,了解什么是插值。

例:考虑下列问题,12小时内,一小时测量一次室外温度。数据如下:

时间:1,2,3, 4, 5, 6, 7, 8, 9,10,11,12

温度:5,8,9,15,25,29,31,30,22,25,27,24

现在根据以上数据估计3.2,4.7等时刻的温度

hours=1:12;

temps=[5 8 9 15 25 29 31 30 22 25 27 24];

t=interp1(hours, temps, [3.2,4.7]) % 一阶线性插值,如果只估计一个点的值,则无须加方括号

改为t=interp1(hours, temps, [3.2,4.7], 'spline') 则为三次样条插值

如果输入如下程序,则画出插值曲线

hours=1:12;

temps=[5 8 9 15 25 29 31 30 22 25 27 24];

h=1:0.1:12;

t=interp1(hours, temps, h) ; % h后加上'spline'则为三次样条插值

plot(hours, temps, ' + ' , h, t)

用一阶线性插值和三次样条插值做课本268页例2,与书上之结果比较,然后挑课后题做一两道。

2 拟合

看课本270页§11.3,曲线拟合,比较拟合与插值有什么区别。

例:两组数据如下:

x=[0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1];

y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2];

n=8;

p1=polyfit(x,y,n); % n表示用n阶多项式拟合,n=1为线性拟合,即通常所说最小二乘法

poly2sym(p1) % 前面的拟合命令只给出多项式的系数,用此命令则将结果转化为真正的多项式。或用 vpa(poly2sym(p1),10) 即取数值形式,取10位有效数字

x1=0:.01:1; % 由此以后三句是画出拟合曲线的图像

y1=polyval(p1,x1); %此句是在x1这些点处求出多项式的值,送给y1

plot(x,y,'o',x1,y1)

改变n的数字,即用不同的多项式拟合,看看哪个结果好。

当n=10时,数据点之间出现大的波动。当企图进行高阶曲线拟合时,这种波动现象经常发生,并不利于我们认识两组数据之间的规律,因此并不是阶数越高越好,实际问题当中,适当选一个即可。

用上面的指令做课本271页例1及例2,将结果与书上之结果比较。

数学建模小程序代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数学建模程序模板、数学建模小程序代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/21831.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载