成像代码迭代部分
Posted 曙光晨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了成像代码迭代部分相关的知识,希望对你有一定的参考价值。
成像代码迭代部分
声明
由于实验的老师特有的查重方式以及计算成绩的方法,所以请不要直接照抄本文的代码。
这里的代码可能会有一些BUG,请大家注意
注:我这里的使用的是C++,VS2019 ,Graph2019,可能之后的版本会不同这里说明一下,说不定等我啥时间闲了,我写个C#版本的。(笑)
这里我默认您是已经做完了之前的数据读入和初始化的部分。
神奇的SOR
注:这里我建议您打开老师的讲义来看本文,这里的公式我是按照当年我这届的讲义来写的,可能会有一些出入吧(希望不会有)
SOR最总要的是一开始的差分公式(1-18)
φ
0
=
(
c
1
φ
1
+
c
2
φ
2
+
c
3
φ
3
+
c
4
φ
4
)
c
0
\\varphi _0 =\\frac(c_1 \\varphi_1+c_2 \\varphi _2+c_3 \\varphi_3+c_4 \\varphi_4)c_0
φ0=c0(c1φ1+c2φ2+c3φ3+c4φ4)
主要目的是计算出 c 0 c_0 c0 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3 c 4 c_4 c4 c 0 c_0 c0
这里公式跳转到 (1-7)(害,才发现(1-6)和(1-18)是一样的)
这里给出了
c
1
,
c
2
,
c
3
,
c
4
,
c
0
c_1,c_2,c_3,c_4,c_0
c1,c2,c3,c4,c0的计算方式
注意:不同位置的 c 3 , c 4 , c 0 c_3,c_4,c_0 c3,c4,c0的计算方式不同,同时还有注意电极的位置。
由于这里使用的是十字5点法,请注意边界部分需要修正(或者直接就不写最边界的位置让十字的最上端直接对齐边界点,笑)
计算出对应的系数后,带入(1-25)(就是有迭代因子修正的那个公式)式中计算出下一个电位值 φ k + 1 \\varphi_k+1 φk+1。
(这里我可能说的比较简单,但是大致的逻辑应该是这些,这里我建议将SOR做成一个函数 SOR()后面的迭代会多次调用的)。
迭代过程
根据讲义我们可以知道:
第一轮中
ω
0
=
1
\\omega_0=1
ω0=1然后SOR()
loop
第二轮中
ω
1
=
1.375
\\omega_1 = 1.375
ω1=1.375之后SOR()得到
φ
k
+
1
\\varphi_k+1
φk+1迭代12次
将后面三次的
φ
\\varphi
φ提出,计算残差
Δ
φ
=
φ
k
+
1
−
φ
k
\\Delta\\varphi = \\varphi_k+1-\\varphi_k
Δφ=φk+1−φk
以及平均残差
Δ
φ
ˉ
\\bar\\Delta\\varphi
Δφˉ
获得两个
Δ
φ
ˉ
1
\\bar\\Delta\\varphi_1
Δφˉ1,
Δ
φ
ˉ
2
\\bar\\Delta\\varphi_2
Δφˉ2.
带入(1-27)计算出
λ
\\lambda
λ,在带入(1-29),(1-28),(1-30)计算出最后的
ω
m
\\omega_m
ωm
用这个
ω
m
\\omega_m
ωm替代前面的
ω
1
=
1.375
\\omega_1 = 1.375
ω1=1.375
当(1-31)式成立时,跳出该循环。
这里固定 ω m \\omega_m ωm
loop
SOR()
计算残差
Δ
φ
=
φ
k
+
1
−
φ
k
\\Delta\\varphi = \\varphi_k+1-\\varphi_k
Δφ=φk+1−φk
当像管中的每个位置从残差都要小于数据中给定的精度要求时,跳出循环
等位线计算
到这里基本上迭代就完了,离最后出图没多少距离了,大家加油
(不过要是中间崩了又没出图,基本就白干了,这个给分我个人感觉不是很合理)
首先根据提供的数据计算出需要扫描的等位线数目
主要目的计算像管中每个电位等位点的个数
在整个像管中寻找:
loop
if $\\varphi [i,j]<等位线间隔<\\varphi[i,j+1] or \\varphi[i,j]>等位线间隔>\\varphi[i,j+1]$
使用(1-37)式对Z轴进行插值,R轴基本不变吧
R轴上的等电位坐标记录
等位线个数+1
if $\\varphi [i,j]<等位线间隔<\\varphi[i+1,j or \\varphi[i,j]>等位线间隔>\\varphi[i+1,j]$
使用(1-38)式对R轴进行插值,Z轴基本不变吧
R轴上的等电位坐标记录
等位线个数+1
注意:在最下方的一行(Z轴上,插值会出现一些问题)
绘图
这里使用的是Graph2019,这里放个链接,是我认为对我安装这个东西很好的一个参考。
https://blog.csdn.net/edc370/article/details/79944550
首先设定窗口的大小
initgraph(width,height);
设定背景为黑
setbkcolor(BLACK);
绘制像管的边界
rectangle(left,top,right,bottom)
绘制像管中的电极
bar(left,top right,bittom)
绘制等位线
loop
line(x1,y1,x2,y2)(根据上面的等电位点绘制)
在给定的电位上。
到这里基本上整个程序就结束了
后面还有一些打印的东西,就是对文件的读写操作,这个可以看看我前面写的成像代码读入部分https://blog.csdn.net/hopefullying/article/details/117866172
那么这里就结束, 感谢大家的支持。
以上是关于成像代码迭代部分的主要内容,如果未能解决你的问题,请参考以下文章