函数,函数,以及函数但是Matlab

数学函数

函数描述因变量和自变量之间的映射关系。根据自变量的个数,可以分为多元函数和一元函数。

一元函数,忽略那些关于定义域空间特性的数学考量,简单可以写成:
x ↦ y x \mapsto y xy

多元函数可以定义为一元函数的叠加。唯一的区别是,从 x 1 x_1 x1并不是映射到一个值,而是映射到一个映射 x 2 ↦ y x_2 \mapsto y x2y。这个概念在函数编程语言(Haskell等)中有很好的表达。
( x 1 , x 2 ) ↦ y ≡ x 1 ↦ x 2 ↦ y (x_1, x_2) \mapsto y \equiv x_1 \mapsto x_2 \mapsto y (x1,x2)yx1x2y

总而言之,对于工程搬砖狗而言,给出几个数,总是可以得到一个数,这就是函数。

在不同的编程语言中,函数编程语言还是面向对象语言,函数总是一个很早就要学习的内容。比如C语言总会有一个:

int main(int argn, char**args){
   printf("Hello world!\n");
   return 0;
}

这也是一个函数,从一个整数、一组字符串映射到一个整数。只不过,C语言的函数的效果并不只是输出的那个值,通常还在于函数操作内存的过程。

对于函数式编程语言,例如Matlab,通常期待大部分函数只是做映射,函数参数 ↦ \mapsto 函数输出。有些更严格的函数式编程,对于有副作用的函数还必须特别申明。

符号函数

对于一个函数,数学入门但是没有完全入门的总喜欢把下面的形式称为函数:
y = sin ⁡ ( x ) + cos ⁡ ( x ) y = \sin(x) + \cos(x) y=sin(x)+cos(x)

这是一个有表达式的函数,有些编程语言中,例如Julia

y(x) = sin(x) + cos(x)

这是很合理的语法。

在Maple、Mathematics、Matlab等软件中,可以定义:

syms x 
y = sin(x) + cos(x)

这就定义一个符号变量x,一个符号表达式y。还能通过

double(subs(y, x, 0.1))

求得函数在0.1处的值(以浮点数的形式)。

实际上,这个功能还是很强大的,能够推导公式,进行积分、微分。

但是这个符号表达式、符号变量,并不是Matlab的函数。

函数,但是Matlab

Matlab类似于一个计算器,虽然新的版本添加了一大堆面向对象、面向连接的编程方式,但是编个函数始终是其核心工作。而且,在Matlab中,函数可以作为句柄赋值,并且可以作为函数的参数和返回值。从这个意义上,Matlab是一个函数式编程语言。

Matlab定义函数有两个方式:

  1. function关键词
  2. @标记

function关键词

function [ret1, ret2] = f(arg1, arg2)
% 
%
ret1 = ....
ret2 = ...
end

函数可以定义在函数内部,函数现在甚至能定义在脚本里面。但是最好的方式还是一个函数一个文件。当在一个单独的文件中定义一个函数时,最后的那个end可以省略。

@标记

这个标记有两个作用:

  1. 把函数编程函数句柄,FUNHANDLE=@FUNCTION_NAME;
  2. 定义匿名函数,返回句柄:FUNHANDLE=@(ARG1, ARG2)EXPRESSION;

通过这两种方式得到的函数句柄,可以作为参数传入其它函数,也能够作为返回值。

可以通过isa来判断h是否是一个函数句柄:

function trigPlot(h, val)
if isa(h, 'function_handle')
   A = h(a);
   plot(A)
end

在Matlab的海量工具箱里面,需要传入函数句柄参数的不可胜数。比如数值微分、数值积分、优化等,都需要自己定义函数,把句柄传入相应的函数进行计算。

总结

  1. 数学函数是映射;
  2. 数学表达式是一种函数定义方式;
  3. Matlab有一个数据类型叫function_handle。
posted @ 2023-03-16 09:11  大福是小强  阅读(27)  评论(0编辑  收藏  举报  来源