数学建模笔记 day-01

第一章 Matlab基础知识

!!!一行写一个语序不要标点符号;

           一行写n个语序,语序之间加分隔符“,”或者空格;

            分号“;”的作用是不显示变量的取值。

1.1 Matlab帮助的使用

help+“空格”+关键字

doc+“空格”+关键字 --以超文本形式的更详细的解释

lookfor+“空格”+关键字 --当想要某种功能但又不知道准确名字的时候使用

1.2 数据的输入

1.2.1 简单矩阵的输入

要直接输入矩阵时,矩阵同一行的元素用空格或逗号隔开;

                                矩阵行与行之间用分号";"或者回车隔离;

整个矩阵放在“[ ]”里。

注:如果在矩阵后面加了分号";",再按回车则不显示矩阵;需在输入变量名再按回车才显示。

:whos 作用:显示现在的所有的变量。

1.2.2 特殊变量:(特殊变量也可放在矩阵中作为元素)

ans  :用于结果的缺省把变量名--如果数值没有赋给一个具体变量,那么默认赋给ans

pi     :圆周率

eps  : 浮点相对精度

inf    :无穷大 如1/0

NaN :不定量 如0/0

nargin  :所有函数的输入变量数目

nargout:所有函数的输出变量数目

realmin :最小可用正实数

realmax:最大可用正实数

1.2.3 特殊向量

  • t=[A:B:C]                                                                                                                                          作用:产生从A到C的行向量,元素之间间隔为B                                                                        例如:t=[0:0.1:10] 产生101个行向量 --!!!0和10作为起始点和终点也算
  • t=linspace(A,B,C)                                                                                                                            作用:产生A与B之间线性均匀分布的C个数(也是行向量)                                                      注:t=linspace(0,100) 等价于t=linspace(0,100,100
  • t=logspace(A,B,C)                                                                                                                          作用:产生10^{A}10^{B}之间按照对数距离等间距产生C个数,即log(t)每相邻两数之间间距相等      注:t=logspace(0,100) 等价于t=linspace(0,100,50
  • t=t'                                                                                                                                                    作用: 将矩阵t转置
  • size(t)      --t为矩阵                                                                                                                          作用: 求矩阵的维数(第一元为行数,第二元为列数)       
  • log(t)        --t为矩阵                                                                                                                          作用: 将t中的每一个元素取对数
  • diff(t)        --t为矩阵         《差分》                                                                                                  作用: 将t中每相邻两元素的差值按顺序输出    

1.2.3 特殊矩阵

1.2.3.1 单位矩阵

eye(m) 得到一个m阶单位方阵

eye(m,n) 得到一个m*n的矩阵且其中有一个可允许的最大单位矩阵而其余处处为0

eye(size(a)) 得到与矩阵a同样大小的单位矩阵

1.2.3.2 所有元素为1的矩阵

ones(m),ones(size(a)),ones(m,n) 与单位矩阵用法相似

1.2.3.3 所有元素为0的矩阵

zeros(m),zeros(size(a)),zeros(m,n) 与单位矩阵用法相似

1.2.3.4 空矩阵                                                                                                                                     q=[],矩阵q在工作空间之中,但它的大小为0,通过空矩阵的方法可以删除矩阵的行与列。

 例如 t(:,3)=[]  作用为:删除矩阵t的第三列       注:此处的“:”表示所有行。

1.2.3.5 随机数矩阵

rand(m,n) 产生m*n矩阵,其中元素是服从[0,1]上均匀分布的随机数

normrnd(mu,sigma,m,n) 产生m*n矩阵,其中的元素是服从均值为mu,标准差为sigma的正态分布的随机数

exprnd(mu,m,n) 产生m*n矩阵,其中的元素是服从均值为mu的指数分布的随机数

poissrnd(mu,m,n) 产生m*n矩阵,其中的元素是服从均值为mu的泊松分布的随机数

unifrnd(a,b,m,n) 产生m*n矩阵,其中的元素是服从区间[a,b]上均匀分布的随机数。

附:t(:,[end:-1:1]) 作用:将矩阵重新排列,即从右往左排列。

       x=t(m,n) 作用:提取t矩阵中m*n的元素。

       t(:) 作用:将t展开逐列展开为一个长的列向量。

       reshape(a:b:c,[m,n]) 产生一个逐列排布从a到c步长为b的m*n矩阵(步长为1,则b可省)

       repmat(t,m,n) 将t矩阵行复制m遍,列复制n遍。

1.2.3.6 随机置换

randperm(n) 产生1到n的一个随机全排列。

perms([1,n]) 产生1到n的所有权排列。

1.3 矩阵运算

注:在Matlab中矩阵是逐列存储的。

1.3.1  区分左除"/"和右除"\" 

例如 a=2/3 值为0.667   b=2\3 值为1.5

1.3.2 点运算

作用:表示逐个对应元素进行相应的运算。

例如.* 表示逐个对应元素进行相乘。

clc,clear %清屏并清理内存空间
a0=reshape(1:16,[4,4]);a=a0';   
b=reshape(11:26,[4,4]);
s1=a*b      %矩阵的乘法
s2=a.*b     %矩阵的点乘
s21=a^2     %A*A--矩阵的乘法
s22=a.^2    %A中的每个元素的平方
s31=sum(a)  %sum默认是列求和,即最后结果为行向量
s32=sum(a,2)%2指的是第二维,即行,即行求和,即最后结果为列向量

1.3.3 如果两个矩阵的类型不相同,也能够相加  --Matlab的广播功能

例如 A=[1 2 3 4 ]  B=[1;2;3] 则C=A+B=[2 3 4 5;3 4 5 6;4 5 6 7]

解析:xx=repmat(A,3,1)=[1 2 3 4;1 2 3 4;1 2 3 4]

           yy=repmat(B,1,4)=[1 1 1 1;2 2 2 2;3 3 3 3]

           zz=xx+yy=[2 3 4 5;3 4 5 6;4 5 6 7]

1.3.4 inv(t)                                                                                                                                           作用:求t的逆矩阵。

例题01:求逆矩阵

clc,clear
A=[3 0 1;1 1 0;0 1 4]; %第一种方法求逆矩阵
B=A*inv(A-2*eye(3))
clc,clear          
A=[3 0 1;1 1 0;0 1 4];  %另一种方法
B=optimvar('B',3,3)     %定义符号对象的优化变量
p=eqnproblem;           %定义方程问题
p.Equations= B*A==2*B+A;%构造方程
s=solve(p)              %返回的是一个结构数组
ss=s.B                  %显示B矩阵

  例题02:求从“1,2,......,2021”中,数字“9”一共出现了多少次?

附:int2str     作用:把整数变成字符串

       num2str  作用:将数字转换成字符数组

       cell2mat  作用:将元胞数组转换成基础数据类型的普通数组

x=1:2021            %将所有的数显示出来,等价于x=[1:1:2021]
y=num2str(x);       %将数字数组转变成字符数组
y(isspace(y))=[];   %删除每两个数字的(两个)空格
n=sum(y=='9')       %计算y中9出现的次数

 注!!!:每两个数字之间有两个空格!!  即算两个字符的大小。

例题03:找出A中含有无穷的行,并且将含有无穷的行删除。

A=[1 2 inf;1 2 4;6 8 10;2 inf inf] %inf不区分大小写
ind=any(isinf(A),2)                 %判断每行是否存在inf;2指的是第二维,即沿着行去判定
A(ind,:)=[]                         %删除存在inf的行

1.4 脚本文件和函数

1.4.1 脚本文件

  Matlab的m文件分为两种,一种是脚本文件,由一系列的Matlab的命令组成,可以直接运行,上面编写的Matlab程序都是以脚本文件的格式保存的。另一种是函数文件,必须由其他语句或其他m文件调用执行。函数文件具有一定的通用性,并且可以进行递归调用。

  在脚本文件中,逗号“,”表示语句之间的分隔符;分号“;”表示表达式的计算结果不输出;注释语句由符号“%”引导,程序运行时该行忽略。

1.4.2 函数

注!!!:函数的文件名要和函数名一样。

  函数由function 语句引导,其基本结构为:

  function 输出形参表=函数名(输入形参表)

  注释说明部分

  函数体语句

  end

  函数名的命名规则与变量名的命名规则相同。输入形参为函数的输入参数,输出形参为函数的输出参数。当输出形参多于1时,应该用方括号括起来。

附:plot(x,y,'-*r')  %画折线图,“-”表示虚线;"r"表示红色;"*"表示符号:且三者没有顺序区别!

       新版本Matlab, function可与其调用语句放在同一个文件中。

       新版本Matlab,函数一定得加end!!!

function y=fun1(x)
y=x.^2+1
end
clc, clear
x=-5:1:5;
y=fun1(x);
plot(x,y)   %画折线图

 或者(将function放在同一个文件里)

clc, clear
x=-5:1:5;
y=fun2(x);
plot(x,y,'--r*')   %画折线图

function y=fun2(x)
y=x.^2+1
end

1.4.3 匿名函数

  匿名函数可以让用户编写简单的函数,不需要函数名,也不需要创建m文件,只有表达式和输入、输出参数。

  匿名函数创建方法为:

  f=@(形参列表) 表达式

其中,@是句柄操作符,f是返回该匿名函数的句柄,通过函数句柄可以实现对函数的间接调用,其调用方式为f(实参列表),使用非常方便。

clc ,clear
y=@(x) x.^2+1
x=-5:1:5            %定义匿名函数
fplot(y,[-5,5])     %画抛物线,调用的匿名函数
figure              %新开辟一个画图界面
fplot(@fun1,[-5,5]) %前面加@

!!!注意fplot和plot的区别!!!

1.5 线性方程组的解

对于n元线性方程组 Ax=b,有如下结论:

(1)无解的充分必要条件是R(A)<R(A,b);

(2)有唯一解的充分必要条件是R(A)=R(A,b)=n;

(3)有无穷多解的充分必要条件是R(A)=R(A,b)<n;

无论数学上Ax=b是否存在解,或者是多解,Matlab的求解命令x=pinv(A)*b总是给出唯一解,给出解的情况如下:

(1)当方程组有无穷多组解时,Matlab给出的是最小范数解

(2)当方程组无解时,Matlab给出的是最小二乘解x^{*},所谓的最小二乘解x^{*}是满足\left \| Ax^{*}-b \right \|^{2}最小的解,即方程两边误差平方和最小的解。

当A列满秩时,x=pinv(A)*b与x=A\b等价。

例题01:R(A)=R(A,b)=n时,即有唯一解

A=[2 -1 2;1 1 2;4 1 4];
b=[4 ;1 ;2];
Ab=[A,b];       %构造增广矩阵
r1=rank(A);     %求系数矩阵的秩
r2=rank(Ab);    %求增广矩阵的秩
x=A\b           %求线性方程组的唯一解

 例题02:R(A)<R(A,b)时,即无解

附:%%       作用:分节符

A=[1 2 3;1 0 1;2 0 2;2 4 6];
b=[1; 0 ;1 ;3];
Ab=[A,b];         %构造增广矩阵
r1=rank(A);       %求系数矩阵的秩
r2=rank(Ab);      %求增广矩阵的秩
x=pinv(A)*b       %求线性方程组的最小二乘解

注!!!:pinv(A) 作用:求A的广义逆矩阵

例题03:R(A)=R(A,b)<n时,即无穷多解

A=[1 -5 2 -3;5 3 6 -1;2 4 2 1];
b=[11 ;-1 ;6];
Ab=[A,b];          %构造增广矩阵
r1=rank(A);        %求系数矩阵的秩
r2=rank(Ab);       %求增广矩阵的秩
x=pinv(A)*b        %求线性方程组的最小范数解
Ab2=sym(Ab);       %把数值矩阵化为符号矩阵
d=rref(Ab2)        %求行最简形矩阵

1.6 枚举法

  在算法设计中,对于变量取值个数有限的问题,且问题规模较小,可以考虑使用枚举法来求解。有时为了提高算法的效率,减少枚举计算量,可以挖掘问题隐含的约束条件,这样的方法称为隐枚举法。

例题

clc ,clear,N=10000  %N为鸡蛋数量的上界
s=[];               %将所有满足条件的结果保存在变量s中
for n=63:63*2:N
    if rem(n,8)==1 & rem(n,5)==4 & rem(n,6)==3  %rem()为取余函数
    s=[s,n];
    end
end
s

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数学建模是一门重要而又有趣的学科,它是将数学的方法与现实问题相结合的过程。在进行数学建模的过程中,笔记的记录是非常重要的,可以帮助我们更好地理解问题、掌握建模方法,并且方便后期的复习和总结。 我想将我的数学建模笔记手写在CSDN上,主要出于以下几个原因。首先,手写笔记能够培养我对数学建模概念的理解和记忆能力。通过亲自动手书写数学模型、公式和解题步骤,我可以更好地掌握知识点,避免只是机械地复制粘贴或者直接照抄书中的内容。 其次,通过手写笔记,我可以更好地记录自己在建模过程中的思考和想法。数学建模是一个灵活而创造性的过程,每个人对问题的理解和解决方式不尽相同。在手写笔记中,我可以更加自由地表达自己的思路和想法,将自己独特的见解与他人分享。 此外,手写笔记也可以提高我对数学建模问题的整体把握能力。在手写过程中,我需要整理和提炼一些关键的概念和知识点,并将它们以更简洁、更清晰的方式呈现出来。这种整合和概括的过程可以帮助我更好地理解问题的本质和解决思路,并将其与其他相关知识进行联系,形成一个更完整的知识体系。 最后,将数学建模笔记手写在CSDN上,可以与其他同学和科研者进行交流与讨论。CSDN是一个专注于计算机科学与技术的知识分享平台,拥有众多对数学建模感兴趣的读者和作者。通过将自己的笔记分享在CSDN上,可以获得更多人的意见和建议,从而不断完善自己的建模能力。 总而言之,数学建模笔记的手写在CSDN上,不仅可以帮助我提升对数学建模的理解和记忆能力,还可以促进思考、整理和交流能力,对于提升自己的数学建模能力具有重要意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值