数学函数
函数描述因变量和自变量之间的映射关系。根据自变量的个数,可以分为多元函数和一元函数。
一元函数,忽略那些关于定义域空间特性的数学考量,简单可以写成:
x
↦
y
x \mapsto y
x↦y
多元函数可以定义为一元函数的叠加。唯一的区别是,从
x
1
x_1
x1并不是映射到一个值,而是映射到一个映射
x
2
↦
y
x_2 \mapsto y
x2↦y。这个概念在函数编程语言(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)↦y≡x1↦x2↦y
总而言之,对于工程搬砖狗而言,给出几个数,总是可以得到一个数,这就是函数。
在不同的编程语言中,函数编程语言还是面向对象语言,函数总是一个很早就要学习的内容。比如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定义函数有两个方式:
- function关键词
- @标记
function关键词
function [ret1, ret2] = f(arg1, arg2)
%
%
ret1 = ....
ret2 = ...
end
函数可以定义在函数内部,函数现在甚至能定义在脚本里面。但是最好的方式还是一个函数一个文件。当在一个单独的文件中定义一个函数时,最后的那个end可以省略。
@标记
这个标记有两个作用:
- 把函数编程函数句柄,FUNHANDLE=@FUNCTION_NAME;
- 定义匿名函数,返回句柄:FUNHANDLE=@(ARG1, ARG2)EXPRESSION;
通过这两种方式得到的函数句柄,可以作为参数传入其它函数,也能够作为返回值。
可以通过isa
来判断h是否是一个函数句柄:
function trigPlot(h, val)
if isa(h, 'function_handle')
A = h(a);
plot(A)
end
在Matlab的海量工具箱里面,需要传入函数句柄参数的不可胜数。比如数值微分、数值积分、优化等,都需要自己定义函数,把句柄传入相应的函数进行计算。
总结
- 数学函数是映射;
- 数学表达式是一种函数定义方式;
- Matlab有一个数据类型叫function_handle。