有限同心球殻の電位シミュレーターをつくってみた
初めまして。工学部学部一年のちゃそ(@chaso6150)と申します。今回アドベントカレンダーをやるよ!!!というのを聞いて「おおお!!!自分もなんか書きたい!!!」と思ったのですがいや書けるような知識なくね...?という根本的な問題にぶち当たりましたが「うるせえ!!!書いて成長するんだよ!!!恥かいてなんぼや!!!」と投稿を決意しました。
ということで本題。
有限同心球殻の電位シミュレーターをつくってみた
...いやいやいや有限同心球殻って何ぞや?電位って何ぞや?と思う方もいるかと思われますので、今回はその周辺の簡単な説明とかも付け加えながらシミュレーター完成まで書いていこうと思います。
1.電位ってなに?
ただの電圧のことです。単位はV(ボルト)で表記されます。正確には「ある電気的な力を持った物体を電気的なフィールドを移動するのにかける仕事」となります。「じゃあなんで電圧じゃなくて電位と呼ぶの?」という疑問が出てくると思いますが、それにはれっきとした理由があり、電位とは電界というものから導出するためです。
電界とは簡単に言えば磁界の電気バージョンみたいなものです。例えば磁石だったら「近づけるほどくっつく力が強くなる!」という経験をしたことがあると思います。そのような状態を滑り台の角度が急になると考えます。そうすると磁石に近づけば近づくほど坂が急になっていって...と高さが変わってくるというのが何となくわかりますでしょうか?(わかりづらい)
次に磁界を電界に置き換えても同じです。プラスの電気的な力を持ったもの(のちに電荷と呼びます。)をマイナスの電気的な力を持ったものに近づけます。そうすると同じく「近づくにつれて引き寄せる力が強くなる!」...以下略。これが電界というものです。ただ電界は今述べた全体の流れのことを指します。そこで電位、電界中の電荷を移動させるのに働く力なので...そうです。積分です。
非常に心苦しいですがここで定義式の紹介となります。まず電界Eとして、電気的な力こと電荷をQ、真空誘電率をεとして距離r離れた一点にQが及ぼす電界は、
で表され、さらに電位はそれを積分と述べた通り、
なぜ∞から積分をしているかといいますと電界の定義として無限遠方を0とするというものがあります。(磁石も遠ざかると引き寄せられませんが理論上は引き寄せられていて、きりがないので0としてるのと同じノリです。)このようにして電界、そして電位を求めることが可能となりました。
2.有限同心球とは
続いて有限同心球殻です。これもマトリョシカのイメージを持ってもらえればわかりやすいと思います。まずはこちらをご覧ください。
で表されます。このようにして電位、すなわち電圧の大きさを測定していきます。次に1枚目の同心球殻の電位差を求めます。「電位差なんて聞いてねえよ!!!」って思う方安心してください。二枚目の電位を基準にとって差をとるだけです。この時1枚目の電位と置くと、
で表されます。(あえて約分してありません。)ここで気になりませんか?もし殻の枚数がN枚になったら...?と。 それでは同様に、一番外側のN枚目の電位から求めていきます。
電磁気始まったな。って感じの式が出てきましたね。結果はまだ単純ですが。どんどん行きます。続いてN-1枚目の電位です。
最後にk番目の電位について
となります。自分でも書いててわからなくなりそうでしたが一応これが最終的な式になります。
3.実際にシミュレーションしてみよう!
ということでようやく本題。今回はもちろんC言語でシミュレーターを作成してみました。ただし条件として①Q=1で固定すること。②Rの大きさは等間隔にすること。を条件として付けくわえた不自由なシミュレーターになっています。コードは以下の通りになります。
#include <stdio.h> int main(void) { int k, r, n,m; int sum = 0; double i = 0.885; //真空での誘電率(定数)ただし10^(-11)です。 double p = 3.14; double a = 0; double b = 1; double l, o, t, S, V; //必要な値をそれぞれ定義する。 printf("同心球間の距離を自然数で指定してください。\n"); scanf("%d", &r); printf("同心球の数を自然数で設定してください。\n"); scanf("%d", &n); printf("何番目の球殻の電位を調べますか?\n"); scanf("%d", &k); //シミュレーションしたい条件に応じて値を入力する。 m = n; l = n; o = k; if (k <= n) //球殻の数<調べたい殻の時は存在しないので省く。 { for (n; n > k; n--) { b *= r * n; } for (m; m > k; m--) { a += b / (r * m); } S = a / b; t = (p * i) / 4; V = ((t / r) * (o * (o + 1) / 2) + ((l * (l + 1) / 2) - (o * (o + 1) / 2)) / S); printf("%d番目の球殻の電位は%f×10^-11<V>です。\n", k, V); } else { printf("外角が存在しません。\n"); } return 0; }
これが本題なのに一番心配なのがこれという....とりあえず最後に導出した漸化式をもとにそれに合うようにプログラミングを作成しました。また殻の数より調べたい殻が大きいときだけは省くように設定して小数点の繰り上がりや繰り下がり等はない他は特に制限がない頭悪いプログラムとなっています。またεやπなどはあまり詳しく述べていませんが定数を与えてあります。またあまり現実的でない値を入れたら時には時々変な値を出力することがあったりします。(自分がやった中では観測できませんでしたが...)
4.最後に
今回このような形でプログラムを作るといった実際にプログラミンを用いたモノづくり(?)をするのが初めてで色々な方に相談しながらなんとからしいものが完成できたな...という風にしみじみと感じています。相談に乗っていただけた皆様にはこの場を借りて御礼もうし申し上げます。また授業でほとんどプログラミングを触っていない中の製作なのでまだプログラムの構築の仕方にまだ不手際があるかもしれませんが「もっとこうしたほうがいいよ~」等ご教授いただけたら幸いです。
またこの記事を書きながら思ったことなのですがこのように実際につくってみたからこそ学べたことや新しい考え方があったので「何かに新しく触れてみる」ということで得るものや知識の後付けができるのだな~という風に感じました。もしこれからもこのような機会があったら是非参加させていただきたいなと思います。(アイデアがなんかあったらですが!)
今回はこの辺で。ご高覧いただきありがとうございました。
参考資料
後藤憲一/山崎修一郎共編(1970) 詳解電磁気学演習(共立出版株式会社) 山田直平原著/桂井誠著(2002) 電気学会大学講座電磁気学(オーム社)