姓名:刘烁烁 ;学号:20181213904;学院:广州研究院
原链接:https://zhuanlan.zhihu.com/p/161734503 来源:知乎
【嵌牛导读】电磁学的基础
【嵌牛鼻子】散度、旋度、梯度定义
【嵌牛提问】怎么matlab把这些概念表示出来呢?
【嵌牛正文】散度、旋度、梯度定义及matlab表示
物理学中把某个物理量在空间一个区域内的分布称为场。从各种场的取值性质来看可以分成两大类,一类是每个点对应一个数值,这种场统称为标量场,如温度场、密度场等;另一类是每 个点对应一个向量,这种场称为向量场,如引力场、梯度场、电场、磁场等。场本身的性质与坐标选择无关,但对各种场的分析和计算应该选择适当的坐标系,本章均以直角坐标系为例,分析场的梯度、散度和旋度等特性。同时,详细介绍标量场的梯度、矢量场的散度和旋度的MATLAB处理方法。
一、场的数学模型和物理模型
场(field)在数学上是指一个向量到另一个向量或数的映射。一般的,在常规的有关电磁学的物理研究中,我们所谈论的场,实质上是一个(二维)三维空间中的点对实数集和(二维)三维实向量的映射。对实数集的映射,称之为标量场(也叫作标量函数),对向量(又名矢量)的映射称之为矢量场(矢量函数)。物理上,场是指(一个或者一族)物理量在空间中分布的状况的综合,这种综合同样被看作是一种物质。在量子力学的语境下,这样的综合是物质的一般形式,因为它的主要研究对象就是物质(量子系统)的“概率分布场”。
“在物理里,场(英语:Field)是一个以时空为变数的物理量。空间中弥漫着的基本相互作用被命名为“场”。[1]场可以分为标量场、矢量场和张量场等,依据场在时空中每一点的值是标量、矢量还是张量而定。例如,经典重力场是一个矢量场:标示重力场在时空中每一个的值需要三个量,此即为重力场在每一点的重力场矢量分量。更进一步地,在每一范畴(标量、矢量、张量)之中,场还可以分为“经典场”和“量子场”两种,依据场的值是数字或量子算符而定。
场被认为是延伸至整个空间的,但实际上,每一个已知的场在够远的距离下,都会缩减至无法量测的程度。例如,在牛顿万有引力定律里,重力场的强度是和距离平方成反比的,因此地球的重力场会随着距离很快地变得不可测得(在宇宙的尺度之下)。
定义场是一个“空间里的数”,这不应该减损场在物理上所有的真实性(如定义“质量”为秤上的数字)。“场占有空间。场含有能量、动量。场的存在排除了真正的真空。”[2]真空中没有物质,但并不是没有场的。场形成了一个“空间的状态”[3]
当一个电荷移动时,另一个电荷并不会立刻感应到。第一个电荷会感应到一个反作用力,并获得动量,但第二个电荷则没有感应,直到第一个电荷移动的影响以光速传递到第二个电荷那里,并给予其动量之后。场的存在解决了关于第二个电荷移动前,动量存在在哪里的问题。因为依据动量守恒定律,动量必存在于某处。物理学家认为动量应该存在于场之中。如此的认定让物理学家们相信电磁场是真实的存在,使得场的概念成为整个现代物理的范式。”——维基百科语。
为了运用微积分以及更为复杂的数学工具研究场的细节性质和整体性质,人们给出了如下定义:
梯度:
梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。
定义一个三元标量函数(三维空间的标量场)
,对于空间中的每一点
(D为定义域或者说场存在的区域),都可以定义出一个矢量
散度:
散度(divergence)可用于表征空间各点矢量场发散的强弱程度,物理上,散度的意义是场的有源性。当div F>0 ,表示该点有散发通量的正源(发散源);当div F<0 表示该点有吸收通量的负源(洞或汇);当div F=0,表示该点无源。
定义散度,实际上是借助通量这一概念来定义的。要定义通量,必须引入面元矢量这一概念。
设 S为一个包含体积 V的闭合空间曲面, dS 为曲面 S上的面元矢量,满足:dS=dSe⊥ 。定义矢量 F 与 dS的内积
F点乘dS 为通过面元矢量 ds的通量,则散度可定义为:
旋度:
旋度是向量分析中的一个向量算子,可以表示三维向量场对某一点附近的微元造成的旋转程度。 这个向量提供了向量场在这一点的旋转性质。旋度向量的方向表示向量场在这一点附近旋转度最大的环量的旋转轴,它和向量旋转的方向满足右手定则。旋度向量的大小则是绕着这个旋转轴旋转的环量与旋转路径围成的面元的面积之比。举例来说,假设一台滚筒洗衣机运行的时候,从前方看来,内部的水流是逆时针旋转,那么中心水流速度向量场的旋度就是朝前方向外的向量。
百度百科上引用的旋度定义
拉普拉斯算子:
在计算梯度时用到了一个算符称为Nabla算子,记为
,拉普拉斯算子
通过推导,可以证明
标量场的可视化
plot函数:
plot Linear plot.
plot(X,Y) plots vector Y versus vector X. If X or Y is a matrix,
then the vector is plotted versus the rows or columns of the matrix,
whichever line up. If X is a scalar and Y is a vector, disconnected
line objects are created and plotted as discrete points vertically at
X.
plot(Y) plots the columns of Y versus their index.
If Y is complex, plot(Y) is equivalent to plot(real(Y),imag(Y)).
In all other uses of plot, the imaginary part is ignored.
Various line types, plot symbols and colors may be obtained with
plot(X,Y,S) where S is a character string made from one element
from any or all the following 3 columns:
b blue . point - solid
g green o circle : dotted
r red x x-mark -. dashdot
c cyan + plus -- dashed
m magenta * star (none) no line
y yellow s square
k black d diamond
w white v triangle (down)
^ triangle (up)
< triangle (left)
> triangle (right)
p pentagram
h hexagram
For example, plot(X,Y,'c+:') plots a cyan dotted line with a plus
at each data point; plot(X,Y,'bd') plots blue diamond at each data
point but does not draw any line.
plot(X1,Y1,S1,X2,Y2,S2,X3,Y3,S3,...) combines the plots defined by
the (X,Y,S) triples, where the X's and Y's are vectors or matrices
and the S's are strings.
For example, plot(X,Y,'y-',X,Y,'go') plots the data twice, with a
solid yellow line interpolating green circles at the data points.
The plot command, if no color is specified, makes automatic use of
the colors specified by the axes ColorOrder property. By default,
plot cycles through the colors in the ColorOrder property. For
monochrome systems, plot cycles over the axes LineStyleOrder property.
Note that RGB colors in the ColorOrder property may differ from
similarly-named colors in the (X,Y,S) triples. For example, the
second axes ColorOrder property is medium green with RGB [0 .5 0],
while plot(X,Y,'g') plots a green line with RGB [0 1 0].
If you do not specify a marker type, plot uses no marker.
If you do not specify a line style, plot uses a solid line.
plot(AX,...) plots into the axes with handle AX.
plot returns a column vector of handles to lineseries objects, one
handle per plotted line.
The X,Y pairs, or X,Y,S triples, can be followed by
parameter/value pairs to specify additional properties
of the lines. For example, plot(X,Y,'LineWidth',2,'Color',[.6 0 0])
will create a plot with a dark red line width of 2 points.
Example
x = -pi:pi/10:pi;
y = tan(sin(x)) - sin(tan(x));
plot(x,y,'--rs','LineWidth',2,...
'Markerfdgecolor','k',...
'Markerfacecolor','g',...
'MarkerSize',10)
示例:
x = 0:pi/1000:2*pi; % x取值范围由0到2π,pi/1000是递增的步长
y =sin( 2*x + pi/4); %表示y的函数表达式是sin类型
plot(x,y)
三维网格函数mesh
三维曲面色块函数surf
示例:
x=linspace(-2, 2, 25); %在-2到2取25个点
y=linspace(-2, 2, 25); %在-2到2取25个点
[xx, yy]=meshgrid(x, y); %生成网格采样点
zz=sqrt( xx.^2 + yy.^2); %生成矩阵Z
surf( xx,yy,zz); %画出着色的三维曲面
mesh函数
surf函数
三维隐函数:
[X,Y,Z]=meshgrid(linspace(-10,10)); %形成网格数据(X,Y,Z)
V=X.^2+Y.^2-Z.^2; %形成体数据V
isosurface(X,Y,Z,V,1); %绘制三维隐函数图形X.^2+Y.^2-Z.^2=1
axis equal
colormap([1 0 0]); %改变图形颜色为红色
brighten(0.5); %进行增亮
camlight right; %设置光源位置
lighting phong; %设置光照模式
figure(2);
fv=isosurface(X,Y,Z,V,1); %计算等值面所对应的面元和顶点
p=patch(fv); %绘制等值面
set(p,'FaceColor','red','EdgeColor','none'); %修饰等值面
axis equal %等比例显示
立体侧视图和俯视图
矢量场可视化:
采样点生成函数meshgrid
箭头表示矢量函数quiver
流线函数streamline
示例:
x=-3:1:3;
y=-2:1:2;
[X,Y]=meshgrid(x,y)
采样点矩阵
x = [0 0 0 0];
y = x;
u = [1 -1 0 0];
v = [0 0 1 -1];
quiver(x, y, u, v);
u = [1 1 1; 1 1 1];
v = u;
quiver(u, v);
流线函数streamline
三维矢量场图:
[x,y]=meshgrid(-3:.5:3,-3:.5:3); %生成所需的网格采样点,x与y在-3到3区间
z=y.^2-x.^2; %定义函数
[u,v,w]= surfnorm(z); %取三维曲面的法线
quiver3(z,u,v,w) ; %绘制三维矢量场图
三维矢量场函数quiver3
梯度:
symsxyz%定义符号变量f=2*y*z*sin(x)+3*x*sin(z)*cos(y);%定义函数gradient(f,[x,y,z])%利用符号计算函数的梯度
梯度场示意图
syms x y %定义符号变量
F = -(sin(x) + sin(y))^2; %定义函数
g = gradient(F, [x, y]) %计算梯度的表达式
[X, Y] = meshgrid(-1:.1:1,-1:.1:1); %产生网格
G1 = subs(g(1), [x y], {X,Y}); %用{X,Y}替换所有出现的[x,y],然后计算g(1)
G2 = subs(g(2), [x y], {X,Y}); %用{X,Y}替换所有出现的[x,y],然后计算g(2)
quiver(X, Y, G1, G2); %绘制梯度对应的箭头图
等高线:
v = -2:0.2:2; %定义向量v
[x,y]=meshgrid(v); %利用v产生网格
z = x.* exp(-x.^2 - y.^2); %计算网格格点上的函数值
[px,py] = gradient(z,.2,.2); %数值方法计算梯度
figure
contour(x,y,z); %绘制函数z的等高线
hold on; %保持模式打开
quiver(x,y,px,py); %绘制梯度的箭头图
hold off; %保持模式关闭
散度:
syms x y z real %定义符号变量
F = [ cos(x+2*y), sin(x-2*y) ]; %定义函数F
g = divergence(F,[x y]) %求函数F的散度,符号形式
divF=matlabFunction(g); %将散度转换为函数形式
x=linspace(-2.5,2.5,20);
[X,Y]=meshgrid(x,x); %定义网格
Fx=cos(X+2*Y); %F的x分量
Fy=sin(X-2*Y); %F的y分量
div_num=divF(X,Y); %散度的数值形式
pcolor(X,Y,div_num); %绘制散度
shading interp; %差值
colorbar; %绘制色条
hold on; %保持绘图模式打开
quiver(X,Y,Fx,Fy,'k','linewidth',1); %绘制箭头图
红色部分为“源”,矢量流线发散;蓝色部分为“汇(漏)”,矢量流线汇聚
旋度可视化:
计算旋度:
syms x y z
V = [x^3*y^2*z, y^3*z^2*x, z^3*x^2*y];
X = [x y z];
curl(V,X)
证明:一个标量函数的梯度(函数)的旋度恒为零。
syms x y z
f = x^2 + y^2 + z^2;
vars = [x y z];
curl(gradient(f,vars),vars)
计算结果
图形:
%%计算一个余弦函数的一维拉普拉斯矩阵
syms x y z real %定义符号变量
F = [ cos(x+2*y), sin(x-2*y) ]; %定义函数F
G = curl([F,0],[x y z]) %计算F的旋度,并赋予G
curlF=matlabFunction(G(3)); %将G的z分量,赋予curlF
x=linspace(-2.5,2.5,20);
[X,Y]=meshgrid(x,x); %定义网格
Fx=cos(X+2*Y); %计算F的x分量
Fy=sin(X-2*Y); %计算F的y分量
rot=curlF(X,Y); %计算旋度的值
pcolor(X,Y,rot); %绘制旋度
shading interp; %颜色做插值
colorbar; %绘制色条
hold on; %保持模式打开
quiver(X,Y,Fx,Fy,'k','linewidth',1); %绘制箭头图,并设置颜色为黑色,线宽为1
%%
syms x y z
V = [x^2*y, y^2*z, z^2*x];
vars = [x y z];
gradient(divergence(V,vars)) - curl(curl(V,vars),vars)
只显示Z方向上的旋度的结果:顺时针散度小于零,逆时针散度大于零
拉普拉斯运算的可视化:
矢量函数的拉普拉斯运算:
syms x y z
V = [x^2*y, y^2*z, z^2*x];
vars = [x y z];
gradient(divergence(V,vars)) - curl(curl(V,vars),vars)
del2函数:有限差分法对拉普拉斯算子的拟合:
一维拉普拉斯矩阵:
x = linspace(-2*pi,2*pi); %定义x向量
U = cos(x); %计算cos(x)
L = 4*del2(U,x); %计算U的拉普拉斯,注意系数4
plot(x,U,x,L) %画出U和U的拉普拉斯曲线
legend('U(x)','L(x)','Location','Best') %给出图例
本质上就是求二阶导
多元函数:
[x,y] = meshgrid(-5:0.25:5,-5:0.25:5); %定义函数在x,y方向的区域
U = 1/3.*(x.^4+y.^4); %定义函数U
h = 0.25; %U中各点的间距在所有方向上都相等,所以可以指定一个间距h
L = 4*del2(U,h); %计算U的拉普拉斯变换
surf(x,y,L);
grid on;
title('Plot of $\Delta U(x,y) = 4x^2+4y^2$','Interpreter','latex')
xlabel('x');
ylabel('y');
zlabel('z');
view(35,14);