数学建模学习(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)
相关推荐
数模竞赛Paid answer28 分钟前
2017年国赛高教杯数学建模A题CT系统参数标定及成像解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·高教杯
liangbm328 分钟前
数学建模笔记——动态规划
笔记·python·算法·数学建模·动态规划·背包问题·优化问题
数模竞赛Paid answer35 分钟前
2018年国赛高教杯数学建模D题汽车总装线的配置问题解题全过程文档及程序
数学建模·全国大学生数学建模竞赛·数学建模数据分析
2401_858120538 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
leon6258 小时前
优化算法(一)—遗传算法(Genetic Algorithm)附MATLAB程序
开发语言·算法·matlab
小齿轮lsl8 小时前
PFC理论基础与Matlab仿真模型学习笔记(1)--PFC电路概述
笔记·学习·matlab
学习不好的电气仔11 小时前
基于虚拟阻抗的逆变器下垂控制环流抑制策略MATLAB仿真
开发语言·matlab
原机小子11 小时前
掌握MATLAB中的数据类型转换技巧
开发语言·matlab
机器学习之心14 小时前
时序预测 | Matlab实现SSA-TCN麻雀搜索算法优化时间卷积网络时序预测-递归预测未来数据(单输入单输出)
matlab·递归预测未来·ssa-tcn·麻雀搜索算法优化时间卷积网络
shiming887917 小时前
MATLAB图像处理
图像处理·计算机视觉·matlab