投稿者:島村1243
投稿日:2016年 3月15日(火)20時22分52秒
|
|
|
一直線状に電荷が均等分布する導体が、空間中に複数本、平行に置かれた場合の静電場の電気力線方程式(厳密解)は
(1) x軸-y軸平面状の任意点(x,y)
(2) Q(i):第i番目導体上の電荷密度
(3)(Xq(i),Yq(i))は第i番目導体の位置座標
(4)θ(i)=ANGLE(x-Xq(i),y-Yq(i))
とすると
(5)∑{Q(i)*θ(i)}=Const
で表されます。
そこで、すべての(x,y)点の値Aq(x,y)を
Aq((x,y)=∑{Q(i)*θ(i)}
i=1~導体総数
で求めておき、このAq((x,y)が等しい値C(パラメータ)を持つx-y座標点を連ねると、電気力線を描く事ができます。
点を連ねる判断は
IF Aq(x,y)<>Aq(x,y+1) OR Aq(x,y)>Aq(x+1,y) OR Aq(x,y)<>Aq(x+1,y+1) THEN
PLOT POINTS:x,y
で行っています。
このIF文の考え方は
Aq(x,y)=Aq(x,y+1) =Aq(x+1,y)=Aq(x+1,y+1)
であるなら、点を連ねる線は一回りしてしまうので不合理、つまり、一回りしないことを
Not{Aq(x,y)=Aq(x,y+1) =Aq(x+1,y)=Aq(x+1,y+1)}=TRUE
でチェックしたのが上記のIF文で、OKなら描画面の(x,y)点を打点する、というものです。
この考え方を元に、3本の直線導体が有る場合の電気力線作図プログラムが後期するコードですが、RUNすると、最上・下の導体に、「明らかに余分と分かる水平線が2本描かれ」てしまい、その原因がどうにも掴めません。
誤りの原因がお分かりになりましたらご教示頂けると有り難いです。
*****トラぶっているプログラム***********
!****指定値(整数)セット(その1/2)***
LET w=500 !描画画面の横幅
LET h=500 !描画画面の高さ
LET Nq=3 !扱う総電線数
LET Esen=20 !電気力線の描画数[本/C]
LET Vstep=6 !等電位線の描画本数係数
!**************************
DIM Aq(w,h),Vq(w,h)
DIM Q(6),Xq(6),Yq(6)
!****指定値セット(その2/2)****
LET Q(1)=1 !第1番目電線に分布する電荷密度[C/m]
LET Xq(1)=250 !第1番目電線のx座標(1以上でw以下)
LET Yq(1)=350 !第1番目電線のy座標(1以上でh以下)
LET Q(2)=-2
LET Xq(2)=250
LET Yq(2)=250
LET Q(3)=1
LET Xq(3)=250
LET Yq(3)=150
!***************************
!**** Main ProgramStart ******
SET WINDOW 0,w,0,h
Draw Grid (50,50)
SET POINT STYLE 1
LET hankei=10
LET Nriki=Esen/2
LET hankei2=hankei*hankei
CALL Marks
PRINT "作図データの計算中です。"
CALL PointData
PRINT "電気力線を作図します。"
Call Rikisen
PRINT "作図完了です。"
!****各関数の内容**********
Sub Marks !全電荷の位置をマークする
FOR id=1 TO Nq
LET x1=Xq(id)
LET y1=Yq(id)
LET q1=Q(id)
IF Q(id)>0 THEN
SET AREA COLOR "red"
ELSEIF Q(id)<0 THEN
SET AREA COLOR "blue"
ELSE
Exit sub
END IF
DRAW disk WITH SCALE(hankei)*SHIFT(Xq(id),Yq(id))
NEXT id
End Sub
Sub PointData !作図データの作成
FOR x=1 TO w
FOR y=1 TO h
LET Aq(x,y)=INT(Nriki*Qangle(x,y)/PI)
!PRINT "x=";x;"y=";y;"Aq(x,y)=";Aq(x,y)!<===Test
Next Y
Next X
End Sub
FUNCTION Volt(x,y) !<---(x,y)点の合成電位計算
LET Vd=0.0
FOR iv=1 TO Nq !Nqは総電線数
LET x1=Xq(iv) !Q(i)のX座標
LET y1=Yq(iv) !Q(i)のY座標
LET dx=x-x1
LET dy=y-y1
IF dx<>0 OR dy<>0 THEN
LET Vd =Vd-Q(iv)*LOG(dx*dx+dy*dy)
END IF
NEXT iv
LET Volt=Vd
End Function
FUNCTION Qangle(x,y) !(x,y)点の∑(Qi×θi)計算
LET Sigma=0.0
FOR iq=1 TO Nq
LET dx=x-Xq(iq)
LET dy=y-Yq(iq)
IF ichiCheck(x,y)=0 THEN !<--ANGLE(0,0)エラー対策
IF dx<0 AND dy=0 THEN
LET angle1=-PI
ELSE
LET angle1=ANGLE(dx,dy)
END IF
LET Sigma=Sigma+Q(iq)*angle1
END IF
NEXT iq
LET Qangle=Sigma
End Function
FUNCTION ichiCheck(x,y) !点(x,y)がどれかの電線内に入ったかの判定
FOR ii=1 TO Nq
LET xi=Xq(ii)
LET yi=Yq(ii)
IF (xi-x)*(xi-x)+(yi-y)*(yi-y) <= hankei2 THEN
LET ichiCheck=1 !位置(x,y)が電線内と認識
Exit Function
END IF
NEXT ii
LET ichiCheck=0 !位置(x,y)が電線外と認識
End Function
Sub Rikisen !電気力線を描く
FOR x=1 TO w-1
FOR y=1 TO h-1
IF ichiCheck(x,y)=0 THEN
IF Aq(x,y)<>Aq(x,y+1) OR Aq(x,y)>Aq(x+1,y) OR Aq(x,y)<>Aq(x+1,y+1) THEN
PLOT POINTS:x,y
END IF
End IF
NEXT Y
NEXT X
END SUB
END
|
|
|
投稿者:山中和義
投稿日:2016年 3月16日(水)12時55分59秒
|
|
|
島村1243さんへのお返事です。
> 誤りの原因がお分かりになりましたらご教示頂けると有り難いです。
表示部分で不必要なデータを削除しました。
根本的なところは、「なぜ、このような構造のデータになるか」ですが、今のところ不明です。
Sub Rikisen !電気力線を描く
FOR x=1 TO w-1
FOR y=1 TO h-1
IF ichiCheck(x,y)=0 THEN
IF Aq(x,y)<>Aq(x,y+1) OR Aq(x,y)<>Aq(x+1,y) OR Aq(x,y)<>Aq(x+1,y+1) THEN
IF NOT( Aq(x,y)=Aq(x+1,y) AND Aq(x,y+1)=Aq(x+1,y+1) AND MOD(ABS(Aq(x,y)-Aq(x,y+1)),Esen)=0 ) THEN
PLOT POINTS:x,y
!!PRINT x;y,Aq(x,y);Aq(x,y+1);Aq(x+1,y);Aq(x+1,y+1)
END IF
END IF
End IF
NEXT Y
NEXT X
END SUB
|
|
|
投稿者:島村1243
投稿日:2016年 3月16日(水)18時25分35秒
|
|
|
山中和義 様へ
> 表示部分で不必要なデータを削除しました。
> 根本的なところは、「なぜ、このような構造のデータになるか」ですが、今のところ不明です。
修正コードのご教示有難う御座いました。
こんなに速く解決策をご教示頂けるとは、と驚いています。
早速修正コードを適用し、計算条件を色々変えて試用しましたが、完璧です!!!
厳密解の線図を知りたいと思っていたので感激しています。
重ねて御礼申し上げます。
根本的な理由については、無い頭ですが推測してみます。
|
|
|
投稿者:山中和義
投稿日:2016年 3月17日(木)21時07分6秒
|
|
|
島村1243さんへのお返事です。
> 根本的な理由については、無い頭ですが推測してみます。
angle関数が(-π,π]の範囲なので、Σの値が負になる可能性があります。
これにより、-πからπに移るとき、Esen分(その倍数)の段差が発生するので、ここに線が描かれます。
これが余計な水平な線になります。
したがって、負と0の場合、げたを履かせて補正するといいでしょう。
Sub PointData !作図データの作成
FOR x=1 TO w
FOR y=1 TO h
LET Aq(x,y)=INT(Nriki*Qangle(x,y)/PI)
!PRINT "x=";x;"y=";y;"Aq(x,y)=";Aq(x,y)!<===Test
DO WHILE Aq(x,y)<Esen
LET Aq(x,y)=Aq(x,y)+Esen
LOOP
NEXT Y
NEXT X
End Sub
FUNCTION Qangle(x,y) !(x,y)点の∑(Qi×θi)計算
LET Sigma=0.0
FOR iq=1 TO Nq
IF ichiCheck(x,y)=0 THEN !<--ANGLE(0,0)エラー対策
LET Sigma=Sigma+Q(iq)*ANGLE(x-Xq(iq),y-Yq(iq))
END IF
NEXT iq
LET Qangle=Sigma
End Function
こちらは元に戻します。
Sub Rikisen !電気力線を描く
FOR x=1 TO w-1
FOR y=1 TO h-1
IF ichiCheck(x,y)=0 THEN
IF Aq(x,y)<>Aq(x,y+1) OR Aq(x,y)<>Aq(x+1,y) OR Aq(x,y)<>Aq(x+1,y+1) THEN
PLOT POINTS: x,y
!!!PRINT x;y,Aq(x,y);Aq(x,y+1);Aq(x+1,y);Aq(x+1,y+1) !debug
END IF
END IF
NEXT y
NEXT x
End Sub
|
|
|
投稿者:島村1243
投稿日:2016年 3月18日(金)15時50分42秒
|
|
|
> No.4003[元記事へ]
山中和義様へのお返事です。
> angle関数が(-π,π]の範囲なので、Σの値が負になる可能性があります。
> これにより、-πからπに移るとき、Esen分(その倍数)の段差が発生するので、ここに線が描かれます。
> これが余計な水平な線になります。
> したがって、負と0の場合、げたを履かせて補正するといいでしょう。
数学の知識・プログラミングの知識が浅い私には、上記が原因とは全く思いも浮かびませんでした。
度重なる丁寧なご教示、有難う御座いました。
|
|
|
戻る