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

逻辑基础

1.逻辑变量

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

a=true
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与其对应

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

 

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不能指定范围

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

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取矩阵的一列


 

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!

n=10;
f=n;
while n>1
    n=n-1;
    f=f*n;
end

4.组合控制

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

 

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

 

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

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

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

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

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 秒。
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文件,命名默认为函数名。
*不要随意改动文件名字,否则将产生调用问题。

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

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 : 输入参量的个数

function c = addme(a,b)
    switch nargin
        case 2
            c = a + b;
        case 1
            c = a + a;
        otherwise
            c = 0;
    end
end

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

function c = addme(a,b)
    if nargin==1
        b=1;
    end
    c=a+b;
end

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

忽略不想要的输出

~表达式

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

为节省空间可以修改为:

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

特殊形式

1.函数句柄

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

fun1=@opme;
[a,b]=fun1(1,1)
a =
     0
b =
     2

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

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

3.符号运算式

采用syms构建函数

x1,x2保留符号特性

syms x1 x2
f=x1*x2;
subs(f,[x1,x2],[4,5])

x1,x2不保留符号特性

syms x1 x2
f=x1*x2;
x1=4;x2=5;
subs(f)
eval(f)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值