テーマ:私のPC生活(7395)
カテゴリ:その他いろいろ
コイル軸上に無い(オフアクシスの)任意の点の磁場は?
ヘルムホルツコイルを作って磁場を発生させたとき、径方向にどれぐらいの成分が出るのか、つまりどれぐらいの領域なら平行磁場と言っていいのか、を簡単に知りたい。 解析解はない、ということで、ビオサバールの式を数値的に積分して磁場計算するコードを作りました。 昨日書いた汎用ビオサバール計算コードをもとに、コイル磁場計算(円環電流)に特化したものにしました。 コイル中心がZ軸上に置かれていていると限定したジオメトリで、任意の位置の磁場を計算できます。 微小電流要素の座標変化を一体化し、一行で呼べるようにしました。 'コイル特化型ビオサバールBScoilCalc コイルは中心がZ軸上に置かれていていると限定 Private sub BScoilCalcTest() '引数は、求めたい点Pの座標(Px, Py, Pz)[m]、コイルの半径coilR[m]、コイル中心のZ座標coilZ[m]、電流coilI[A] 戻り値は磁場[テスラ] Dim resultBScoil() As Double = BScoilCalc(Px, Py, Pz, CoilR, CoilZ, CoilI) '計算された磁場の各成分が配列に順番に入っている Bx=resultBScoil(0) By=resultBScoil(1) Bz=resultBScoil(2) End Sub 呼ばれる方で、コイル円環をトレースするよう座標を振るようにします。 'z軸上コイル特化型ビオ・サバールBScoilCalc '半径R、位置Z、電流Iのコイル付近の作る磁場を、任意の位置Px,Py,Pzで計算する Private sub BScoilCalcTest() 'コイル線材のある部分の磁場を求めると、rベクトルがゼロになってしまいエラーになるので、ゼロを返す If Px ^ 2 + Py ^ 2 = coilR And Pz = coilZ Then Return New Double() {0, 0, 0} '微小要素の座標と電流の向きベクトル Z軸に垂直なのでz成分は無し、 Dim Cx, Cy, Ix, Iy As Double 'コイルの円周上の回転角 xy成分を180分割した円周に分解 Dim theta As Double '回転角ラジアン Dim ThetaDivide As Integer = 180 'コイル円周を180分割 Dim ThetaStep As Double = 2 * PI / ThetaDivide 'ビオサバールの定数部分 Dim AAA As Double '計算された磁場 Dim Bx As Double = 0 Dim By As Double = 0 Dim Bz As Double = 0 '180分割した微小要素の和を求める 精度を上げるなら分割数を増やす For theta = 0 To 2 * PI - ThetaStep Step ThetaStep 'コイル上の微小要素の座標と電流の向きベクトル 求めたい位置のxyz座標(微小要素のxyz座標) コイル要素のz座標は常にcoilZ 電流の向きベクトルは接線方向 左回りがプラス電流 Cx = coilR * Cos(theta) Cy = coilR * Sin(theta) Ix = -1 * coilI * Sin(theta) Iy = coilI * Cos(theta) 'ビオサバールの定数部分 1/4π/R^3 Rは微小要素から求めたい点の間に張るベクトル '本当は4πで割るが、どうせ磁場を求めるときに透磁率μ(=4πx1e7)を掛けるので、もう最初からかけたことにして4πは省略 AAA = 1 / ((Px - Cx) ^ 2 + (Py - Cy) ^ 2 + (Pz - coilZ) ^ 2) ^ 1.5 * 0.0000001 'ビオサバールの外積部分を足していく 電流の向きベクトルdHと、ベクトルRの外積 'コイルがz軸上にあって常にIz=0、Cz=0なのでもう省いてある Bx = Bx + AAA * (Iy * (Pz - coilZ)) By = By + AAA * (-Ix * (Pz - coilZ)) Bz = Bz + AAA * (Ix * (Py - Cy) - Iy * (Px - Cx)) Next theta '電流の定数部分 分割した数ThetaDivide倍化されているので割る 'コイル全体の微小要素の長さは2π×coilRの円周 寄与としてはそれだけ大きくなるので円周分かけないといけない 微小要素の寄与トータルが必要 Dim CurrConst As Double = (2 * PI * coilR) / ThetaDivide '配列にまとめて戻す Return New Double() {Bx * CurrConst, By * CurrConst, Bz * CurrConst} End Function 分割数は180にしてありますが、30分割以上はほとんど差がないです。求める精度にも寄りますが、多分時間の無駄です。 軸からずれているのコイルとか、回転しているコイルとかを計算したいんなら、コイル線材の位置と電流の向きベクトルを正しくcx,xy,cz,Ix,Iy,Izで指定すればいいですが、一旦軸上コイルで磁場を計算して、それをあとから座標変換するほうがきっと楽でしょう。 さて、休憩しますか 【ふるさと納税】彩とりどりのHome Party Cake Set! 計24個 明日に続く。 お気に入りの記事を「いいね!」で応援しよう
最終更新日
2021.10.17 23:00:01
コメント(0) | コメントを書く
[その他いろいろ] カテゴリの最新記事
|
|