基于Matlab和高斯-赛德尔迭代应用有限差分法求电势及电场分布
电磁场的边界条件
根据电磁场理论,若想知道某一区域内的电场及电势分布,我们只需要知道其边界条件处的电势情况就可以了。这样的边界条件可以使直接给出边界处的电势值,也可以给出电势在某一方向的方向导数的值或是其他的面积分的形式。但是这其中比较关键的一点就是需要求得某一封闭区域内的电场,那么这封闭区域边界的所有电势情况必须全部了解,而不能有疏漏。
我们考虑二维的情况,对于静电场的边值条件:
拉普拉斯方程
▽
2
φ
=
∂
2
φ
∂
x
2
+
∂
2
φ
∂
y
2
=
−
ρ
ε
\bigtriangledown^{2}\varphi = \frac{\partial^{2}\varphi}{\partial x^{2} } + \frac{\partial^{2}\varphi}{\partial y^{2} } = -\frac{\rho }{\varepsilon }
▽2φ=∂x2∂2φ+∂y2∂2φ=−ερ
φ
∣
S
=
f
1
(
s
)
\varphi |_{S} =f_{1} (s)
φ∣S=f1(s)
∂
φ
∂
n
⃗
∣
S
=
f
2
(
s
)
\frac{\partial \varphi }{\partial \vec{n} } |_{S}=f_{2} (s)
∂n∂φ∣S=f2(s)
或者是线性组合
(
α
φ
+
β
∂
φ
∂
n
⃗
)
∣
S
=
f
3
(
s
)
(\alpha \varphi +\beta \frac{\partial \varphi }{\partial \vec{n} } )|_{S} =f_{3} (s)
(αφ+β∂n∂φ)∣S=f3(s)
如果上述条件在边界处给完全确定,那么边界内部的任何一点电势也就完全确定了。但是这并不排除某些不可解的情况,例如边界区域电势为常数。这种情况下,通过该算法所确定的解有无穷多个,因为这样边界条件下,内部电势既可以为常数,或是包含某些奇点的情况,例如中心有一个点电荷。
以上情况我们假定的是该边界内部介质条件不变。如果条件不是单一的,例如中心存在点电荷或电介质变化。我们需要对该区域分割成多个区域来分别求解内部电势分布。
高斯-赛德尔迭代算法
我们考虑二维的情况。由于电势为标量,为了保证场内区域电势的连续性,对于高斯-赛德尔迭代算法的理解可以近似成该点的电势值,可以由周围几个点电势的平均值来代替。
φ
i
,
j
(
k
+
1
)
=
1
4
(
φ
i
−
1
,
j
(
k
)
+
φ
i
+
1
,
j
(
k
)
+
φ
i
,
j
−
1
(
k
)
+
φ
i
,
j
+
1
(
k
)
)
\varphi _{i,j}^{(k+1)} =\frac{1}{4} (\varphi _{i-1,j}^{(k)} +\varphi _{i+1,j}^{(k)}+\varphi _{i,j-1}^{(k)}+\varphi _{i,j+1}^{(k)})
φi,j(k+1)=41(φi−1,j(k)+φi+1,j(k)+φi,j−1(k)+φi,j+1(k))
k
k
k表示迭代次数。
将场域内进行方格坐标化之后,对场域内每个点进行迭代。同时保持边界处的值不变,最后场内任意点在某次迭代之后数值会趋于收敛。即满足
∣
φ
i
,
j
(
k
+
1
)
−
φ
i
,
j
(
k
)
∣
<
ε
|\varphi _{i,j}^{(k+1)} -\varphi _{i,j}^{(k)} |<\varepsilon
∣φi,j(k+1)−φi,j(k)∣<ε
对任意
i
,
j
i,j
i,j及
ε
>
0
\varepsilon>0
ε>0总存在
k
k
k使得该式成立,这里
k
k
k就是迭代次数。
算法举例
内部存在一个矩形区域等势体
本项目为一矩形区域,中心矩形区域导体电势为 U 0 U_{0} U0,这里我们设为 100 100 100.导体上为等势体,外围矩形区域电势为 0 0 0。通过高斯-赛德尔迭代法求得中间电势分布,下面可以直接改参数值。由于需要方便矩阵运算,坐标值需要整数。因此若要形成某一区域的电位需要先进行线性变换在求解,最后还可以进行线性插值。
在求得电势后,可以对其求梯度便形成了电场线
E
⃗
=
−
▽
φ
\vec{E} =-\bigtriangledown \varphi
E=−▽φ
下面的代码可以生成电势图和电场线:
%%
clc;clear;
U0=100; %设置中心区域电位
err=0.001; %设置误差
boolsta=0; %设置判断变量,判断是否停止迭代
[X1,X2,Y1,Y2]=deal(1,30,1,30); %设置外边界区域,似乎只能设置正方形
[x1,x2,y1,y2]=deal(10,20,20,25); %设置内边界区域
itera=0; %迭代次数
A=zeros(X2-X1+1,Y2-Y1+1); %初始化矩阵
A(x1:x2,y1:y2)=U0*ones(x2-x1+1,y2-y1+1); %设置中心区域电位
A1=A; %每次迭代更新后的矩阵
while ~boolsta
for i=X1+1:X2-1
for j=Y1+1:Y2-1
%高斯-塞德尔迭代
if i>=x1 & i<=x2 & j>=y1 & j<=y2
A1(i,j) = U0;
else
A1(i,j) = ( A(i+1,j) + A(i-1,j) + A(i,j+1) + A(i,j-1))/4;
end
%判断是否所有点都在误差范围内
if abs(A1(i,j)-A(i,j))<err
boolsta = boolsta+1;
end
end
end
boolsta = floor( boolsta/(X2-X1-1)/(Y2-Y1-1));
A=A1;
itera = itera +1;
end
itera %显示迭代次数
subplot(1,2,1);
[y,x]=meshgrid(X1:X2 , Y1:Y2);
surf(x,y,A);
xlabel('x');
ylabel('y');
zlabel('电势U');
title('迭代后的电势图');
subplot(1,2,2);
plot([x1,x2,x2,x1,x1],[y1,y1,y2,y2,y1],'k',...
[X1,X2,X2,X1,X1],[Y1,Y1,Y2,Y2,Y1],'k');
xlabel('x');
ylabel('y');
hold on;
h=contour(x,y,A,20);
clabel(h);
text((x1+x2)/2,(y1+y2)/2,'内边界');
text(0.9*X2-0.1*X1,(Y1+Y2)/2,'外边界');
title('等位线图&电场线图');
[dy,dx]=gradient(A);
hold on;
quiver(x,y,-dx,-dy);
输出结果为:
迭代次数
i
t
e
r
a
=
661
itera =661
itera=661次。
内部存在两个(多个)矩形区域等势体
对上面的代码稍微改动,修改初始条件如下:
[U01,U02]=deal(-50,100); %设置中心区域1,2电位
err=0.001; %设置误差
boolsta=0; %设置判断变量,判断是否停止迭代
[X1,X2,Y1,Y2]=deal(1,50,1,50); %设置外边界区域,似乎只能设置正方形
[x11,x12,y11,y12]=deal(10,20,20,25); %设置内边界区域1
[x21,x22,y21,y22]=deal(25,30,30,35); %设置内边界区域2
itera=0; %迭代次数
A=zeros(X2-X1+1,Y2-Y1+1); %初始化矩阵
A(x11:x12,y11:y12)=U01*ones(x12-x11+1,y12-y11+1); %设置中心区1域电位
A1=A; %每次迭代更新后的矩阵
再对程序进行
输出结果为:
迭代次数
i
t
e
r
a
=
1004
itera =1004
itera=1004次。
由此我们可以在该区域内设置很多电势分布区域来进行求解。
内部存在不规则区域等势体
我们可以对内部不规则物体进行模拟,修改判断内部边界条件为:
( i-(X1+X2)/2 )^4 + ( j-(Y1+Y2)/2 )^2 + ( i-(X1+X2)/2 )*( j-(Y1+Y2)/2 ) - ( i-(X1+X2)/2 )^2*( j-(Y1+Y2)/2 ) <= 20
该条件表示的是
x
4
+
y
2
+
x
y
−
x
2
y
<
20
x^{4} +y^{2} +xy-x^{2}y<20
x4+y2+xy−x2y<20形状的区域
迭代次数 i t e r a = 482 itera =482 itera=482次。
由于网格线选的比较粗糙,因此内部边界设置的不是那么精确,读者可以自行设置精度来达到预想的的效果。
其他形式的处理办法
在应用电场边界条件的时候,该算法只适用于知道边界处电势分布的情况而无法求解边界条件为电势方向导数的情况。但是我们可以利用对称性来求解。
例如
在一个矩形区域内,上下左三条边均接地,右侧边中点为
100
V
100V
100V。这种情况下。我们可以利用对称性。以该举行右侧边为对称轴进行镜像翻转,那么就可以化成我们之前所提到的矩形区域的例子了。
输出结果示例:
边界函数不为0举例
如下图所示的边界条件:
可以如下修改边界条件:
A=zeros(X2-X1+1,Y2-Y1+1); %初始化矩阵
f1=@(x)U0*sin(pi*(x-X1)/(X2-X1)); %设置外边界上边缘函数
for k=X1:X2
A(k,Y2)=f1(k);
end
得到如下结果:
事实上,我们可以求出解析解:
边界条件:
{
∂
2
φ
∂
x
2
+
∂
2
φ
∂
y
2
=
0
φ
(
0
,
y
)
=
φ
(
a
,
y
)
=
φ
(
x
,
0
)
=
0
φ
(
x
,
h
)
=
U
0
s
i
n
(
π
x
a
)
\begin{cases}\frac{\partial^{2}\varphi}{\partial x^{2} } + \frac{\partial^{2}\varphi}{\partial y^{2} } = 0 \\\varphi (0,y)=\varphi (a,y)=\varphi (x,0)=0 \\\varphi (x,h)=U_{0} sin(\frac{\pi x}{a} ) \end{cases}
⎩⎪⎨⎪⎧∂x2∂2φ+∂y2∂2φ=0φ(0,y)=φ(a,y)=φ(x,0)=0φ(x,h)=U0sin(aπx)
解得:
φ
(
x
,
y
)
=
U
0
s
i
n
h
(
π
h
a
)
s
i
n
(
π
x
a
)
s
i
n
h
(
π
y
a
)
\varphi (x,y)=\frac{U_{0} }{sinh(\frac{\pi h}{a}) } sin(\frac{\pi x}{a} )sinh(\frac{\pi y}{a} )
φ(x,y)=sinh(aπh)U0sin(aπx)sinh(aπy)
该函数曲面如下
(以
z
=
s
i
n
(
π
x
)
s
i
n
h
(
π
y
)
z=sin(\pi x)sinh(\pi y)
z=sin(πx)sinh(πy)为例)
与迭代算法拟合一致。