数学建模学习(1):Matlab函数

逻辑基础

1.逻辑变量

Logical类型: true(真值); false(假值)

Matlab 复制代码
a=true
Matlab 复制代码
b=false

2.逻辑判定

数字逻辑:

常用的特殊逻辑:

3.逻辑运算

交叉知识-扩充优先级

|---------|--------------------------|
| 优先级 | 符号 |
| 1(最高) | 括号( ) |
| 2 | 转置 ' ;次幂 ^ |
| 3 | 一元运算符 + - ~ |
| 4 | 乘除 * / \ |
| 5 | 加减 + - |
| 6 | 冒号表达式 : |
| 7 | 二元比较逻辑 > >= < <= ~= |
| 8 | 逻辑与 & |
| 9 | 逻辑或 | |
| 10 | 标量逻辑与 && |
| 11(最低) | 标量逻辑或 || |

记不住优先级顺序时,老老实实加括号才是最好的选择

结构基础

1.算法需求

算法五特性

(1)有穷性。有穷性是指算法需在有穷步骤、有穷时间内结束。

(2)确定性。确定性是指每个步骤都有确切的意义,相同的输入有相同的输出。

(3)有效性。有效性是指可通过已实现的运算在有限次完成,或叫可行性。

(4)输入。

(5)输出。

2.分支语句

分支语句的作用:判断当前的情况来决定下一步的工作

一般情形:MATLAB提供了if-else-end结构和switch-case-otherwise结构来实现分支功能。

特殊情形:try-catch结构是分支选择结构的一种特殊形式。如果程序的bugs在try语句块中,那么程序将会执行catch语句块。try-catch语句可以用于捕捉错误。

问:为什么try-catch应用较少?

在当前Matlab的脚本高debug运行模式下,采用dbstop if error等语句更加简洁,当针对特殊异常捕获时才会使用try-catch。

if-else-end

注意elseif不能写为else if,若写为后者,需要补充end与其对应

具体案例:一元二次方程求实数根

Matlab 复制代码
a=1;b=2;c=1;
delta=b^2-4*a*c;
if delta>0
    x(1)=(-b+sqrt(delta))/2/a;
    x(2)=(-b-sqrt(delta))/2/a;
elseif delta ==0
    x=(-b+sqrt(delta))/2/a;
else
    x=[];   
end

switch-case-otherwise

通过switch_expression获取要判断的值,从不同的case中选择满足的值。

otherwise不需要提供判断条件,当其他分支均不满足时被执行。

*Switch不能指定范围

具体案例:一元二次方程求实数根

Matlab 复制代码
a=1;b=2;c=1;
delta=b^2-4*a*c;
switch sign(delta)
    case 1
    x(1)=(-b+sqrt(delta))/2/a;
    x(2)=(-b-sqrt(delta))/2/a;
    case 0
    x=(-b+sqrt(delta))/2/a;
    otherwise
    x=[];
end

3.循环语句

循环语句的作用:对重复性工作进行执行,并提供起始和结束的标志

MATLAB提供了for结构和while结构来实现分支功能。

-for语句循环的特点是判断条件通常是对循环次数的判断,一般循环次数预先设定好;

-while语句直接将逻辑判断语句作为控制条件

原则上while的适用范围更广一些。但在一般操作中for循环的应用更加广泛。

for循环

index在values中按顺序进行取值,value一般是行向量形式,一般采用冒号表达式进行生成

*当value为矩阵形式,则将矩阵按照列进行切割,每个value取矩阵的一列

Matlab 复制代码
s=10;

H=zeros(s);

for ii=1:s

for jj = 1:s

H(ii,jj) = 1/(ii+jj-1);

end

end

while循环

通过expression来判断下一次循环是否被进行

一般情况下,应在循环结构中对expression进行更新

具体案例:计算10!

Matlab 复制代码
n=10;
f=n;
while n>1
    n=n-1;
    f=f*n;
end

4.组合控制

除了在判断中对代码下一步进行控制,还具有三种特殊控制符

Matlab 复制代码
limit = 0.8; s = 0;
while 1
    tmp = rand;
    if tmp > limit
        break
    end
    s = s + tmp;
end
Matlab 复制代码
%死循环
limit = 0.8; s = 0;
while 1
    tmp = rand;
    if tmp > limit
        continue
    end
    s = s + tmp;
end

*交叉知识-循环体与矩阵

Matlab具有非常优异的矩阵运算优势,能用矩阵运算则用矩阵

1.尽量避免对矩阵元素进行循环遍历操作

2.循环体中的参量应提前预留空间,避免在循环中新建空间

Matlab 复制代码
x=sin(0:0.001:1e5);
tic
for ii=2:(length(x)-1)
    y(ii-1)=(x(ii-1)+x(ii+1))/2;
end
toc
%时间已过 9.541004 秒。
Matlab 复制代码
x=sin(0:0.001:1e5);
tic
y=zeros(1,length(x)-2);
for ii=2:(length(x)-1)
    y(ii-1)=(x(ii-1)+x(ii+1))/2;
end
toc
%时间已过 0.695248 秒。

*交叉知识-多线程

自定义函数

1.M-File

尽管完全在MATLAB命令行中进行许多有用的计算,但迟早需要编写M文件。它们是其他编程语言中程序、函数、子程序和过程的等价物。将一系列命令收集到一个M文件中会带来很多可能性,包括
• 通过编辑文件而不是重新键入一长串命令来实现算法,
• 对数值实验进行永久记录,
• 建立日后可重复使用的公用设施,
• 与他人交换M文件。

M-File的两种主要形式
• 脚本:可直接运行、编辑、调试的一组代码
• 函数:进行特定输入/输出的一组代码

2.函数格式

基本格式:

function[输出形参表: output1, ...,outptn] = 函数名(输入形参表: input1, ... , inputn)

函数体代码部分

end

函数需存为m文件,命名默认为函数名。
*不要随意改动文件名字,否则将产生调用问题。

具体案例:获取数列最大值

Matlab 复制代码
my_max.m
function [maxval]= my_max(L)
    maxval=L(1);
    for ii=2:length(L)
        if maxval<L(ii)
            maxval=L(ii);
        end
    end
end

如果Matlab有该功能的函数,应避免自己重新实现

3.输入输出

如需要默认输入值,则需要通过输入参量进行控制

nargin : 输入参量的个数

Matlab 复制代码
function c = addme(a,b)
    switch nargin
        case 2
            c = a + b;
        case 1
            c = a + a;
        otherwise
            c = 0;
    end
end

仅输入一个变量,第二个变量默认为1

Matlab 复制代码
function c = addme(a,b)
    if nargin==1
        b=1;
    end
    c=a+b;
end

代入变量时,排序靠前的参量先被赋值

忽略不想要的输出

~表达式

Matlab 复制代码
function [c1,c2] = opme(a,b)
    if nargin<2
        b=1;
    end
    c1=a+b;
    c2=a+b;
end

为节省空间可以修改为:

通过~表达式可以选择自己需要的输出,节省内存空间

特殊形式

1.函数句柄

采用@来创建函数句柄,从而调用函数或将函数作为变量

Matlab 复制代码
fun1=@opme;
[a,b]=fun1(1,1)
a =
     0
b =
     2

采用@来创建匿名函数,减少M文件的创建

Matlab 复制代码
fun2=@(x,y)(x+y);%定义匿名函数
fun2(1,1);%调用匿名函数

3.符号运算式

采用syms构建函数

x1,x2保留符号特性

Matlab 复制代码
syms x1 x2
f=x1*x2;
subs(f,[x1,x2],[4,5])

x1,x2不保留符号特性

Matlab 复制代码
syms x1 x2
f=x1*x2;
x1=4;x2=5;
subs(f)
eval(f)
相关推荐
机器学习之心7 小时前
Bayes-GRU-Attention的数据多特征分类预测Matlab实现
matlab·分类·gru
叶庭云7 小时前
Matlab 和 R 语言的数组索引都是从 1 开始,并且是左闭右闭的
matlab·编程语言·r·数组索引·从 1 开始
γ..9 小时前
基于MATLAB的图像增强
开发语言·深度学习·神经网络·学习·机器学习·matlab·音视频
IT猿手12 小时前
基于PWLCM混沌映射的麋鹿群优化算法(Elk herd optimizer,EHO)的多无人机协同路径规划,MATLAB代码
算法·elk·机器学习·matlab·无人机·聚类·强化学习
超级大咸鱼21 小时前
CW信号的正交解调
matlab·verilog·fpga·数字信号·解调·正交解调·cw
C灿灿数模1 天前
备战美赛!2025美赛数学建模C题模拟预测!用于大家练手模拟!
数学建模
乌恩大侠1 天前
画图,matlab,
开发语言·matlab
吐泡泡科技1 天前
无人机视频传输系统的通信能耗优化
matlab·通信能耗·无人机通信
达不溜方1 天前
基于MATLAB的图像增强
开发语言·人工智能·学习·机器学习·matlab·云服务·效率
信号处理学渣2 天前
matlab的一些时间函数【转】
matlab