インダクタンスを計算しよう（理論式）

## はじめに

~~ランランリンリン 飛ばしてレンレン ロンロン戻してルーンルン[^lunchoma]！半導体業界所属 まやかしの園児にゃあ【ここにあなたの名前を入れてください】です！もしよろしければ【ここにあなたの愛称を入れてください】ってよんでください！！~~

![Screenshot 2025-04-20 154225.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/f89b326c-3f09-422e-9668-7f073713e678.png)

……というわけでね、はい、もう [SystemVerilog](https://qiita.com/ds54e/items/67fb480ba5c1b55664e2) とか [UVM](https://qiita.com/ds54e/items/6c3bb6343b8c15180d28) とか、そんなんばっかりやってると正気を失ってしまいますからね、はい、今日はガラッと気分を変えて、インダクタンスの計算でもしてみましょうか！！！！！！はい！！！！！（自然薯挿入[^jinenjo]）

[^lunchoma]: [ちょまバンク ご利用いかがですか](https://www.youtube.com/shorts/C68V5soBg64)
[^uvm]: [Flip-Flopでお手軽UVM（Driver）- ds54e](https://qiita.com/ds54e/items/6c3bb6343b8c15180d28)
[^sv]: [DSimをコマンドラインから使ってみよう - ds54e](https://qiita.com/ds54e/items/67fb480ba5c1b55664e2)
[^jinenjo]: [自然な導入 - ニコニコ大百科](https://dic.nicovideo.jp/a/%E8%87%AA%E7%84%B6%E3%81%AA%E5%B0%8E%E5%85%A5)

## (A) 円環状導線の自己インダクタンスの理論式

円環状導線の自己インダクタンスは、次の式で求めることができます[^tb1]。
[^tb1]: [詳解 電磁気学演習 - 後藤憲一](https://www.kyoritsu-pub.co.jp/book/b10011310.html)

$$L = R \left\\{\mu_0\left\(\log\frac{8R}{a}-2\right)+\frac{\mu}{2}\right\\}$$

- 円環状導線の半径 $R\ (\gg a)$
- 導線の半径 $a$
- 導線の透磁率 $\mu$

この計算は、Pythonを使って下記のように書くことができ、

```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) 多角形近似 ＋ 円筒状導線のインダクタンス

まず、円筒状導線の自己インダクタンスは、次の式で求めることができます[^tb1]

$$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$

```csharp
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);
}
```

続いて、二つの円筒状導線間の相互インダクタンスは、次の式で求めることができます[^tb2]

[^tb2]: [電気磁気学（3版改訂）- 桂井誠](https://www.iee.or.jp/cfml/OA/front/NonAuthenticate/bookpur/fbo_BookDetail.cfm?objectID=7DD7BA44-CC4F-D721-B35303F859037911)

$$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$

```csharp
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)
$$

```csharp
using MathNet.Numerics.LinearAlgebra;

Matrix<double>? inductanceTable = calculatePartialInductance(path1, path2, radius);
Console.WriteLine(inductanceTable.RowSums().Sum());
```

これらの式を使い、(A)と同様の円環状導線の自己インダクタンスを計算すると、$N = 128$分割の場合、

![Screenshot 2025-04-20 152312.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/863735/7023e1c9-581c-4739-bf3f-6bfa0cfd6b48.png)

以下のような自己インダクタンス値が得られます。
$$L = 10.4\ \mathrm{nH}$$


## 結果の比較

|手法|自己インダクタンス|(A)との差|
|---|---|---|
|(A) 円環状導線（理論式）|11.3 nH|0 %|
|(B) 多角形近似（相互インダクタンスの総和）|10.4 nH|-8 %|


## おわりに

バタフライダンシング
反旗翻して
僕が歩けばシャンデリゼ[^shintentai]

[^shintentai]: [【オリジナルラップ】新天体【ルンルン / にじさんじ】](https://www.youtube.com/watch?v=rg_6PlYAzsk)