はじめに
ランランリンリン 飛ばしてレンレン ロンロン戻してルーンルン1!半導体業界所属 まやかしの園児にゃあ【ここにあなたの名前を入れてください】です!もしよろしければ【ここにあなたの愛称を入れてください】ってよんでください!!
……というわけでね、はい、もう SystemVerilog とか UVM とか、そんなんばっかりやってると正気を失ってしまいますからね、はい、今日はガラッと気分を変えて、インダクタンスの計算でもしてみましょうか!!!!!!はい!!!!!(自然薯挿入2)
(A) 円環状導線の自己インダクタンスの理論式
円環状導線の自己インダクタンスは、次の式で求めることができます3。
$$L = R \left\{\mu_0\left(\log\frac{8R}{a}-2\right)+\frac{\mu}{2}\right\}$$
- 円環状導線の半径 $R\ (\gg a)$
- 導線の半径 $a$
- 導線の透磁率 $\mu$
この計算は、Pythonを使って下記のように書くことができ、
from numpy import log
from scipy.constants import mu_0
R = 20e-3
a = 0.4e-3
mu = mu_0
L = R * (mu_0 * (log(8*R/a) - 2) + mu/2)
print(f"L = {L:.2e}")
例えば、以下のような自己インダクタンス値が得られます。
$$L = 11.3\ \mathrm{nH}$$
(B) 多角形近似 + 円筒状導線のインダクタンス
まず、円筒状導線の自己インダクタンスは、次の式で求めることができます3
$$M_{11} = L_1 = \frac{l}{2\pi} \left\{\frac{\mu_0}{4} + \mu_0\left(\log\frac{2l}{a}-1\right)\right\}
= 2 \times 10^{-7} \times l \left(\log\frac{2l}{a}-\frac{3}{4}\right) $$
- 円筒状導線の長さ $l$
- 導線の半径 $a$
static double calculateSelfInductanceOfSingleWire(double length, double radius)
{
// mu0 = 4*pi*1e-7 [H/m], therefore, the coefficient is mu0/(2*pi) = (4*pi*1e-7)/(2*pi) = 2e-7 [H/m]
return 2e-7 * length * (Math.Log(2 * length / radius) - 3.0/4);
}
続いて、二つの円筒状導線間の相互インダクタンスは、次の式で求めることができます4
$$M_{12} = \mu_0\iint\frac{\mathrm{d}\vec{l}_1 \cdot \mathrm{d}\vec{l}_2}{\vec{r}}
= \mu_0 \cos\theta \int _{0} ^{l_1} \int _{0} ^{l_2} \frac{\mathrm{d}l_1 \mathrm{d}l_2}{r}$$
- 円筒状導線の長さ $l_1, l_2$
- 二つの導線がなす角 $\theta$
- 二つの導線間の距離 $r$
using MathNet.Numerics.LinearAlgebra;
using MathNet.Numerics.Integration;
static Matrix<double>? calculatePartialInductance(Matrix<double> path1, Matrix<double> path2, double radius)
{
var partialInductanceTable = Matrix<double>.Build.Dense(path1.RowCount-1, path2.RowCount-1);
for (int i = 0; i < partialInductanceTable.RowCount; i++)
{
Vector<double> a = path1.Row(i);
Vector<double> b = path1.Row(i + 1);
Vector<double> ab = b - a;
if (ab.L2Norm() == 0)
{
var points = $"({string.Join(",", a.Select(x => $"{x:e2}"))}), ({string.Join(",", b.Select(x => $"{x:e2}"))})";
Console.Error.WriteLine($"Wire length should be larger than 0: {points}");
return null;
}
for (int j = 0; j < partialInductanceTable.ColumnCount; j++)
{
Vector<double> c = path2.Row(j);
Vector<double> d = path2.Row(j + 1);
Vector<double> cd = d - c;
if (cd.L2Norm() == 0)
{
var points = $"({string.Join(",", c.Select(x => $"{x:e2}"))}), ({string.Join(",", d.Select(x => $"{x:e2}"))})";
Console.Error.WriteLine($"Wire length should be larger than 0: {points}");
return null;
}
Vector<double> ac = c - a;
Vector<double> bc = c - b;
Vector<double> ad = d - a;
Vector<double> bd = d - b;
if ((ac.L2Norm() == 0 && bd.L2Norm() == 0 ) || (ad.L2Norm() == 0 && bc.L2Norm() == 0 ))
{
double cosTheta = ab.DotProduct(cd) / (ab.L2Norm() * cd.L2Norm());
partialInductanceTable[i, j] = cosTheta*calculateSelfInductanceOfSingleWire(ab.L2Norm(), radius);
continue;
}
else
{
// mu0 = 4*pi*1e-7 [H/m]
// Therefore, the coefficient is mu0/(4*pi) = (4*pi*1e-7)/(4*pi) = 1e-7 [H/m]
double cosTheta = ab.DotProduct(cd) / (ab.L2Norm() * cd.L2Norm());
partialInductanceTable[i, j] = GaussLegendreRule.Integrate(
f: (x1, x2) => 1e-7 * cosTheta / (ac + x2*cd.Normalize(2) - x1*ab.Normalize(2)).L2Norm(),
invervalBeginA: 0,
invervalEndA: ab.L2Norm(),
invervalBeginB: 0,
invervalEndB: cd.L2Norm(),
order: 5);
continue;
}
}
}
return partialInductanceTable;
}
最後に、$N$本の導線で構成されたコイルの自己インダクタンスは、次のように、各導線の相互インダクタンスの合計で求めることができるので、
$$L = \sum_{i,\ j}^N M_{ij}
= \left(
\sum_{i=1}^{N} L_{i} + \sum_{i=1}^N\sum_{\substack{j=1 \\ j \neq i}}^N M_{ij}
\right)
$$
using MathNet.Numerics.LinearAlgebra;
Matrix<double>? inductanceTable = calculatePartialInductance(path1, path2, radius);
Console.WriteLine(inductanceTable.RowSums().Sum());
これらの式を使い、(A)と同様の円環状導線の自己インダクタンスを計算すると、$N = 128$分割の場合、
以下のような自己インダクタンス値が得られます。
$$L = 10.4\ \mathrm{nH}$$
結果の比較
手法 | 自己インダクタンス | (A)との差 |
---|---|---|
(A) 円環状導線(理論式) | 11.3 nH | 0 % |
(B) 多角形近似(相互インダクタンスの総和) | 10.4 nH | -8 % |
おわりに
バタフライダンシング
反旗翻して
僕が歩けばシャンデリゼ5