这个是复变函数的知识点,第一个画红线的地方的表达式需要根据复数的欧拉定理进行理解:
复数的欧拉定理的内容是:exp(i*theta)=cos(theta)+i*sin(theta)
MATLAB等软件也是在这一定理的基础上定义了exp函数对复数参数的处理。
所以
x=r*exp(i*t);
就是
x=r*(i*sin(t)+cos(t));
不过在表达上比前者简洁了而已,效果是一样的。有了该定理,复数可以用更简单的表达上实现向量的功能。
第二处红线的问题是,nargout的作用是什么,什么是输出变量:
nargout是一个matlab风格十足的函数,别的语言的函数是根据形式参数/实际参数确认返回值,最多也只能根据右值(rvalue)确认;而matlab偏偏可以利用nargout根据左值(lvalue)确认返回值.
简单说:直接调用fun(123),它的nargout只能是0;
将fun函数的值返给ret变量,ret=fun(123),此时,nargout==1;
而当调用[ret1,ret2]=fun(123)时,fun就有nargout==2;
这个即不用事先约定的,灵活变通的返回值。
于是,开始调试这个函数:
可以看到
circle(12);
的输出结果是画一个空心的圆,半径是12
那么circle(2);
就是画一个空心的,半径为2的圆
第二题,输入s=circle(2);
得到一个实心圆,填充为蓝色,半径为2
第三题,fill和最后一行代码,fill函数是在返回值或者说是输出变量个数不小于1时被调用的,其功能是,fill(x,y,color)即填充一系列x坐标和y坐标围成的图形。前面说复数实现了向量的功能即是plot(z)即plot(real(z),imag(z)),而对于fill不能直接用复数,则fill(real(z),imag(z),'b')
追答书上写的代码也许不合matlab2021版本,所以,调试过程中,我调整了一下。
function f = circle(r,varargin)
if nargin>1
error('Too many input aguemnsl!')
elseif nargin==0
error('must have one input arguments!');
end;
%r=cell2mat(varargin(1));
t=0:pi/100:2*pi;
i=complex(0,1);
x=r.*exp(i*t);
figure
if nargout==0
plot(x,'g');
else
f=pi*r*r;
fill(real(x),imag(x),'b')
end
axis('square')
end