用Matlab绘制复变函数

受到老韩的启发。
大家有没有想过这个问题:函数y=x^2+1的两个虚根有没有几何意义?也就是说,当我们的对数的认知扩展到复数之后,那么函数的复数根该如何在图象上表现出来。

我一直对这个问题充满了好奇。按道理说,如果我们将自变量扩展到整个复平面,即复变函数,二次函数应该与y=0平面相交两次。这个图象是怎么样的我一直没有想出来。

现在,拥有一定编程能力之后,也当是一次学习和实践。

我们先来看看一个二次函数的庐山真面目吧。以下代码用Matlab编写:(运行时需要输入y=ax^2+bx+c的a、b、c三系数以及y的范围)
a=input(‘a: ‘);
b=input(‘b: ‘);
c=input(‘c: ‘);
ymin=input(‘ymin: ‘);
ymax=input(‘ymax: ‘);
x1=0;
x2=0;
y=0;
z1=0;
z2=0;
r1=0;
r2=0;
cp=c;

 

for q=ymin:.01:ymax
c=cp-q;
if q==ymin
y(1)=q;
r1=(-b+(b^2-4*a*c)^.5)/2/a;
r2=(-b-(b^2-4*a*c)^.5)/2/a;
x1(1)=real(r1);
x2(1)=real(r2);
z1(1)=imag(r1);
z2(1)=imag(r2);
else
y(length(y)+1)=q;
r1=(-b+(b^2-4*a*c)^.5)/2/a;
r2=(-b-(b^2-4*a*c)^.5)/2/a;
x1(length(x1)+1)=real(r1);
x2(length(x2)+1)=real(r2);
z1(length(z1)+1)=imag(r1);
z2(length(z2)+1)=imag(r2);
end
end

plot3(x1,z1,y,’b:’,’LineWidth’,2);
hold on;
plot3(x2,z2,y,’b:’,’LineWidth’,2);
hold off;
xlabel(‘x’);
ylabel(‘z’);
zlabel(‘y’);
grid;

001这是y=x^2+1的图像。大家可以看到,z轴是一条虚轴,x轴是一条实轴,y轴为纵向的轴。我们可以清晰地看到两条抛物线。而上面的一条正是我们平常所认知的二次函数图像(在z=0平面上),而下面那个就是不为人知的了。

事实上,如过以复变函数都由两条相互垂直抛物线构成(另外一条抛物线为y=-az^2-b^2/4ac)这两条抛物线有一个永恒的共点:当x=-b/2a时。

让我们再来看一看另外一个函数:y=ix^2+1

002这回二次项系数变成了虚数,可是图像的形状依然不变。

那么,三次、四次、五次函数又都是什么样的呢?

我编了一个画多项式复变函数的通用程序,运行时许要输入一个多项式(例:绘制y=4x^4+9x^3+5x^2-3x-10则输入[4 9 5 -3 -10])以及y的范围。代码如下

p=input(‘input a polynomial: ‘);
ymin=input(‘input ymin: ‘);
ymax=input(‘input ymax: ‘);
c=p(length(p));
x=0;
y=0;
z=0;
count=0;

for q=ymin:.01:ymax
p(length(p))=c-q;
r=roots(p);
count=count+1;
for w=1:1:length(r)
x(count,w)=real(r(w,1));
y(count,w)=q;
z(count,w)=imag(r(w,1));
end
end

hold on;

x=x(2:end,:);
y=y(2:end,:);
z=z(2:end,:);

for q=1:1:length(r)
scatter3(x(:,q),z(:,q),y(:,q));
end
grid;
hold off;
xlabel(‘x’);
ylabel(‘z’);
zlabel(‘y’);

运行结果:绘制y=3x^3+x^2-2x+2

003