实验一 梯度、散度、旋度的可视化
题目1:应用 MATLAB 编程计算标量函数 f ( x , y ) = x e − x 2 − y 2 f(x,y) = xe^{-x^2-y^2} f(x,y)=xe−x2−y2的二维梯度,并在相同图形窗中绘制等高线和梯度向量。
实验程序:
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; %保护模式关闭
程序结果:
题目2:应用 MATLAB 编程计算标量函数 f ( x , y ) = x 2 + y 2 f(x,y) = \sqrt{x^2+y^2} f(x,y)=x2+y2 的二维梯度,并在相同图形窗中绘制等高线和梯度向量。
实验程序:
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
h = contour(xx,yy,zz,12); %以12个等高线层级绘制矩阵z的等高线图
clabel(h); %写等高线的值
[dx,dy] = gradient(zz,.2,.2); %求梯度
hold on; %做下一幅图时保持原来图像
quiver(xx,yy,dx,dy); %画矢量图箭头
axis equal; %等比例显示
程序结果:
题目3:应用 MATLAB 编程计算矢量函数 f ( x , y ) = [ c o s ( x + 2 y ) , s i n ( x − 2 y ) ] f(x,y) = [cos(x+2y),sin(x-2y)] f(x,y)=[cos(x+2y),sin(x−2y)]的散度,并绘制其结果。
实验程序:
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+Y*2); %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); %绘制箭头图
程序结果:
题目4:应用 MATLAB 编程计算矢量函数 f ( x , y ) = [ c o s ( x + 2 y ) , s i n ( x − 2 y ) ] f(x,y) = [cos(x+2y),sin(x-2y)] f(x,y)=[cos(x+2y),sin(x−2y)]的旋度,并绘制其结果。
实验程序:
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
程序结果:
实验二 电力线、等势线的可视化
题目1:应用 MATLAB 编程绘制两个不等量同号电荷对应的电力线分布。
实验程序:
x = -4:0.02:4; %生成一系列坐标x,y
y = x;
[X,Y] = meshgrid(x,y); %生成网格数据
R1 = sqrt((X+1).^2+Y.^2); %场点距离左侧电荷的距离
R2 = sqrt((X-1).^2+Y.^2); %场点距离右侧电荷的距离
phi = 1./R1+2./R2; %计算电势(Q* = q2/q1 = 2)
[Ex,Ey] = gradient(-phi); %取梯度计算电场
hold on; %叠加绘图模式
r0 = 0.1; %电场线起点所在圆半径
th = 20:20:360-20; %以20度为间隔,均分圆周
th = th * pi / 180; %转换角度为弧度
x1 = r0 * cos(th) - 1; %左侧电荷起点横坐标
y1 = r0 * sin(th); %左侧电荷起点纵坐标
h = streamline(X,Y,Ex,Ey,x1,y2); %绘制左侧电荷对应的流线,即为电场
xr = -x1; %右侧电荷对应的起始点横坐标
yr = y1; %右侧电荷对应的起始点纵坐标
h = streamline(X,Y,Ex,Ey,xr,yr); %绘制右侧电荷对应的流线
axis image; %等比例绘制图像
程序结果:
题目2:应用 MATLAB 编程绘制两个不等量异号电荷对应的电力线分布。
实验程序:
x = -4:0.02:4; %生成一系列坐标x,y
y = x;
[X,Y] = meshgrid(x,y); %生成网格数据
R1 = sqrt((X+1).^2+Y.^2); %场点距离左侧电荷的距离
R2 = sqrt((X-1).^2+Y.^2); %场点距离左侧电荷的距离
phi = 1./R1-2./R2; %计算电势(Q* = q2/q1 = -2)
[Ex,Ey] = gradient(-phi); %取梯度计算电场
hold on; %叠加绘图模式
r0 = 0.1; %电场线起点所在圆的半径
th = 20:20:360-20; %以20°为间隔均分圆周
th = th * pi / 180; %转换角度为弧度
x1 = r0 * cos(th) - 1; %左侧电荷起点横坐标
y1 = r0 * sin(th); %左侧电荷起点纵坐标
h = streamline(X,Y,Ex,Ey,x1,y2); %绘制左侧电荷对应的流线,即为电场线
xr = -x1; %右侧电荷对应的起始点横坐标
yr = y1; %右侧电荷对应的起始点纵坐标
h = streamline(X,Y,-Ex,-Ey,xr,yr); %绘制右侧电荷对应的流线
axis image; %等比例绘制图像
程序结果:
题目3:应用 MATLAB 编程绘制三维等势面。例如对于放置在 ( − a , 0 , 0 ) , ( a , 0 , 0 ) (-a,0,0),(a,0,0) (−a,0,0),(a,0,0)处的两个点电荷,其带电量均为 2,绘制其对应的等势面。
实验程序:
①绘制单一等势面。
q1 = 2; %电荷1的电量
q2 = 2; %电荷2的电量
a = 2; %两个电荷之间的位置,(-a,0,0),(a,0,0)
x = linspace(-5,5,50); %x轴范围,从-5到5,划分成50个点
[X,Y,Z] = meshgrid(x); %在xyz坐标系内,构建一个立体网络
r1 = sqrt((X-a).^2+Y.^2+Z.^2); %计算到右边电荷(a,0,0)的距离
r2 = sqrt((X+a).^2+Y.^2+Z.^2); %计算到左边电荷(-a,0,0)的距离
U = q1./r1+q2./r2; %电势的分布
[f,v] = isosurface(X,Y,Z,U,1.6); %计算等势面对应的面元和顶点
p = patch('Faces',f,'Vertices',v); %绘制等势面
set(p,'FaceColor','red','EdgeColor','none'); %修饰等势面,这里面元为红色,无边沿色
view(3); %默认为三维视角
axis equal; %等比例显示
camlight; %设置光线
②多个等势面同时绘制。
q1 = 2; %电荷1的电量
q2 = 2; %电荷2的电量
a = 2; %两个电荷之间的位置,(-a,0,0),(a,0,0)
x = linspace(-5,5,50); %x轴范围,从-5到5,划分成50个点
[X,Y,Z] = meshgrid(x); %在xyz坐标系内,构建一个立体网络
r1 = sqrt((X-a).^2+Y.^2+Z.^2); %计算到右边电荷(a,0,0)的距离
r2 = sqrt((X+a).^2+Y.^2+Z.^2); %计算到左边电荷(-a,0,0)的距离
U = q1./r1+q2./r2; %电势的分布
[f,v] = isosurface(X,Y,Z,U,1.6); %计算等势面对应的面元和顶点
p = patch('Faces',f,'Vertices',v); %绘制等势面
set(p,'FaceColor','red','EdgeColor','none'); %修饰等势面,这里面元为红色,无边沿色
hold on; %叠加绘制模式
p = patch(isosurface(X,Y,Z,U,1.2)); %计算等值面并绘制,返回句柄p
set(p,'FaceColor','none','EdgeColor','green'); %对等值面进行修饰,无面元色,边沿为绿色
view(3); %默认为三维视角
axis equal; %等比例显示
camlight; %设置光线
程序结果:
①绘制单一等势面。
②多个等势面同时绘制。
实验三 静态场问题求解及可视化
题目1:考虑一个静电场问题,其对应的定解问题如下: { Δ u = 0 u ∣ x = 0 = 0 , u ∣ x = 1 = 0 u ∣ y = 0 = 0 , u ∣ y = 1 = s i n ( 2 π x ) \left\{\begin{matrix}\Delta u = 0 \\ u |_{x=0} = 0,u |_{x=1} = 0 \\ u |_{y=0} = 0,u |_{y=1} = sin(2\pi x)\end{matrix}\right. ⎩⎨⎧Δu=0u∣x=0=0,u∣x=1=0u∣y=0=0,u∣y=1=sin(2πx)题目给出了一个正方形边界四条边上的电磁分布值,然后计算正方形区域内部的电势分布。
(1)解析解:用分离变量法对该问题进行求解,得到严格的解析解为 u = 1 s i n h ( 2 π ) s i n ( 2 π x ) s i n h ( 2 π y ) u = {1\over sinh(2\pi)}sin(2\pi x)sinh(2\pi y) u=sinh(2π)1sin(2πx)sinh(2πy)请使用 surf 函数和 pcolor 函数绘制该函数的图像。
实验程序:
x=linspace(0,1,100); %x取从0到1区间的100个点
y=linspace(0,1,100); %y取从0到1区间的100个点
[X,Y]=meshgrid(x,y); %绘制网格,并将给单坐标赋予X,Y
u=1/(sinh(2*pi))*sin(2*pi*X).*sinh(2*pi*Y); %计算电势值
surf(X,Y,u); %绘制曲面图
shading interp; %曲面彩色做插值
figure; %创建新的图形窗口
pcolor(X,Y,u); %绘制伪彩色图
shading interp; %色彩做插值处理
colorbar; %绘制带色阶的颜色条
程序结果:
(2)数值解:采用 MATLAB 中的 PDETool 进行数值求解,并与解析法得到的结果做对比。具体步骤如下:
第一、在 MATLAB 命令行下,输入 PDETool,进入图形界面。
第二、在工具栏上单击矩形绘制按钮,绘制一个边长为 1 的正方形。
第三、单击边界条件设定按钮,进入边界条件设置状态;用鼠标双击正方形的边,根据题目设置边界条件。注意,对于第四个边界条件,应该输入对应的函数表达式。
第四、单击方程类型设置按钮,选择椭圆类型,并设置 f 为零,表示齐次方程。
第五、单击网格生成按钮,产生有限元网格。
第六、单击细化网格按钮二次,对产生的网格进行细化。
第七、单击求解按钮,则系统进行数值求解过程,并给出所得解的伪彩色示意图。
第八、单击绘图按钮,选择 Height,可以得到解的高度图,即曲面图。
最后:如果有帮助就来个点赞、收藏、评论鼓励一下吧!