推荐数学建模matlab方法整理.docx
- 文档编号:28306703
- 上传时间:2023-07-10
- 格式:DOCX
- 页数:29
- 大小:78.11KB
推荐数学建模matlab方法整理.docx
《推荐数学建模matlab方法整理.docx》由会员分享,可在线阅读,更多相关《推荐数学建模matlab方法整理.docx(29页珍藏版)》请在冰豆网上搜索。
推荐数学建模matlab方法整理
disp()函数的常见用法
1、显示字符串
?
?
>>disp('sqrt
(2)')
sqrt
(2)
将要显示的字符串必须放在单引号里面!
!
!
2、显示结果
>>disp(sqrt
(2))
?
?
1.4142
3、显示多个字符
>>disp(['sqrt
(2)=',num2str(sqrt
(2))])
sqrt
(2)=1.4142
格式必须如上所示,并且必须有num2str()函数~~~~
MATLAB导入excel数据
[NUM,TXT,RAW]=xlsread('example')
Example为文件名,NUM返回的是excel中的数据,TXT输出的是文本内容,RAW输出的是未处理数据
读取第二个sheet中的数据
[NUM]=xlsread('example',2)
读取指定单元格中的数据
[NUM]=xlsread('example',2,'A3:
D7')
matlab导入txt数据
ex=importdata('example.txt')
TXT中有4*3维的数据矩阵,一共有5*4维的元素矩阵。
data=ex.data
将TXT文本中的所有数据元素都存储在了data矩阵当中。
text=ex.textdata
将文本中的所有文本格式数据都存储在了相应矩阵当中。
Unifrnd
R=unifrnd(A,B)
生成被A和B指定上下端点[A,B]的连续均匀分布的随机数组R。
如果A和B是数组,R(i,j)是生成的被A和B对应元素指定连续均匀分布的随机数。
如果N或P是标量,则被扩展为和另一个输入有相同维数的数组。
R=unifrnd(A,B,m,n,...)或R=unifrnd(A,B,[m,n,...])
返回m*n*...数组。
如果A和B是标量,R中所有元素是相同分布产生的随机数。
如果A或B是数组,则必须是m*n*...数组。
Fminbnd
fminunc
fminsearch
fopen
1、matlab中fopen函数的常用调用格式
1)fileID?
=fopen('filename')
2)fileID?
=fopen('filename','permission')
其中fileID是文件代号,filename是要打开的文件名,permission是打开方式,默认的打开方式是只读模式。
第一种情况时选择默认的打开方式,第二种是认为指定打开方式。
1.2
fileID是文件的句柄(或者理解为文件的代号),使用fopen()后默认会返回一个文件代号给fileID变量,常用的返回值如下
fileID=+N(N是正整数):
表示文件打开成功,文件代号是N.
fileID=-1:
表示文件打开不成功。
fileID在此次文件关闭前总是有效的。
2.3
permission是打开方式参数,打开方式参数由以下字符串确定:
r读出w写入(文件若不存在,自动创建)a后续写入(文件若不存在,自动创建)r+读出和写入(文件应已存在)w+重新刷新写入,(文件若不存在,自动创建)a+后续写入(文件若不存在,自动创建)文件的存储格式:
文件打开的默认方式是:
二进制。
以文本方式打开
fscanf
%a,%A?
读入一个浮点值(仅C99有效)?
%c?
读入一个字符?
%d?
读入十进制整数?
%i?
读入十进制,八进制,十六进制整数?
%o?
读入八进制整数?
%x,%X?
读入十六进制整数?
%s?
读入一个字符串,遇空格、制表符或换行符结束。
?
%f,%F,%e,%E,%g,%G?
用来输入实数,可以用小数形式或指数形式输入。
?
%p?
读入一个指针?
%u?
读入一个无符号十进制整数?
%n?
至此已读入值的等价字符数?
%[]?
扫描字符集合?
%%?
读%符号?
*是通配符
matlab中函数fscanf在文件读取方面的实例如下:
从文件中有格式地读数据fscanf
语法1:
[a,count]=fscanf(fid,format,size)
根据指定的格式从fid文件按照格式format读出数据并按size的格式放入内存。
a:
读出的数据放入内存的变量名
count:
返回值。
0:
失败、n>0:
成功,n是读出数据个数。
fid:
文件号
size:
a的数据的格式
N:
列向量
inf:
读出文件全部数据
[M,N]:
读出数据以M*N的格式放入变量名a内format:
读出数据的格式
format是字符形式,与C语言基本相同。
字符形式中有“%”与字符集(d,i,o,u,x,e,f,g,s,c,…)搭配构成。
例:
s=fscanf(fid,'%s')?
返回一个字符。
a=fscanf(fid,']')返回一个五位十进制整数。
size是一个[mn]的向量,m为行,n为列(注意,这里读取的顺序是按列优先排列的,不明白的话可以看下面的例子),若n取inf表示读到文件末尾。
fid为fopen打开文件的返回值,
format是格式化参数(像printf、scanf)。
举个小例子:
内容:
?
?
13,?
1,?
?
3.4
?
?
?
3,?
?
2.1,?
23
?
?
?
?
?
1,?
?
12,?
2
?
?
?
4,?
?
5.4,?
6
现在为了读取001中的数据存在一个数组里,可以用如下方法
fid=fopen('001.txt');
data=fscanf(fid,'%f,%f,%f',[3,inf]);%这里得用单引号
fclose(fid);
这时data中的数据如下:
13?
?
3?
?
1?
?
4
1?
?
2.1?
12?
?
5.4
3.4?
23?
?
2?
?
6
Mean
M=mean(A)
返回沿数组中不同维的元素的平均值。
如果A是一个向量,mean(A)返回A中元素的平均值。
如果A是一个矩阵,mean(A)将其中的各列视为向量,把矩阵中的每列看成一个向量,返回一个包含每一列所有元素的平均值的行向量。
如果A是一个多元数组,mean(A)将数组中第一个非单一维的值看成一个向量,返回每个向量的平均值。
M=mean(A,dim)
返回A中沿着标量dim指定的维数上的元素的平均值。
对于矩阵,mean(A,2)就是包含每一行的平均值的列向量。
《Simulink与信号处理》
应用举例编辑本段回目录
A=[123;336;468;477];
mean(A)
ans=
?
?
?
?
?
?
3.00004.50006.0000
mean(A,2)
ans=
?
?
?
?
?
?
2.0000
?
?
?
?
?
?
4.0000
?
?
?
?
?
?
6.0000
?
?
?
?
?
?
6.0000
mean(A)
当A为向量时,那么返回值为该向量所有元素的均值
当A为矩阵时,那么返回值为该矩阵各列向量的均值
mean(A,2)
返回值为该矩阵的各行向量的均值
Sort
sort(A)若A是向量不管是列还是行向量,默认都是对A进行升序排列。
sort(A)是默认的升序,而sort(A,'descend')是降序排序。
sort(A)若A是矩阵,默认对A的各列进行升序排列
sort(A,dim)
dim=1时等效sort(A)
dim=2时表示对A中的各行元素升序排列
若欲保留排列前的索引,则可用?
[sA,index]=sort(A)?
,排序后,sA是排序好的向量,index是向量sA中对A的索引。
索引使排列逆运算成为可能。
由于在sort函数的结果中,是按升序排序的,要转换成降序,先用X=eye(n)生成一个n维的单位阵,然后用X=rot90(X)将其旋转为次对角线的单位阵,再用原来矩阵乘以X即可,如要讲A逆序排列采用如下步骤:
X=eye(size(A));
X=rot90(X);
A=A*X;
假如a是一个2*n的矩阵,即两行.
b=a(1,:
);
[c,pos]=sort(b);%pos为排序后的下标,c为第一行的排序结果;
a(2,:
)=a(2,pos);%第二行按照第一行排序的下标对应
a(1,:
)=c;%第一行结果重新赋给a的第一行
以下适用于m*n的矩阵按第一行排序
[b,pos]=sort(a(1,:
));
a=a(:
pos);
matlab按某一列排序,其他列不变办法
b=sortrows(a,2)?
?
?
?
%a为要排序的矩阵。
2表示按第几列进行排序,整数代表升序,负数代表降序。
%将矩阵a按照第2列的升序排列,其他列不会作升序排列,而是将跟随着第2列的变化,保持一一对应。
b=sortrows(a,-3)
%将矩阵a按照第3列的降序排列,其他列将跟随着第3列的变化,保持一一对应。
data=
?
?
?
?
?
1?
?
?
?
?
3?
?
?
?
?
2
?
?
?
?
?
7?
?
?
?
?
6?
?
?
?
?
5
?
?
?
?
?
4?
?
?
?
?
9?
?
?
?
?
8
sortrows(data,1)
ans=
?
?
?
?
?
1?
?
?
?
?
3?
?
?
?
?
2
?
?
?
?
?
4?
?
?
?
?
9?
?
?
?
?
8
?
?
?
?
?
7?
?
?
?
?
6?
?
?
?
?
5
sortrows(data,-1)
ans=
?
?
?
?
?
7?
?
?
?
?
6?
?
?
?
?
5
?
?
?
?
?
4?
?
?
?
?
9?
?
?
?
?
8
?
?
?
?
?
1?
?
?
?
?
3?
?
?
?
?
2
corrcoef
corrcoef(x,y)表示序列x和序列y的相关系数,得到的结果是一个2*2矩阵,其中对角线上的元素分别表示x和y的自相关,非对角线上的元素分别表示x与y的相关系数和y与x的相关系数,两个是相等的。
Sim
sim函数用来运行Simulink模型。
需要注意的是,用户无法控制其仿真过程(例如暂停、继续),一旦运行就会直到达到结束条件为止——这一点和通过模型窗口界面运行仿真不同。
调用格式:
[t,x,y]=sim(model,timespan,options,ut);
[t,x,y1,y2,...,yn]=sim(model,timespan,options,ut);
输入参数:
model:
模型的名字,用单引号括起来(注意不带扩展名.mdl);
timespan:
指定仿真时间范围,可以有几种情况:
标量tFinal,指定仿真结束时间。
这种情况下开始时间为0;
两个元素的向量[tStarttFinal],同时指定开始时间和结束时间;
向量[tStartOutputTimestFinal],除起止时间外,还指定输出时间点(通常输出时间t会包含更多点,这里指定的点相当于附加的点)。
options:
指定仿真选项,是一个结构体,该结构体通过simset创建,包括模型求解器、误差控制等都可以通过这个参数指定(不修改模型,但使用和模型对话框里设置的不同选择)。
ut:
指定外部输入,对应于根模型的Inport模块。
除第一个输入参数外,其他参数都可以用空矩阵([])来表示模型的默认值。
输出参数:
t:
仿真时间向量;
x:
状态矩阵,每行对应一个时刻的状态,连续状态在前,离散状态在后;
y:
输出矩阵,每行对应一个时刻;每列对应根模型的一个Outport模块(如果Outport模块的输入是向量,则在y中会占用相应的列数)。
y1,y2,...,yn:
把上面的y分开,每个yi对应一个Outport模块。
BP网络
1、BP网络构建
(1)生成BP网络
:
由
维的输入样本最小最大值构成的
维矩阵。
:
各层的神经元个数。
:
各层的神经元传递函数。
:
训练用函数的名称。
(2)网络训练
(3)网络仿真
Vec2ind与ind2vec
vec2ind,“向量变索引”,
假设一个3*6的稀疏矩阵T(1,:
)=[010010];T(2,:
)=[101100];T(3,:
)=[000001],
通过vec2ind(T)将会得到什么?
因为通过矩阵知道T是6列的,
T=
?
?
?
?
0?
?
?
?
1?
?
?
?
0?
?
?
?
0?
?
?
?
1?
?
?
?
0
?
?
?
?
1?
?
?
?
0?
?
?
?
1?
?
?
?
1?
?
?
?
0?
?
?
?
0
?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
1
vec2ind(T)得到的是1行6列的向量,该向量对应的元素分别是T中第1列到第6列中数字"1"对应的行号,因例子中的T矩阵,在第一列中第2行对应的是"1",则vec2ind(T)的第一个元素是2,同理,T中第二列中“1”在第1行,则vec2ind(T)的第二个元素是"1",依次类推,T中第3列至第6列中“1”对应行数分别是“2","2","1","3"。
因此,vec2ind(T)=[2?
12213];
ind2vec则反过来理解即可,如一个索引适量A=[13222121],求ind2vec?
从A可以看出A是1行8列的(如果实在不知道,就用size(A)查看),从A中元素最大值"3"可以看出,索引对应的向量是3行的,还不理解?
那就用最基本的方法,因A中元素对应的是行号,设B=ind2vec(A),意味着B(1,1),B(3,2),B(2,3),B(2,4),B(2,5),B(1,6),B(2,7),B(1,8)对应的值是"1",其余元素均为"0"
即
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
10000101
B=ind2vec(A)=?
?
00111010
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
01000000
神经网络中:
a=sim(net,P)?
?
后运行的结果是:
a=
?
?
(10,1)?
?
?
?
?
?
1?
?
?
?
?
?
?
?
?
?
%表示输入第1个测试样本数据,10号神经元获胜(我用的是hextop建立的竟争层)
?
?
(10,2)?
?
?
?
?
?
1?
?
?
?
?
?
?
?
?
?
%表示输入第2个测试样本数据,10号神经元获胜
?
?
(9,3)?
?
?
?
?
?
1?
?
?
?
?
?
?
?
?
?
%表示输入第3个测试样本数据,9号神经元获胜
?
?
(8,4)?
?
?
?
?
?
1?
?
?
?
?
?
?
?
?
?
?
?
%表示输入第4个测试样本数据,8号神经元获胜
?
?
(8,5)?
?
?
?
?
?
1?
?
?
?
?
?
?
?
?
?
。
。
。
。
。
。
?
?
(29,6)?
?
?
?
?
?
1
?
?
(40,7)?
?
?
?
?
?
1
?
?
(50,8)?
?
?
?
?
?
1
?
?
(60,9)?
?
?
?
?
?
1
?
?
(60,10)?
?
?
?
1
用ac=vec2ind(a)?
?
后可得:
ac=
?
?
Columns1through10
?
?
10?
?
10?
?
?
?
9?
?
?
?
8?
?
?
?
8?
?
29?
?
40?
?
50?
?
60?
?
60?
?
?
?
这样可以更清晰地看出来从第一个样本到最后一个样本,分别是那个神经元获胜。
神经网络用于分类
Functioncompnn(Tc,P,B,Z,n)
clear
%Convertindicestovectors
T=ind2vec(Tc);
%Settingspreadfactor
spread=n;
%Constructinganewnetwork
net=newpnn(P,T,spread);
%Networksimulation
A=sim(net,B);
%Convertvectorstoindices
A=vec2ind(A);
Q=Z-A
%CalculatingcorrelationbetweenZandA
R=corrcoef(Z,A)
Result
(1)newpnn建立神经网络
(2)Tc是类别索引,
(3)P是输入向量
(4)T是目标向量
(5)spread是径向基函数传播系数
(6)
(2)sim是对任意参考或扰动求开环或闭环响应
(7)net为建立的神经网络
(8)B为仿真步数
(9)(3)corrcoef是计算相关系数的
数据归一化
一、max-Min标准化
max-Min标准化方法是对原始数据进行线性变换。
设minA和maxA分别为属性A的最小值和最大值,将A的一个原始值x通过max-Min标准化映射成在区间[0,1]中的值'x,其公式为:
新数据=(原数据-极小值)/(极大值-极小值)
二、z-score标准化
这种方法基于原始数据的均值(mean)和标准差(standarddeviation)进行数据的标准化。
将A的原始值x使用z-score标准化到x'。
z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。
新数据=(原数据-均值)/标准差
spss默认的标准化方法就是z-score标准化。
用Excel进行z-score标准化的方法:
在Excel中没有现成的函数,需要自己分步计算,其实标准化的公式很简单。
步骤如下:
1.求出各变量(指标)的算术平均值(数学期望)xi和标准差si;2.进行标准化处理:
zij=(xij-xi)/si
其中:
zij为标准化后的变量值;xij为实际变量值。
3.将逆指标前的正负号对调。
标准化后的变量值围绕0上下波动,大于0说明高于平均水平,小于0说明低于平均水平。
三、Decimalscaling小数定标标准化
这种方法通过移动数据的小数点位置来进行标准化。
小数点移动多少位取决于属性A的取值中的最大绝对值。
将属性A的原始值x使用decimalscaling标准化到x'的计算方法是:
x'=x/(10*j)
其中,j是满足条件的最小整数。
例如假定A的值由-986到917,A的最大绝对值为986,为使用小数定标标准化,我们用1000(即,j=3)除以每个值,这样,-986被规范化为-0.986。
注意,标准化会对原始数据做出改变,因此需要保存所使用的标准化方法的参数,以便对后续的数据进行统一的标准化。
除了上面提到的数据标准化外还有对数Logistic模式、模糊量化模式等等:
对数Logistic模式:
新数据=1/(1+e^(-原数据))
模糊量化模式:
新数据=1/2+1/2sin[派3.1415/(极大值-极小值)*(X-(极大值-极小值)/2)]X为原数据
Svm
这个实现是线性可分支持向量分类机,不考虑非线性分类引入核函数的情况,也不考虑推广条件下引入PenaltyLoss的情况。
问题描述:
平面上有如下点A=[11.5;21.5;31.5;41.5;10.5;20.5;30.5;40.5]及其对应的标号flag=[1111-1-1-1-1];用SVM方法构造一个决策函数实现正确分类。
如果我们在二维坐标上描点,就会发现这是个很简单的线性可分问题。
实现方法,用SVM的对偶问题,转换为Matlab的有约束非线性规划问题。
构建m文件:
functionf=ffsvm(x)
A=[11.5;21.5;31.5;41.5;10.5;20.5;30.5;40.5];
flag=[1111-1-1-1-1];
fori=1:
1:
length(A)
?
?
?
forj=1:
1:
length(A)
?
?
?
?
?
?
?
normA(i,j)=A(i,:
)*A(j,:
)';
?
?
?
?
?
?
?
normFlag(i,j)=flag(1,i)*flag(1,j);
?
?
?
end
end
f=0;
fori=1:
1:
length(A)
?
?
?
forj=1:
1:
length(A)
?
?
?
?
?
?
f=f+1/2*(normA(i,j)*x(i)*x(j)*normFlag(i,j));
?
?
?
end
?
?
?
f=f-x(i);
end
在命令窗口输入:
Aeq=[1111-1-1-1-1];
beq=0;
lb=?
[0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0?
?
?
?
0];
调用MatLab内置优化函数fmincon;
[x,favl,exitflag]=fmincon(@ffsvm,x0,[],[],Aeq,beq,lb,[])
得到如下结果:
Optimizationterminatedsuccessfully:
?
Magnitudeofdirectionalderivativeinsearchdirection
?
lessthan2*options.TolFunandmaximumconstraintviolation
?
islessthanoptions.TolCon
ActiveConstraints:
?
?
?
?
1
x=
?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000?
?
?
0.5000
favl=
?
?
-2.0000
exitflag=
?
?
?
?
1
x的分量都不为0,说明这些点都是支持向量;
计算w;
w=[00];
fori=1:
1:
length(A)
w=w+flag(i)*x(i)*A(i,:
);
end
结果:
w=[0,2];
计算b;
?
b=0;
fori=1:
1:
8
b?
=b-flag(i)*x(i)*normA(i,1);
end
b?
=flag
(1)+b;
结果:
b=-2;
最终的决策函数为:
f=sign([0,2]*xT-2)
可以验证,这个学习到的决策函数能够对这些平面上的点实现很好的分类;
基本思路是这样的,如果要考虑引入核函数和PenaltyLoss的情况,只需要修改优化函数和约束就可以实现。
而且自己可以根据需求任意构造自己的SVM目标函数,然后用Lagrange方法转换为对偶形式,然后当作一个有约束线性规划问题用Matlab来解。
至于有约束线性规划问题,这是个大概半个世纪前就解决的问题,学过OR的人都知道它的解决方法。
网上也有很多的OpenSource来解决这个问题,直接Call那些代码就可以了。
虽然林智仁教授也提供SourceCode,是C++风格的,可读性不是太好。
Cftool
拟合曲线图
?
SSE是拟合误差的平方和。
它越接近0,说明拟合结果推断的准确性越高。
注:
SSE的完整公式为
其中wi为权值,yi为测量值,戴草帽的yi为估计值。
?
R-Square是表达值(即实测数据)与推测值(即用拟合模型计算的数据)之间相关系数的平方值(我猜可能是为了统一评估正负相关性才会使用平方)。
它越接近1,说明模型能更好地解释变量间的比例关系。
换言之,两组数据的相关性更好。
注:
R-Square的完整公式有点复杂:
其中,
?
DFE是误差的自由度。
?
AdjR-sq是按照误差自由度调整后的R-square。
它越接近1,说明拟合
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 推荐 数学 建模 matlab 方法 整理