
2.2 不同函数的MATLAB表示
除了前面介绍的常规函数之外,在实际应用中还有各种特殊形式的函数,如反函数、复合函数、隐函数与参数方程等,本节将分别介绍这些函数的定义、MATLAB输入方法与图形绘制方法。
2.2.1 反函数
定义2-5 如果已知函数y=f(x),并且对值域内的每个y,都有一个函数x=g(y)与之对应,且这种对应关系是一一对应,则称x=g(y)为y=f(x)的反函数,记作f−1(y)。
finverse()函数可以求出一些给定函数的反函数。值得指出的是,即使一个函数是一一对应的函数,有时也不一定能得出其反函数的解析解。
例2-2 试求出函数f(x)=1+ln(x+1)的反函数。
解 先输入原函数,然后求出其反函数,再将反函数的自变量替换成y,则可以得出原函数的反函数为x=g(y)=f−1(y)=ey−1−1。
>> syms x y; f(x)=1+log(x+1); g(x)=finverse(f,x); g(y)
2.2.2 复合函数
定义2-6 如果函数y=f(u)为u的函数,而u=g(x)为x的函数,则y也是x的函数,y=f(g(x)),这种函数称为复合函数。
在实际应用中,还可以将一个函数嵌入另一个函数来构造复合函数。例如,已知两个函数f(x)和g(x),则可以构造出两个复合函数f(g(x))和g(f(x))。复合函数f(g(x))又记作(f◦g)(x)。
例2-3 已知数学函数,g(x)=tan x,试求出复合函数f(g(x))和g(f(x))。
解 可以有三种方法在MATLAB下表示复合函数,第一种是通过变量替换的模式计算,第二种是调用符号运算工具箱的compose()函数顺序计算,第三种是按照函数的方式直接计算。下面将给出这三种方法的MATLAB语句。

这三种方法得出的结果是一致的。从使用的方便程度看,第三种方法值得推荐。

例2-4 Dawson函数是一个特殊函数,其定义为

已知Dawson函数的一阶导数可以由下式计算

试用复合函数的方法递推求出该函数的二阶、三阶和四阶导数。
解 可以先在MATLAB下申明符号函数f(x),然后采用变量替换的方式求取Dawson函数的高阶导数。

这样可以得出一系列Dawson函数的导数为

2.2.3 分段函数的描述
定义2-7 如果某函数在不同的自变量取值范围内函数的表达式也是不同的,则这类函数称为分段函数。
例2-5 分段函数的一个实例

在符号型数据结构下,一般不适合采用if类语句描述函数。如何来输入分段函数呢?MATLAB符号运算工具箱的新引擎——MuPAD支持分段函数的使用,提供了底层的piecewise()函数描述分段函数,不过该函数在MATLAB下是不能直接调用的,必须为其编写一个接口函数,例如编写接口函数piecewise1()。

该函数的调用格式为f=piecewise1(var1,var2,…),其中输入变元varj必须成对出现,都应该由字符串给出,前面一个是条件,后面一个是该条件下的函数表达式,条件中的逻辑运算可以由关键词and、or或not表示。
该函数使用了try,catch结构,确保输入变元成对出现,否则将给出错误信息。由于生成的字符串中最后一个字符是多余的逗号,所以使用end-1下标舍弃它。
从MATLAB R2016b版开始,提供了piecewise()接口函数,用符号表达式表示条件和函数,如果有该函数建议尽量采用piecewise()函数。
例2-6 考虑饱和非线性函数,试绘制其曲线。
解 可以首先描述分段函数,然后绘制该函数曲线。值得指出的是,由于符号运算本身的局限性,分段函数定义的符号表达式不能用ezplot()函数直接绘制。

如果|x|⩽1.1在数学上表示成−1.1⩽x⩽1.1,也可以将其理解成x⩾−1.1且x⩽1.1,这时相应的符号表达式表示应该为x>=−1.1&x<=1.1。
例2-7 试用符号表达式表示例2-5中给出的分段函数,并绘制其三维曲面。
解 可以先申明符号变量,并用分段函数的形式定义出二元函数p(x1,x2),如果用常规方法,可以生成一组网格数据,将网格数据代入函数就可以直接进行函数求值,得出的函数值再由符号型数据结构转换成双精度数据,并直接绘制出表面图。这里采用直接绘制的方法得出表面图,如图2-1所示。

图2-1 二元函数的表面图

例2-8 使用分段函数的一个优点是可以同时给出函数的定义域。试在MATLAB下表示函数f(x)=2 sin 3x,其中−π/6⩽x⩽π/6。
解 该函数及其定义域可以由分段函数直接描述出来,如果自变量x在定义域范围内,就可以正常求值;不在定义域内,则返回NaN。

2.2.4 隐函数
在实际应用中经常会遇到一类函数,满足f(x,y)=0,但没有办法将其写出y=g(x)的显式形式,这类函数称为隐函数。本节将讨论二元隐函数和三元隐函数的数学形式及其图形表示方法。
定义2-8 隐函数的一般数学形式为f(x1,x2,…,xn)=0。
1)二元隐函数
以二元隐函数f(x,y)=0为例,在实际应用中可以有两种方法描述这样的隐函数,一种是符号表达式,另一种是字符串方式。描述了隐函数的数学模型,则可以通过ezplot()函数直接绘制隐函数曲线。
还可以用符号表达式或匿名函数f描述隐函数,然后调用fimplicit(f)函数绘制隐函数曲线,这时匿名函数中应该采用点运算。默认的自变量区间为[−5,5]。如果人为地指定自变量范围,则可以由下面格式绘制隐函数曲线:
fimplicit(f,[xm,xM]) 或 fimplicit(f,[xm,xM,ym,yM])
例2-9 已知隐函数x2 sin(x+y2)+y2ex+y+5 cos(x2+y)=0,试绘制出x与y之间的关系曲线。
解 用两种方法描述这样的隐函数,再调用ezplot()函数,就可以绘制出隐函数的曲线,如图2-2所示。这两种描述原函数的方法会得出完全一致的二维曲线。


图2-2 隐函数的相平面图
如果使用新函数fimplicit(),则可以给出下面语句,得出完全一致的结果。
>> fimplicit(f2,[-2*pi,2*pi])
2)三元隐函数
对三元隐函数f(x,y,z)=0而言,MATLAB提供了fimplicit3()函数,可以直接绘制隐函数曲面。可以用符号表达式或匿名函数直接描述三元隐函数f,然后由fimplicit3(f)直接绘制隐函数曲面。当然,用户也可以自行指定坐标轴范围。

例2-10 试绘制下面的三元隐函数曲面

解 可以由符号函数直接描述三元隐函数,然后调用fimplicit3()函数直接绘制曲面的表面图,如图2-3所示。


图2-3 三元隐函数曲面
2.2.5 参数方程
定义2-9 如果一组因变量可以定义成一个或多个自变量的函数,则这组因变量称为参数方程。
这里将分别考虑两种参数方程——单自变量的参数方程与双自变量的参数方程的MATLAB表示与图形绘制方法。
定义2-10 如果有一个二维平面内的质点,已知该质点的坐标是时间的函数,x=f(t),y=g(t),则称这类函数为单自变量的参数方程,t称为参数。
参数方程的轨迹有两种绘制方法,一种是生成一个时间向量t,计算出x和y向量,则通过plot(x,y)直接绘制出轨迹的相平面曲线,类似的方法还可以处理质点的三维相空间轨迹绘制问题;另一种方法是用符号表达式分别表示f(t)和g(t)函数,然后由fplot(f,g,[tm,tM])函数即可绘制相平面曲线,其中t∈[tm,tM]。函数ezplot()也可以用同样的格式绘制参数方程曲线。
例2-11 若a=8,b=5,且t∈(0,10π),试绘制下面参数方程的曲线
x=(a+b)cos t−b cos[(a/b+1)t],y=(a+b)sin t−b sin[(a/b+1)t]
解 可以由符号表达式直接描述参数方程的数学模型,这样即可绘制出该函数的曲线,如图2-4所示。


图2-4 参数方程的曲线图
例2-12 已知参数方程

其中t∈(0,10),试绘制x(t)与y(t)间的关系曲线。
解 如果仿照前面的方法绘制曲线,则可以直接给出下面语句。不过就这个具体的例子而言,由ezplot()很难控制步距选择与坐标系尺度调整,所以得出的结果往往不能令人满意,可以用fplot()函数直接求解。

可以考虑采用另一种方法绘制相平面曲线,得出的结果如图2-5所示。可以看出,这样的曲线变化是杂乱无章的,如果不借助计算机很难绘制其曲线。

图2-5 参数方程的相平面图

定义2-11 双参数的参数方程由下式给出:

若um⩽u⩽uM,vm⩽v⩽vM,则由fsurf(x,y,z,[um,uM,vm,vM])函数可以直接绘制三维表面图,u、v变量的默认区间为[−5,5]。ezsurf()函数也可以用于这类曲面的绘制,调用格式是一致的,默认区间为(−2π,2π)。
例2-13 著名的Möbius带可以由数学模型
x=cos u+v cos u cos u/2, y=sin u+v sin u cos u/2, z=v sin u/2
描述。如果0⩽u⩽2π,−0.5⩽v⩽0.5,试绘制Möbius带的三维表面图。
解 首先需要申明两个符号变量u、v,并将参数方程输入到MATLAB环境中,这样就可以由下面的语句直接绘制Möbius带,得出如图2-6所示的表面图。


图2-6 Möbius带的表面图(图形旋转后结果)
2.2.6 极坐标函数
通常使用的坐标系是直角坐标系,又称为Cartesian坐标系,而实际应用中有时可能会用到其他坐标系,例如极坐标系(polar coordinates)。
定义2-12 考虑平面内由原点出发的一条射线,由射线角度θ与射线长度ρ可以构造一个坐标系,这样的坐标系称为极坐标系。通常极坐标可以表示为显式表达式ρ=ψ(θ)。
定理2-1 极坐标系到直角坐标系的转换公式为x=ρ cos θ,y=ρ sin θ。
定理2-2 直角坐标系到极坐标系的转换公式为,θ=arctan y/x。
在MATLAB中可以使用polarplot()函数直接绘制出显式极坐标函数ρ=ψ(θ)的曲线,该函数的调用格式为polarplot(θ,ρ),其中θ与ρ为数据向量,θ的单位为弧度(rad)。早期版本polar()函数的作用是一致的,但不建议使用。
例2-14 试绘制极坐标函数ρ=e−0.1θ sin 4θ的曲线。
解 选择自变量θ的变化范围θ∈(0,10π),则可以生成函数的极坐标数据,并绘制出极坐标图形,如图2-7所示。


图2-7 极坐标曲线
很多极坐标函数是周期性函数,选择一个周期内的θ值就可以把极坐标曲线绘制出来。这里的函数不是周期性的,所以不论取多大范围都不能绘制完整的极坐标曲线。