<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>有限要素法入門 - 電磁場解析シミュレーションの株式会社フォトン</title>
	<atom:link href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/technicalinfo-category/cat03/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.photon-cae.co.jp</link>
	<description></description>
	<lastBuildDate>Thu, 12 Aug 2021 04:37:08 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.photon-cae.co.jp/wp/wp-content/uploads/2021/02/cropped-logo-1-1-32x32.png</url>
	<title>有限要素法入門 - 電磁場解析シミュレーションの株式会社フォトン</title>
	<link>https://www.photon-cae.co.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>はじめに</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/874/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Wed, 04 Aug 2021 00:45:08 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=874</guid>

					<description><![CDATA[<p>電磁場のシミュレーションを行うための数値解析の手段にはさまざまのものがありますが、低周波領域から高周波領域を幅広く扱うものとしては有限要素法があります。特に低周波電磁場の分野では現在有限要素法が最も使われているといっても [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/874/">はじめに</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>電磁場のシミュレーションを行うための数値解析の手段にはさまざまのものがありますが、低周波領域から高周波領域を幅広く扱うものとしては有限要素法があります。特に低周波電磁場の分野では現在有限要素法が最も使われているといっても過言ではありません。<br />
有限要素法による電磁場解析のソフトウェアを使ってシミュレーションを行う場合、有限要素法がどのような手法であるかを知らなくても対象物のモデル化を適切に行い、電磁場の駆動源である電流や磁石を設定し、境界条件を間違いなく設定すれば正しい答えを得ることが出来ます。<br />
有限要素法では対象とする磁性体やコイルとそれらを含む空間を解析領域とし、これらの領域を有限要素とよばれる小領域に分割します。ところが現実の電磁場は遠方まで広がっているのでその領域すべてを解析領域とすることはできません。そこで適当な大きさの領域を設定するのですが、その場合現実にはない境界面が出てきます。その境界で電磁場が十分小さくなっている場合はこの面で電磁場がゼロであると近似し、この境界面上の磁場をゼロと設定します。<br />
このように境界上の値を決めることを境界条件といいますが、境界条件にはこのような遠方の電磁場をゼロとして設定するほかに、モデルの対称性を考慮して解析領域を縮小する場合とか、対象物の周期性を利用して領域の一部を切りだすときにも必要になってきます。<br />
まず、対象とする領域をどのぐらいの大きさに設定するかが問題となりますが、あまり大きくすると知りたい領域の電磁場にあまり寄与しないものまで含めてしまいコンピュータの計算負荷を高めてしまいます。逆に小さくしすぎると寄与の大きな部分まで除いてしまい計算制度を損ねてしまいます。<br />
計算領域が決まれば、その領域をどの程度の有限要素に分割するかが問題となります。細かく分割すればするほど計算結果の精度は向上しますが、データ量が多くなり計算時間もそれに伴って増大します。逆に分割数が少ないと、データ量も少なく、計算時間も短くなりますが精度は悪くなっていきます。<br />
したがって、解析領域をどのように設定してどの程度の分割を行うかは有限要素法による解析を行う上で非常に重要な問題です。<br />
有限要素法による解析の経験をある程度積めばこのようなことについて適切な判断が出来るようになり、必要とされる精度で電磁場のシミュレーションが出来るようになります。<br />
ところが、要素分割によって解析結果の精度がなぜ変化するかは、有限要素法がどのような方法で現実の対象をモデル化しているかの知識が必要です。<br />
また境界条件を設定することが、なぜ必要なのかが分かっていれば現実とシミュレーションの関係が理解でき、精度の向上のためのに何が必要かが分かってきます。<br />
このような中身の理解があれば、解析経験から得られたものをより効果的に体系化でき経験していない対象に対しても正しいモデル化、すなわち求められる精度を保ちながら計算時間など計算機に対する負荷を出来るだけ小さくすることが出来るようになります。<br />
このような観点から、有限要素法を使って電磁場解析を行うときにどのようなことを知っていればよいかということを体系的にまとめました。<br />
まず電磁場についてのシミュレーションなので、扱う電磁場に関する基礎的な法則をどのように有限要素法で扱っていくかを具体的に述べます。<br />
電磁場は周波数がそれほど高くない場合は電場と磁場をそれぞれ別々に扱うことが出来ます。<br />
そこで第１章では電場解析について一つの方向のみに電場が変化する１次元的な問題から始めて、より現実に近い２次元３次元の問題について述べます。<br />
第２章では静的な磁場解析について、２次元問題、軸対称問題、そして３次元問題を取り上げ、磁場に関する基礎方程式をどのように有限要素法で扱うかを具体的に述べます。<br />
３次元の磁場解析では、未知数であるベクトルポテンシャルをエッジの変数として持たせる辺要素法が現在主流となっていますので、節点に未知数を持たせる節点要素法とどのように違うのかを述べ、辺要素法による磁場解析について見ていきます。<br />
第３章では、磁場解析で扱う磁性体について述べます。磁場が小さなときは磁束密度が磁場に比例すると考えて一定の透磁率を持つ磁性体を考えることが出来ますが、一般的には透磁率は磁場の大きさによって変化します。また方向によって磁化特性が異なる場合もありこれらをどのように扱っていくかは、シミュレーションを行う上で非常に重要なことです。<br />
これらを系統的に扱うために磁性体の自由エネルギーを考え、変分法による定式化を紹介します。またこの方法を拡張すれば、履歴によって磁化特性が変わるヒステリシス<br />
を扱うことが出来ます。<br />
第４章では磁場が時間的に変化して導体内に渦電流が発生するような問題をどのように扱うかについて述べています。時間的変化には一定の周波数を持つ定常な状態と、時々刻々変化する過渡的な現象があります。前者は周波数応答解析、後者は過渡応答解析とよばれており、これらを有限要素法に取り入れるにはどのようにするのかについて述べています。このような動的な問題を扱う場合、未知数である電磁ポテンシャルとして、ベクトルポテンシャルとスカラーポテンシャルを用いる場合と、電流ポテンシャルと磁気ポテンシャルを用いる場合がありますのでこれらについてもこの章で紹介します。<br />
第５章では、高周波電磁場について述べます。高周波になると磁束密度の変化が電場を作り、電束密度の変化が磁場を作るので、電場と磁場が密接な関係を持ちます。<br />
従って低周波電磁場のように電場の方程式と磁場の方程式を独立に扱うことが出来ず、マックスウェル方程式全体を基礎方程式として扱う必要があります。<br />
また、高周波電磁場の場合特定の周波数に対して共振モードを持つ場合があり、このような場を扱うためには固有値解析を行う必要があります。<br />
この章ではこのような高周波特有の問題に対してどのように扱うのかということについての話をします。<br />
電流や磁化が分かっている場合これらがどのような磁場を作るかは有限要素法などの数値的な解法を使わなくても求めることが出来ます。<br />
有限要素法を使う必要があるのは、磁性体がどのように磁化するかや、導体内部を流れる渦電流などがシミュレーションを行って結果的に知ることが出来るものだからです。<br />
第６章では既知である電流や磁化を含んだシミュレーションで、解析的に計算出来る電磁場と有限要素法の併用法について述べます。<br />
第７章では、誘電体や磁性体に働く電磁力について述べます。電磁力としては電流に働くローレンツ力はよく知られていますが、磁性体に働く力をどのように評価するかについてはあまり知られていません。電磁場解析の目的としては磁性体が電磁場からどのような力を受けるかが問題となる場合が多くありますので、これらをどのように扱えばよいかを述べています。<br />
有限要素法を理解するには簡単なプログラムを自分で作ってみるのが一番よい方法だと思われます。そこで、静電場解析を扱う有限要素法のプログラムを作ってみることにしました。<br />
各章の終わりには本文とは独立にこのプログラムの具体的な例を挙げています。<br />
章の終わりにこのプログラムをご自分でコーディングしてゆけば第７章の終わりにこのプログラムが完成するようになっています。<br />
またこのプログラムを実行すれば、本文にある静電場の有限要素法の例として取り上げた問題の結果を求めることができプログラムのチェックが出来るようになっています。<br />
このプログラムは単純な問題しか解けませんが、少し変更することによって線形誘電率ばかりではなく非線形誘電率を扱ったり、電場の駆動源として電荷密度を与えるようになっていますが、境界条件として電位を与えたりすることが出来るようになります。<br />
このようにこのプログラムをベースに本文にかかれていることをいろいろと試すことは、有限要素法を具体的に理解するうえで非常に役に立つことだと思います。</p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/874/">はじめに</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>目次</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/876/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Wed, 04 Aug 2021 00:50:52 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=876</guid>

					<description><![CDATA[<p>１．電場解析 １.１　静電場の方程式 １.２　１次元問題 １.３　２次元問題 １.４　３次元問題 １.５　静電場の境界条件 １.６　有限要素法のプログラム(その１) ２．磁場解析 ２.１　静磁場の方程式 ２.２　２次元問 [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/876/">目次</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/883/><b>１．電場解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/885/><b>１.１　静電場の方程式</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/891/><b>１.２　１次元問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/895/><b>１.３　２次元問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/899/><b>１.４　３次元問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/901/><b>１.５　静電場の境界条件</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/903/><b>１.６　有限要素法のプログラム(その１)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/912/><b>２．磁場解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/913/><b>２.１　静磁場の方程式</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/916/><b>２.２　２次元問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/918/><b>２.３　軸対称問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/924/><b>２.４　３次元問題</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/928/><b>２.５　節点要素と辺要素</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/930/><b>２.６　辺要素法による磁場解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/932/><b>２.７　有限要素法のプログラム(その２)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/934/><b>３．磁性体</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/935/><b>３.１　異方性磁性体</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/937/><b>３.２　非線形磁性体</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/941/><b>３.３　異方性非線形磁性体</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/943/><b>３.４　熱力学ポテンシャルと変分法</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/945/><b>３.５　ヒステリシス</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/947/><b>３.６　有限要素法のプログラム(その３)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/1058/><b>４．動的な磁場解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/949/><b>４.１　動的な磁場の方程式</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/951/><b>４.２　周波数応答解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/953/><b>４.３　過渡応答解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/956/><b>４.４　磁気ベクトルポテンシャル法</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/958/><b>４.５　電流ベクトルポテンシャル法</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/960/><b>４.６　有限要素法のプログラム(その４)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/964/><b>５．高周波の電磁場</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/965/><b>５.１　高周波電磁場の方程式</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/967/><b>５.２　有限要素法</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/969/><b>５.３　固有値解析</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/972/><b>５.４　有限要素法のプログラム(その５)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/974/><b>６．解析計算との連携</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/975/><b>６.１　解析計算</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/977/><b>６.２　有限要素法の結果による解析計算</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/979/><b>６.３　外場を使った計算</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/981/><b>６.４　有限要素法のプログラム(その６)</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/983/><b>７．電磁力</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/984/><b>７.１　ローレンツ力</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/986/><b>７.２　マックスウェル応力</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/988/><b>７.３　誘電体や磁性体に働く力</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/990/><b>７.４　有限要素法による結果処理</b></a><br />
<a href=https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/992/><b>７.５　有限要素法のプログラム(その７)</b></a><br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/876/">目次</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１．電場解析</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/883/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Wed, 04 Aug 2021 02:34:45 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=883</guid>

					<description><![CDATA[<p>電磁場解析のための有限要素法の話をこれから行っていくのですが、まず電場解析から始めます。 有限要素法では考えている領域を要素とよばれる小領域に分割して、電場や磁場を要素内の補間関数によって表現します。 この要素は、頂点と [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/883/">１．電場解析</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>電磁場解析のための有限要素法の話をこれから行っていくのですが、まず電場解析から始めます。<br />
有限要素法では考えている領域を要素とよばれる小領域に分割して、電場や磁場を要素内の補間関数によって表現します。<br />
この要素は、頂点とそれを結ぶ辺から構成される多角形や多面体で、２次元問題では三角形や四角形、３次元問題では四面体、五面体、そして六面体などがよく使われています。この頂点のことを節点とよんでいて電場や磁場を表す変数をこの節点に置き、この値を使って要素内の場を補間します。<br />
電場や磁場は空間に連続的に分布していますが、このように節点に値を持たすことにより節点数だけの値、つまり有限の数の値だけを使って電場や磁場を表現することができるようになるのです。このように節点に電磁場の値を持たせる方法は有限要素法でよく使われていました。<br />
ところが電場や磁場を表すベクトル場を扱う場合、節点ではなく辺にベクトルの射影成分を持たせることも最近はよく使われています。<br />
節点に値を持たせる要素を節点要素、そしてこの要素を使う有限要素法のことを節点要素法とよばれています。<br />
一方、辺に値を持たせる要素を辺要素とよび、この要素を使った有限要素法を辺要素有限要素法とよびます。<br />
このように有限要素法には種類があるのですが、辺要素の説明をするには節点要素の知識が必要になります。<br />
したがって節点要素か使われている電場解析を出発点とします。</p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/883/">１．電場解析</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.１　静電場の方程式</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/885/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Wed, 04 Aug 2021 02:37:58 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=885</guid>

					<description><![CDATA[<p>まず静電場について考えます。電場に関しては次の物質中のマックスウェルの方程式があります。 \begin{equation} \mathrm{div}\boldsymbol{D}=\rho \tag*{$(1.1-1)$} [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/885/">１.１　静電場の方程式</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code><!-- 図 130% に拡大・文中の式 $hoge$ の前後に半角スペースを挿入 --></code><br />
まず静電場について考えます。電場に関しては次の物質中のマックスウェルの方程式があります。<br />
\begin{equation}<br />
\mathrm{div}\boldsymbol{D}=\rho  \tag*{$(1.1-1)$}<br />
\end{equation}<br />
ここに $\rho$ は電荷密度、$\boldsymbol{D}$ は電束密度です。<br />
誘電率を $\epsilon$ とすれば電束密度は電場を使って次のように表されます。<br />
\begin{equation}<br />
\boldsymbol{D}=\epsilon\boldsymbol{E}  \tag*{$(1.1-2)$}<br />
\end{equation}<br />
静電場はポテンシャル $\phi$ を使って次のように表すことができます。<br />
\begin{equation}<br />
\boldsymbol{E}=-\mathrm{grad}\phi   \tag*{$(1.1-3)$}<br />
\end{equation}<br />
これは静電場が、<br />
\begin{equation}<br />
\mathrm{rot}\boldsymbol{E}=0  \tag*{$(1.1-4)$}<br />
\end{equation}<br />
をみたすからです。<br />
ポテンシャルを使うと静電場の基礎方程式は次のようになります。<br />
\begin{equation}<br />
\mathrm{div}(\epsilon\mathrm{grad}\phi)=-\rho  \tag*{$(1.1-5)$}<br />
\end{equation}<br />
この方程式は座標成分ごとに分けて次のようにかくことが出来ます。<br />
\begin{equation}<br />
\frac{\partial}{\partial x}\bigl(\epsilon\frac{\partial\phi}{\partial x}\bigr)+\frac{\partial}{\partial y}\bigl(\epsilon\frac{\partial\phi}{\partial y}\bigr)<br />
+\frac{\partial}{\partial z}\bigl(\epsilon\frac{\partial\phi}{\partial z}\bigr)=-\rho  \tag*{$(1.1-6)$}<br />
\end{equation}<br />
解析領域に複数の物質が存在する場合、誘電率は場所ごとに変化します。また右辺の電荷密度も一般的には場所の関数なのでこの方程式を直接解くのは難しいと思われます。<br />
そこで問題をもう少し簡単にして、どのように方程式を解けばよいかを考えます。<br />
まず誘電率や電荷密度が $x$ 方向にだけ変化し、 $y$ 、 $z$ 方向には変化しない場合、この方程式は次のように１次元の方程式となります。<br />
\begin{equation}<br />
\frac{d}{dx}\bigl(\epsilon\frac{d\phi}{dx}\bigr)=-\rho   \tag*{$(1.1-7)$}<br />
\end{equation}<br />
微分は $x$ 方向の微分しか含んでないので常微分方程式です。ここで電荷密度が $x$ によらず一定の場合にはこの式の両辺は積分することができて、<br />
\begin{equation}<br />
\epsilon\frac{d\phi}{dx}=-\rho x + c  \tag*{$(1.1-8)$}<br />
\end{equation}<br />
となります。ここで $c$ は積分定数でこの方程式を解くときの境界条件によって決まります。<br />
解析領域として $x$ 軸上の区間 $[0,1]$ を考えます。$y$ 方向や $z$ 方向には変化しないので解析領域も１次元領域となります。<br />
この端部の条件として、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;D_x=0 \hspace{10mm} (x=0)  \\<br />
&#038;\phi=0 \hspace{14mm} (x=1)<br />
\end{split}  \tag*{$(1.1-9)$}<br />
\end{equation}<br />
とすれば、最初の条件から、<br />
\begin{equation}<br />
D_x=-\epsilon\frac{d\phi}{dx}=\rho\times 0-c=0  \notag<br />
\end{equation}<br />
より積分定数 $c$ はゼロとなります。これから(１．１－８)式は、<br />
\begin{equation}<br />
\epsilon\frac{d\phi}{dx}=-\rho x  \notag<br />
\end{equation}<br />
となりますが、この両辺を $x$ で積分して少し変形すると次のようになります。<br />
\begin{equation}<br />
\phi=-\frac{1}{2}\frac{\rho}{\epsilon}x^2+c^\prime  \notag<br />
\end{equation}<br />
ここに $c^\prime$ は積分定数で(１．１－９)式の２番目の条件で決まります。この条件より、<br />
\begin{equation}<br />
0=-\frac{1}{2}\frac{\rho}{\epsilon}1^2+c^\prime  \notag<br />
\end{equation}<br />
から、<br />
\begin{equation}<br />
c^\prime=\frac{1}{2}\frac{\rho}{\epsilon}  \notag<br />
\end{equation}<br />
となり、ポテンシャルは次のように求まります。<br />
\begin{equation}<br />
\phi=\frac{1}{2}\frac{\rho}{\epsilon}(1-x^2)  \tag*{$(1.1-10)$}<br />
\end{equation}<br />
このポテンシャルは方程式(１．１－７)式をみたし端部の条件(１．１－９)式、すなわち境界条件をみたしていることが分かります。<br />
この例では誘電率と電荷密度が場所によって変化しないという条件のもとに解いたので比較的簡単に解けました。ところが一般的には複数の誘電体が解析領域に存在したり電荷密度が場所によって変化しますのでこのように簡単に解けるとは限りません。<br />
そこで、１次元の方程式(１．１－７)式を $x$ 軸上の区間 $[a,b]$ において数値的に解くことを考えます。端部の境界条件は与えられているものとします。<br />
数値的に解く場合この区間 $[a,b]$ を図のように幅 $\Delta x$ の小区間に分割し、ポテンシャルはその分割点でのみ値を持っているとして有限の値を未知数とした方程式を作ります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_1_01.png" style="display: block; margin: auto;"><br />
このように関数の値を有限の $x_i$ 座標に対応する値 $\phi_i$ とした場合、関数の微分は次のように近似できます。<br />
\begin{equation}<br />
\frac{d}{dx}\phi(x_i)=\frac{\phi_{i+1}-\phi_i}{\Delta x}  \tag*{$(1.1-11)$}<br />
\end{equation}<br />
これを使うと(１．１－７)式の左辺は次のようにかけます。<br />
\begin{equation}<br />
\frac{1}{\Delta x}\bigl(\epsilon_i\frac{\phi_{i+1}-\phi_i}{\Delta x}-\epsilon_{i-1}\frac{\phi_i-\phi_{i-1}}{\Delta x}\bigr)  \notag<br />
\end{equation}<br />
ただし誘電率はここでは点ごとに異なっているとして微分をとる区間の座標の小さなときの値を使っています。<br />
これを(１．１－７)式に入れて $\phi_i$ に関する連立方程式を作り、その解をポテンシャルの値として計算する方法が差分法です。<br />
ここではこれ以上差分法については述べませんが感じはつかんでいただけると思います。<br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/885/">１.１　静電場の方程式</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.２　１次元問題</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/891/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Thu, 05 Aug 2021 02:04:13 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=891</guid>

					<description><![CDATA[<p>有限要素法を使ってこの問題へのアプローチを行います。 有限要素法の場合ここで分割した区間幅 $\Delta x$ の領域を要素とよび区間幅は一定でなくてもかまいません。また要素を分割する $x_i$ などの点を節点とよん [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/891/">１.２　１次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code><!-- 図 140% に拡大・文中の式 $hoge$ の前後に半角スペースを挿入 --></code><br />
有限要素法を使ってこの問題へのアプローチを行います。<br />
有限要素法の場合ここで分割した区間幅 $\Delta x$ の領域を要素とよび区間幅は一定でなくてもかまいません。また要素を分割する $x_i$ などの点を節点とよんでいます。<br />
有限要素法の場合はこの要素内部でポテンシャルを節点の値で内挿します。下の図は区間 $[x_i,x_{i+1}]$ の要素ですが、座標 $x_i$ におけるポテンシャルの値 $\phi_i$ と、座標 $x_{i+1}$ におけるポテンシャルの値 $\phi_{i+1}$ によって座標 $x$ におけるポテンシャルを内挿します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_2_01.png" style="display: block; margin: auto;"><br />
この場合は線形補間なので次のようになります。<br />
\begin{equation}<br />
\phi(x)=\frac{x_{i+1}-x}{x_{i+1}-x_i}\phi_i+\frac{x-x_i}{x_{i+1}-x_i}\phi_{i+1}  \notag<br />
\end{equation}<br />
ここで次の補間関数を定義します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(x)=\frac{x_{i+1}-x}{x_{i+1}-x_i}  \\<br />
&#038;N_2(x)=\frac{x-x_i}{x_{i+1}-x_i}<br />
\end{split}   \tag*{$(1.2-1)$}<br />
\end{equation}<br />
つまり座標 $x_i$ のこの要素におけるローカルな番号を $1$、座標 $x_{i+1}$ のこの要素におけるローカルな番号を $2$ として、<br />
\begin{equation}<br />
\phi^1=\phi_i \hspace{10mm} \phi^2=\phi_{i+1}  \notag<br />
\end{equation}<br />
とおけば、要素内のポテンシャルは次のようにかけます。<br />
\begin{equation}<br />
\phi(x)=\sum_{\alpha=1}^2N_\alpha(x)\phi^\alpha  \tag*{$(1.2-2)$}<br />
\end{equation}<br />
問題は１次元の静電場の方程式(１．１－７)式を解くことです。もし誘電率が一定ならば(１．１－７）式は次のようにかけます。<br />
\begin{equation}<br />
\frac{d}{dx}\bigl(\frac{d\phi}{dx}\bigr)=-\frac{\rho}{\epsilon}   \notag<br />
\end{equation}<br />
これに要素内で内挿したポテンシャル(１．２－２）式を代入すると左辺は、<br />
\begin{equation}<br />
\frac{d}{dx}\frac{\phi_{i+1}-\phi_i}{x_{i+1}-x_i}=0  \notag<br />
\end{equation}<br />
となり意味のない方程式となってしまいます。これは補間関数が1次であるのに対して方程式が2階の微分方程式となっているからです。<br />
このようなことを避けるために有限要素法では基礎方程式の微分の階数を減らすことを行います。<br />
(１．１－７）に戻って、この方程式の両辺に任意の関数 $w(x)$ をかけて解析区間 $[a,b]$ で積分します。<br />
\begin{equation}<br />
\int_a^bw(x)\frac{d}{dx}\bigl(\epsilon\frac{d\phi}{dx}\bigr)dx=-\int_a^bw(x)\rho dx  \notag<br />
\end{equation}<br />
$w$ が任意関数のときこの式は元の式（１．１－７）式と等価な式です。<br />
ここで左辺を部分積分を使って次のように変形します。<br />
\begin{equation}<br />
\begin{split}<br />
\int_a^b\frac{d}{dx}\bigl(w(x)\epsilon\frac{d\phi}{dx}\bigr)dx-\int_a^b\frac{dw}{dx}\epsilon\frac{d\phi}{dx}dx<br />
=\bigl[w(x)\epsilon\frac{d\phi}{dx}\bigr]_a^b-\int_a^b\frac{dw}{dx}\epsilon\frac{d\phi}{dx}dx<br />
\end{split}  \notag<br />
\end{equation}<br />
境界点 $a$、$b$ で電場がゼロの場合は $d\phi/dx=0$ となるのでこの右辺第１項はゼロとなります。<br />
また後で示しますがこれらの点でポテンシャルが決まっている場合もこの項はゼロとなります。<br />
したがって基礎方程式は次のようにかきかえることができます。<br />
\begin{equation}<br />
\int_a^b\frac{dw}{dx}\epsilon\frac{d\phi}{dx}dx=\int_a^bw(x)\rho dx  \tag*{$(1.2-3)$}<br />
\end{equation}<br />
ここで解析領域 $[a,b]$ を先ほどのように小領域である要素に分割します。積分はこれらの要素ごとの積分の和で表すことができます。<br />
分割数が $n$ の場合は次のようになります。<br />
\begin{equation}<br />
\sum_{i=1}^n\int_{x_i}^{x_{i+1}}\frac{dw}{dx}\epsilon\frac{d\phi}{dx}dx=\sum_{i=1}^n\int_{x_i}^{x_{i+1}}w(x)\rho dx  \tag*{$(1.2-4)$}<br />
\end{equation}<br />
それぞれの要素内部ではポテンシャルは(１．２－１）式の補間関数によって(１．２－２）式のように表すことができます。<br />
また関数 $w(x)$ についても同じように補間します。<br />
\begin{equation}<br />
w(x)=\sum_{\alpha=1}^2N_\alpha(x)w^\alpha  \tag*{$(1.2-5)$}<br />
\end{equation}<br />
これを(１．２－４）式に代入するとこの式の左辺と右辺は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\sum_i\sum_{\alpha\beta}w^{i\alpha}\int_{x_i}^{x_{i+1}}\frac{dN_\alpha}{dx}\epsilon\frac{dN_\beta}{dx}dx\phi^{i\beta}  \\<br />
&#038;\sum_i\sum_{\alpha}w^{i\alpha}\int_{x_i}^{x_{i+1}}N_\alpha\rho dx<br />
\end{split}  \notag<br />
\end{equation}<br />
ここで $\alpha$、$\beta$ は要素内の節点につけたローカルな番号 $1$、$2$ ですが、ポテンシャルや $w$ の肩についている添字 $i\alpha$、$i\beta$ などは<br />
節点についているグローバルな番号 $i$、$i+1$ などです。<br />
ここで次の要素行列と要素ベクトルを定義します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}^{(i)}=\int_{x_i}^{x_{i+1}}\frac{dN_\alpha}{dx}\epsilon\frac{N_\beta}{dx}dx  \\<br />
&#038;F_\alpha^{(i)}=\int_{x_i}^{x_{i+1}}N_\alpha\rho dx<br />
\end{split}  \tag*{$(1.2-6)$}<br />
\end{equation}<br />
これより(１．２－４）式は、<br />
\begin{equation}<br />
\sum_i\sum_{\alpha\beta}w^{i\alpha}K_{\alpha\beta}^{(i)}\phi^{i\beta}=\sum_i\sum_\alpha w^{i\alpha}F_\alpha^{(i)}  \notag<br />
\end{equation}<br />
となります。さらに関数 $w$ でまとめると次のようになります。<br />
\begin{equation}<br />
\sum_i\sum_{\alpha}w^{i\alpha}\bigl(\sum_\beta K_{\alpha\beta}^{(i)}\phi^{i\beta}-F_\alpha^{(i)}\bigr)=0  \tag*{$(1.2-7)$}<br />
\end{equation}<br />
この式は要素番号 $i$ と要素内のローカルな節点番号 $\alpha$ の和になっていますが、<br />
 $w^{i\alpha}$ はグローバルな節点番号 $i$ と $i+1$ に対応しています。<br />
この関係を領域を４要素に分割した下の図を基に説明します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_2_02.png" style="display: block; margin: auto;"><br />
解析領域である線分を４分割し上に節点番号、下の四角で囲った番号で要素番号を示しています。<br />
この場合について(１．２－７)式の左辺をかきくだすと次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;w^{11}(K_{11}^{(1)}\phi^{11}+K_{12}^{(1)}\phi^{12}-F_1^{(1)})+w^{12}(K_{21}^{(1)}\phi^{11}+K_{22}^{(1)}\phi^{12}-F_2^{(1)}) \\<br />
+&#038;w^{21}(K_{11}^{(2)}\phi^{21}+K_{12}^{(2)}\phi^{22}-F_1^{(2)})+w^{22}(K_{21}^{(2)}\phi^{21}+K_{22}^{(2)}\phi^{22}-F_2^{(2)}) \\<br />
+&#038;w^{31}(K_{11}^{(3)}\phi^{31}+K_{12}^{(3)}\phi^{32}-F_1^{(3)})+w^{32}(K_{21}^{(3)}\phi^{31}+K_{22}^{(3)}\phi^{32}-F_2^{(3)}) \\<br />
+&#038;w^{41}(K_{11}^{(4)}\phi^{41}+K_{12}^{(4)}\phi^{42}-F_1^{(4)})+w^{42}(K_{21}^{(4)}\phi^{41}+K_{22}^{(4)}\phi^{42}-F_2^{(4)})<br />
\end{split}  \notag<br />
\end{equation}<br />
図を見ると要素番号 $i$ の第１節点は節点番号 $i$、第２節点は節点番号 $i+1$ となっています。例えば要素番号１の第２節点は２であり２番目の要素の第１節点と同じです。<br />
このように要素番号とローカルな節点番号の組 $(i,\alpha)$ をグローバルな節点番号にかきなおすと(１．２－７)式の左辺は次のようにかきなおすことが出来ます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;w^{1}(K_{11}^{(1)}\phi^{1}+K_{12}^{(1)}\phi^{2}-F_1^{(1)})+w^{2}(K_{21}^{(1)}\phi^{1}+K_{22}^{(1)}\phi^{2}-F_2^{(1)}) \\<br />
+&#038;w^{2}(K_{11}^{(2)}\phi^{2}+K_{12}^{(2)}\phi^{3}-F_1^{(2)})+w^{3}(K_{21}^{(2)}\phi^{2}+K_{22}^{(2)}\phi^{3}-F_2^{(2)}) \\<br />
+&#038;w^{3}(K_{11}^{(3)}\phi^{3}+K_{12}^{(3)}\phi^{4}-F_1^{(3)})+w^{4}(K_{21}^{(3)}\phi^{3}+K_{22}^{(3)}\phi^{4}-F_2^{(3)}) \\<br />
+&#038;w^{4}(K_{11}^{(4)}\phi^{4}+K_{12}^{(4)}\phi^{5}-F_1^{(4)})+w^{5}(K_{21}^{(4)}\phi^{4}+K_{22}^{(4)}\phi^{5}-F_2^{(4)})<br />
\end{split}  \notag<br />
\end{equation}<br />
ここに現れる $w^1$ から $w^5$ は任意関数を離散化した値です。したがって上の式がゼロになるにはこれらの係数がそれぞれゼロになる必要があります。<br />
したがって(１．２－７)式をみたすには次の方程式が成り立つ必要があります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}^{(1)}\phi^{1}+K_{12}^{(1)}\phi^{2}=F_1^{(1)}  \\<br />
&#038;K_{21}^{(1)}\phi^{1}+(K_{22}^{(1)}+K_{11}^{(2)})\phi^{2}+K_{12}^{(2)}\phi^{3}=F_2^{(1)}+F_1^{(2)}  \\<br />
&#038;K_{21}^{(2)}\phi^{2}+(K_{22}^{(2)}+K_{11}^{(3)})\phi^{3}+K_{12}^{(3)}\phi^{4}=F_2^{(2)}+F_1^{(3)}  \\<br />
&#038;K_{21}^{(3)}\phi^{3}+(K_{22}^{(3)}+K_{11}^{(4)})\phi^{4}+K_{12}^{(4)}\phi^{5}=F_2^{(3)}+F_1^{(4)}  \\<br />
&#038;K_{21}^{(4)}\phi^{4}+K_{22}^{(4)}\phi^{5}=F_2^{(4)}<br />
\end{split}  \tag*{$(1.2-8)$}<br />
\end{equation}<br />
これでグローバルな節点番号に対応したスカラーポテンシャルに対する連立方程式が得られました。<br />
行列でかくと次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
K_{11}^{(1)} &#038; K_{12}^{(1)} &#038; 0 &#038; 0 &#038; 0 \\<br />
K_{21}^{(1)} &#038; (K_{22}^{(1)}+K_{11}^{(2)}) &#038; K_{12}^{(2)} &#038; 0 &#038; 0 \\<br />
0 &#038; K_{21}^{(2)} &#038; (K_{22}^{(2)}+K_{11}^{(3)}) &#038; K_{12}^{(3)} &#038; 0 \\<br />
0 &#038; 0 &#038; K_{21}^{(3)} &#038; (K_{22}^{(3)}+K_{11}^{(4)}) &#038; K_{12}^{(4)} \\<br />
0 &#038; 0 &#038; 0 &#038; K_{21}^{(4)} &#038; K_{22}^{(4)}<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^{1} \\<br />
\phi^{2} \\<br />
\phi^{3} \\<br />
\phi^{4} \\<br />
\phi^{5}<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
F_1^{(1)} \\<br />
F_2^{(1)}+F_1^{(2)} \\<br />
F_2^{(2)}+F_1^{(3)} \\<br />
F_2^{(3)}+F_1^{(4)} \\<br />
F_2^{(4)}<br />
\end{bmatrix}  \tag*{$(1.2-9)$}<br />
\end{equation}<br />
この連立方程式を解けば節点におけるスカラーポテンシャルの値が分かりそれをもとに要素内の電場などが求まります。<br />
この方程式を見るとここに現れる行列の要素は要素行列や要素ベクトルから構成されていることが分かります。<br />
したがってこのようなグローバルな方程式を作るには、まず要素ごとの要素行列と要素ベクトルを求めておき、そのローカルな節点番号が対応するグローバルな節点に割り振ることによってこのような方程式を作成することが出来ます。<br />
ここで要素行列を具体的に求めておきます。<br />
補間関数に関する(１．２－１)式から、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{dN_1}{dx}=-\frac{1}{x_{i+1}-x_i}  \\<br />
&#038;\frac{dN_2}{dx}=+\frac{1}{x_{i+1}-x_i}<br />
\end{split}  \notag<br />
\end{equation}<br />
ですから、要素内で誘電率が一定であれば(１．２－６)式の要素行列の積分内は一定値となり、$\Delta x=x_{i+1}-x_i$ とかけば次のようになります。<br />
\begin{equation}<br />
K_{\alpha\beta}=<br />
\begin{bmatrix}<br />
\frac{\epsilon}{\Delta x} &#038; -\frac{\epsilon}{\Delta x} \\<br />
-\frac{\epsilon}{\Delta x} &#038; \frac{\epsilon}{\Delta x}<br />
\end{bmatrix}  \tag*{$(1.2-10)$}<br />
\end{equation}<br />
また要素内で電荷密度が一定とすれば要素ベクトルは、<br />
\begin{equation}<br />
F_\alpha=<br />
\begin{bmatrix}<br />
\frac{\rho}{2}\Delta x  \\<br />
\frac{\rho}{2}\Delta x<br />
\end{bmatrix}  \tag*{$(1.2-11)$}<br />
\end{equation}<br />
です。これをみると要素内の電荷量 $\rho\Delta x$ を二つの節点に割り振った形になっています。<br />
解析領域を４分割した先の例では誘電率と電荷密度を一定とすれば、(１．２－９)式は次のようになります。<br />
\begin{equation}<br />
\frac{\epsilon}{\Delta x}<br />
\begin{bmatrix}<br />
1 &#038; -1 &#038; 0 &#038; 0 &#038; 0 \\<br />
-1 &#038; 2 &#038; -1 &#038; 0 &#038; 0 \\<br />
0 &#038; -1 &#038; 2 &#038; -1 &#038; 0 \\<br />
0 &#038; 0 &#038; -1 &#038; 2 &#038; -1 \\<br />
0 &#038; 0 &#038; 0 &#038; -1 &#038; 1<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^{1} \\<br />
\phi^{2} \\<br />
\phi^{3} \\<br />
\phi^{4} \\<br />
\phi^{5}<br />
\end{bmatrix}<br />
=\frac{\rho}{2}\Delta x<br />
\begin{bmatrix}<br />
1 \\<br />
2 \\<br />
2 \\<br />
2 \\<br />
1<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
解析領域を $[0,1]$ としたときの解析解は(１．１－１０)式ですが、この場合の境界条件は、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;E=-\frac{d\phi}{dx}=0 \hspace{10mm} (x=0)  \\<br />
&#038;\phi=0 \hspace{32mm} (x=1)<br />
\end{split}  \notag<br />
\end{equation}<br />
ですが最初の条件は境界積分を入れない場合自動的に満たしているので、ポテンシャルに関する条件、<br />
\begin{equation}<br />
\phi^{5}=0  \notag<br />
\end{equation}<br />
を考慮する必要があります。これは連立方程式を次のように縮小することで満たすことが出来ます。<br />
\begin{equation}<br />
\frac{\epsilon}{\Delta x}<br />
\begin{bmatrix}<br />
1 &#038; -1 &#038; 0 &#038; 0 \\<br />
-1 &#038; 2 &#038; -1 &#038; 0 \\<br />
0 &#038; -1 &#038; 2 &#038; -1 \\<br />
0 &#038; 0 &#038; -1 &#038; 2<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^{1} \\<br />
\phi^{2} \\<br />
\phi^{3} \\<br />
\phi^{4}<br />
\end{bmatrix}<br />
=\frac{\rho}{2}\Delta x<br />
\begin{bmatrix}<br />
1 \\<br />
2 \\<br />
2 \\<br />
2<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
これを解くと次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
\phi^{1} \\<br />
\phi^{2} \\<br />
\phi^{3} \\<br />
\phi^{4}<br />
\end{bmatrix}<br />
=\frac{\rho}{\epsilon}\frac{{\Delta x}^2}{2}<br />
\begin{bmatrix}<br />
16 \\<br />
15 \\<br />
12 \\<br />
7<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
ここで解析領域を区間 $[0,1]$ とすれば、$\Delta x=0.25$ スカラーポテンシャルの値は次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
\phi^{1} \\<br />
\phi^{2} \\<br />
\phi^{3} \\<br />
\phi^{4}<br />
\end{bmatrix}<br />
=\frac{\rho}{\epsilon}<br />
\begin{bmatrix}<br />
0.5 \\<br />
0.46875 \\<br />
0.375 \\<br />
0.21875<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
この結果は解析的に求めた(１．１－１０)式に一致します。<br />
下の図は解析計算の結果と有限要素法による計算結果との比較です。有限要素法の結果は黒丸で示しています。<br />
この結果は両者の結果が完全に一致していますが、通常は有限要素法の結果は数値計算に伴う誤差を含みます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_2_03.png" style="display: block; margin: auto;"><br />
ここまでは静電場に関する方程式（１．１－６）式を１次元の場合に限って話をしてきましたが、現実の問題ではこのようなケースはまれで、２次元や３次元の問題を解く必要に迫られます。したがって次に２次元の問題について考えます。<br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/891/">１.２　１次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.３　２次元問題</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/895/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Thu, 05 Aug 2021 07:53:03 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=895</guid>

					<description><![CDATA[<p>２次元の場合（１．１－６）式は次のようになります。 \begin{equation} \frac{\partial}{\partial x}\bigl(\epsilon\frac{\partial\phi}{\parti [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/895/">１.３　２次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code><!-- 図 140% に拡大・文中の式 $hoge$ の前後に半角スペースを挿入 --></code><br />
２次元の場合（１．１－６）式は次のようになります。<br />
\begin{equation}<br />
\frac{\partial}{\partial x}\bigl(\epsilon\frac{\partial\phi}{\partial x}\bigr)<br />
+\frac{\partial}{\partial y}\bigl(\epsilon\frac{\partial\phi}{\partial y}\bigr)=-\rho  \tag*{$(1.3-1)$}<br />
\end{equation}<br />
１次元の場合は解析領域は数直線上の区間でしたが、２次元の場合は平面上の閉じた領域となります。<br />
１次元のときと同様にこの方程式に任意関数 $w(x,y)$ を両辺にかけて解析領域 $S$ で積分します。<br />
\begin{equation}<br />
\int_Sw(x,y)\bigl[\frac{\partial}{\partial x}\bigl(\epsilon\frac{\partial\phi}{\partial x}\bigr)<br />
+\frac{\partial}{\partial y}\bigl(\epsilon\frac{\partial\phi}{\partial y}\bigr)\bigr]dS=-\int_Sw(x,y)\rho dS  \tag*{$(1.3-2)$}<br />
\end{equation}<br />
ここで２次元の解析領域 $S$ での積分について説明します。下の図のようにこの領域 $S$ が長方形の場合は、被積分関数を $f(x,y)$ としたとき次のように積分できます。<br />
\begin{equation}<br />
\int_Sf(x,y)dS=\int_c^d\int_a^bf(x,y)dxdy  \notag<br />
\end{equation}<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_01.png" style="display: block; margin: auto;"><br />
ところが一般の２次元の解析領域は長方形と限らず下の図のように曲線で囲まれている場合があります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_02.png" style="display: block; margin: auto;"><br />
この場合は長方形の場合と違って積分範囲は積分変数によって変化します。上の図では $x$ を定めて $y$ 方向に積分する場合、積分範囲は領域の下の曲線 $y_1(x)$ から上の曲線 $y_2(x)$ となり次のように積分します。<br />
\begin{equation}<br />
\int_{y_1(x)}^{y_2(x)}f(x,y)dy  \notag<br />
\end{equation}<br />
これを $x$ について積分すればこの２次元領域 $S$ の積分となります。したがって、<br />
\begin{equation}<br />
\int_Sf(x,y)dS=\int_a^b\int_{y_1(x)}^{y_2(x)}f(x,y)dydx  \notag<br />
\end{equation}<br />
となります。<br />
さて、（１．３－２）式の左辺は部分積分とガウスの発散定理を使うと次のように変形できます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\int_S\bigl[\frac{\partial}{\partial x}\bigl(w(x,y)\epsilon\frac{\partial\phi}{\partial x}\bigr)<br />
+\frac{\partial}{\partial y}\bigl(w(x,y)\epsilon\frac{\partial\phi}{\partial y}\bigr)\bigr]dS<br />
-\int_S\bigl[\frac{\partial w}{\partial x}\epsilon\frac{\partial \phi}{\partial x}<br />
+\frac{\partial w}{\partial y}\epsilon\frac{\partial \phi}{\partial y}\bigr]dS  \\<br />
&#038;=\oint\bigl[\bigl(w(x,y)\epsilon\frac{\partial\phi}{\partial x}\bigr)n_x<br />
+\bigl(w(x,y)\epsilon\frac{\partial\phi}{\partial y}\bigr)n_y\bigr]dl<br />
-\int_S\bigl[\frac{\partial w}{\partial x}\epsilon\frac{\partial \phi}{\partial x}<br />
+\frac{\partial w}{\partial y}\epsilon\frac{\partial \phi}{\partial y}\bigr]dS  \\<br />
&#038;=\oint w(x,y)\epsilon(\boldsymbol{\nabla}\phi\cdot\boldsymbol{n})dl<br />
-\int_S\bigl(\frac{\partial w}{\partial x}\epsilon\frac{\partial \phi}{\partial x}<br />
+\frac{\partial w}{\partial y}\epsilon\frac{\partial \phi}{\partial y}\bigr)dS<br />
\end{split}  \notag<br />
\end{equation}<br />
この右辺第１項は解析領域 $S$ の境界についての周回積分で $\boldsymbol{n}$ はこの境界線に外向きにとった単位法線ベクトルです。<br />
境界上で電場の法線成分がゼロであったらこの積分は消えます。また、境界上でポテンシャルの値が定まっている場合もこの積分は考える必要がありません。今後これらの条件がみたされるとしてこの項は無視します。<br />
これより（１．３－２）式は次のようになります。<br />
\begin{equation}<br />
\int_S\bigl(\frac{\partial w}{\partial x}\epsilon\frac{\partial \phi}{\partial x}<br />
+\frac{\partial w}{\partial y}\epsilon\frac{\partial \phi}{\partial y}\bigr)dS<br />
=\int_Sw(x,y)\rho dS  \tag*{$(1.3-3)$}<br />
\end{equation}<br />
これを解くために解析領域を小領域つまり有限要素に分割し、要素内のポテンシャルは要素を構成する節点での値から内挿します。<br />
このように領域を分割したとき上の積分も要素ごとの積分の和として表わすことが出来ます。<br />
\begin{equation}<br />
\sum_n\int_{S_n}\bigl(\frac{\partial w}{\partial x}\epsilon\frac{\partial \phi}{\partial x}<br />
+\frac{\partial w}{\partial y}\epsilon\frac{\partial \phi}{\partial y}\bigr)dS<br />
=\sum_n\int_{S_n}w(x,y)\rho dS  \tag*{$(1.3-4)$}<br />
\end{equation}<br />
ここに $S_n$ は $n$ 番目の要素が占める領域です。<br />
１次元の場合要素は数直線上の区間で表現していましたが、２次元の場合要素の形状としてはいくつか考えられます。<br />
よく使われる要素としては三角形要素、四角形要素などがありますが、具体的な要素の表現は後で説明するとしてそれぞれの要素タイプにはそれに応じた補間関数があり要素内のポテンシャルや任意関数 $w(x,y)$ を次のように補間します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\phi(x,y)=\sum_\alpha N_\alpha(x,y)\phi^\alpha  \\<br />
&#038;w(x,y)=\sum_\alpha N_\alpha(x,y)w^\alpha<br />
\end{split}  \tag*{$(1.3-5)$}<br />
\end{equation}<br />
ここで $\alpha$ は要素を構成する要素ごとのローカルな節点番号で $N_\alpha$ はこの節点に対応する補間関数です。また和はこの節点の数だけについてとります。<br />
これを上の式に代入すると左辺と右辺は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\sum_n\sum_{\alpha\beta}w^{n\alpha}\int_{S_n}\bigl(\frac{\partial N_\alpha}{\partial x}\epsilon\frac{\partial N_\beta}{\partial x}<br />
+\frac{\partial N_\alpha}{\partial y}\epsilon\frac{\partial N_\beta}{\partial y}\bigr)dS\phi^{n\beta}  \\<br />
&#038;\sum_n\sum_\alpha w^{n\alpha}\int_{S_n}N_\alpha\rho dS<br />
\end{split}  \notag<br />
\end{equation}<br />
ここでポテンシャルや関数 $w$ の肩についている添字 $n\alpha$ などは $n$ 番目の要素の $\alpha$ 番目の節点を表しています。<br />
ここで次の要素行列と要素ベクトルを定義します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}^{(n)}=\int_{S_n}\bigl(\frac{\partial N_\alpha}{\partial x}\epsilon\frac{\partial N_\beta}{\partial x}<br />
+\frac{\partial N_\alpha}{\partial y}\epsilon\frac{\partial N_\beta}{\partial y}\bigr)dS  \\<br />
&#038;F_\alpha^{(n)}=\int_{S_n}N_\alpha\rho dS<br />
\end{split}  \tag*{$(1.3-6)$}<br />
\end{equation}<br />
これより(１．３－４)式は、<br />
\begin{equation}<br />
\sum_n\sum_{\alpha\beta}w^{n\alpha}K_{\alpha\beta}^{(n)}\phi^{n\beta}=\sum_n\sum_\alpha w^{n\alpha}F_\alpha^{(n)}  \notag<br />
\end{equation}<br />
となりますが関数 $w$ でまとめると次のようになります。<br />
\begin{equation}<br />
\sum_n\sum_{\alpha\beta}w^{n\alpha}\bigl(K_{\alpha\beta}^{(n)}\phi^{n\beta}-F_\alpha^{(n)}\bigr)=0   \tag*{$(1.3-7)$}<br />
\end{equation}<br />
先ほども言ったようにここで $w^{(n\alpha)}$ や $\phi^{(n\beta)}$ は $n$ 番目の要素のローカルな節点番号 $\alpha$、$\beta$ によって表現されているのですが、一つの節点が隣り合った要素で共有される場合この番号が異なっていても同じ節点である場合があります。<br />
そこでここで付けられた（要素番号、ローカルな節点番号)をグローバルな節点番号 $I$、$J$ などに書き換えてまとめなおすと上の式は次のようにかけます。<br />
\begin{equation}<br />
\sum_Iw^I(\sum_JK_{IJ}\phi^J-F_I)=0  \notag<br />
\end{equation}<br />
ここで $w^I$ は任意関数を離散化したものなので、どのような値であってもこの式が成立するためにはその係数がゼロである必要があります。<br />
これよりポテンシャルの節点値に対する次の連立方程式が得られます。<br />
\begin{equation}<br />
\sum_JK_{IJ}\phi^J=F_I \tag*{$(1.3-8)$}<br />
\end{equation}<br />
ここで出てきた行列やベクトルは節点数の数だけの次元を持っています。これらを要素行列、要素ベクトルに対して全体の係数行列、ベクトルとよぶことにします。<br />
１次元の場合は、まず要素ごとに要素行列や要素ベクトルを求めてからこれらを足しこむことによって全体の係数行列やベクトルを求めることが出来ました。<br />
２次元の場合もこのような方法で全体行列や全体ベクトルを求めることが出来ます。<br />
三角形要素を例に説明します。三角形要素は下の図に示すように３個の節点からできており要素内のポテンシャルは（１．３－５）式のように補間されます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_03.png" style="display: block; margin: auto;"><br />
この場合補間関数は次のように求めることができます。まず3点の節点のポテンシャル値によって決まるので一次関数として表すことができます。<br />
\begin{equation}<br />
\phi(x,y)=ax+by+c  \tag*{$(1.3-9)$}<br />
\end{equation}<br />
ここに、$a$、$b$、$c$ は定数であり、3点の節点 $(x_1,y_1)$、$(x_2,y_2)$、$(x_3,y_3)$ に対応するスカラーポテンシャルの値 $\phi^1$、$\phi^2$、$\phi^3$ から決めることができます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;ax_1+by_1+c=\phi^1  \\<br />
&#038;ax_2+by_2+c=\phi^2  \\<br />
&#038;ax_3+by_3+c=\phi^3<br />
\end{split}  \notag<br />
\end{equation}<br />
この連立方程式を解いて係数を求めると次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
a \\<br />
b \\<br />
c<br />
\end{bmatrix}<br />
=\frac{1}{\Delta}<br />
\begin{bmatrix}<br />
y_2-y_3 &#038; y_3-y_1 &#038; y_1-y_2 \\<br />
x_3-x_2 &#038; x_1-x_3 &#038; x_2-x_1 \\<br />
x_2y_3-x_3y_2 &#038; x_3y_1-x_1y_3 &#038; x_1y_2-x_2y_1<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^1 \\<br />
\phi^2 \\<br />
\phi^3<br />
\end{bmatrix}  \tag*{$(1.3-10)$}<br />
\end{equation}<br />
\begin{equation}<br />
\Delta=(x_2y_3-x_3y_2)+(x_3y_1-x_1y_3)+(x_1y_2-x_2y_1)  \tag*{$(1.3-11)$}<br />
\end{equation}<br />
ここで、$x_2y_3-x_3y_2$、$x_3y_1-x_1y_3$、$x_1y_2-x_2y_1$ はすこし複雑な形をしているように思われますが次のような幾何学的な意味を持っています。<br />
各節点の位置ベクトル、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\boldsymbol{r}_1=(x_1,y_1)  \\<br />
&#038;\boldsymbol{r}_2=(x_2,y_2)  \\<br />
&#038;\boldsymbol{r}_3=(x_3,y_3)<br />
\end{split} \notag<br />
\end{equation}<br />
とおけば、上に示したものはこれら位置ベクトルどうしの外積の $z$ 成分であることが分かります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;[\boldsymbol{r}_2\times\boldsymbol{r}_3]_z=x_2y_3-x_3y_2  \\<br />
&#038;[\boldsymbol{r}_3\times\boldsymbol{r}_1]_z=x_3y_1-x_1y_3  \\<br />
&#038;[\boldsymbol{r}_1\times\boldsymbol{r}_2]_z=x_1y_2-x_2y_1<br />
\end{split} \tag*{$(1.3-12)$}<br />
\end{equation}<br />
これらの関係を下の図に示しました。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_04.png" style="display: block; margin: auto;"><br />
この図から $[\boldsymbol{r}_2\times\boldsymbol{r}_3]_z$ は原点 $o$ から作られる三角形 $o23$ の面積の２倍であることが分かります。<br />
同様にして、$[\boldsymbol{r}_3\times\boldsymbol{r}_1]$ は三角形 $o31$ の面積の２倍、$[\boldsymbol{r}_1\times\boldsymbol{r}_2]_z$ は三角形$o12$の面積の２倍となります。<br />
この図では、最初の二つの外積が正であるのに対して最後の $[\boldsymbol{r}_1\times\boldsymbol{r}_2]_z$ は負となります。<br />
したがってこれらの和が結果的にこの要素である三角形 $123$ の面積 $S$ の２倍であることになります。<br />
\begin{equation}<br />
\Delta=2S  \tag*{$(1.3-13)$}<br />
\end{equation}<br />
ここで求まった係数を使うと(１．３－９)式の要素内のポテンシャルは次のように補間されます。<br />
\begin{equation}<br />
\begin{split}<br />
\phi(x,y)&#038;=\frac{1}{\Delta}\bigl((y_2-y_3)x+(x_3-x_2)y+x_2y_3-x_3y_2\bigr)\phi^1  \\<br />
         &#038;+\frac{1}{\Delta}\bigl((y_3-y_1)x+(x_1-x_3)y+x_3y_1-x_1y_3\bigr)\phi^2  \\<br />
         &#038;+\frac{1}{\Delta}\bigl((y_1-y_2)x+(x_2-x_1)y+x_1y_2-x_2y_1\bigr)\phi^3  \\<br />
         &#038;=\frac{1}{\Delta}\bigl((x_2-x)(y_3-y)-(x_3-x)(y_2-y)\bigr)\phi^1  \\<br />
         &#038;+\frac{1}{\Delta}\bigl((x_3-x)(y_1-y)-(x_1-x)(y_3-y)\bigr)\phi^2  \\<br />
         &#038;+\frac{1}{\Delta}\bigl((x_1-x)(y_2-y)-(x_2-x)(y_1-y)\bigr)\phi^3<br />
\end{split}  \notag<br />
\end{equation}<br />
これより補間関数は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(x,y)=\frac{1}{\Delta}\bigl((x_2-x)(y_3-y)-(x_3-x)(y_2-y)\bigr) \\<br />
&#038;N_2(x,y)=\frac{1}{\Delta}\bigl((x_3-x)(y_1-y)-(x_1-x)(y_3-y)\bigr) \\<br />
&#038;N_3(x,y)=\frac{1}{\Delta}\bigl((x_1-x)(y_2-y)-(x_2-x)(y_1-y)\bigr)<br />
\end{split} \tag*{$(1.3-14)$}<br />
\end{equation}<br />
ここで点 $(x,y)$ の位置ベクトルを $\boldsymbol{p}$ とおくと、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;[(\boldsymbol{r}_2-\boldsymbol{p})\times(\boldsymbol{r}_3-\boldsymbol{p})]_z=(x_2-x)(y_3-y)-(x_3-x)(y_2-y) \\<br />
&#038;[(\boldsymbol{r}_3-\boldsymbol{p})\times(\boldsymbol{r}_1-\boldsymbol{p})]_z=(x_3-x)(y_1-y)-(x_1-x)(y_3-y) \\<br />
&#038;[(\boldsymbol{r}_1-\boldsymbol{p})\times(\boldsymbol{r}_2-\boldsymbol{p})]_z=(x_1-x)(y_2-y)-(x_2-x)(y_1-y)<br />
\end{split}  \notag<br />
\end{equation}<br />
となりますが、これらは上の補間関数の右辺のカッコ内と同じ形をしています。<br />
これは下の図から点 $\boldsymbol{p}$ と各節点から構成される三角形の面積の２倍であることがわかります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_05.png" style="display: block; margin: auto;"><br />
これより三角形要素の補間関数は次のようにかくことが出来ます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(x,y)=\frac{1}{2S}[(\boldsymbol{r}_2-\boldsymbol{p})\times(\boldsymbol{r}_3-\boldsymbol{p})]_z=\frac{S_1}{S} \\<br />
&#038;N_2(x,y)=\frac{1}{2S}[(\boldsymbol{r}_3-\boldsymbol{p})\times(\boldsymbol{r}_1-\boldsymbol{p})]_z=\frac{S_2}{S} \\<br />
&#038;N_3(x,y)=\frac{1}{2S}[(\boldsymbol{r}_1-\boldsymbol{p})\times(\boldsymbol{r}_2-\boldsymbol{p})]_z=\frac{S_3}{S}<br />
\end{split} \tag*{$(1.3-15)$}<br />
\end{equation}<br />
ここで三角形の面積 $S_1$、$S_2$、$S_3$ を変数とみて面積座標とよぶことがあります。<br />
例えば、点 $\boldsymbol{p}$ が節点 $1$ に一致した場合は $N_1=1$ となり他はゼロとなります。<br />
三角形要素の補間関数が求まったので(１．３－６)式の要素行列と要素ベクトルを計算することが出来ます。<br />
まず補間関数の微分は、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial N_1}{\partial x}=\frac{1}{2S}(y_2-y_3) \hspace{10mm}<br />
\frac{\partial N_2}{\partial x}=\frac{1}{2S}(y_3-y_1) \hspace{10mm}<br />
\frac{\partial N_3}{\partial x}=\frac{1}{2S}(y_1-y_2)  \\<br />
&#038;\frac{\partial N_1}{\partial y}=-\frac{1}{2S}(x_2-x_3) \hspace{7mm}<br />
\frac{\partial N_2}{\partial y}=-\frac{1}{2S}(x_3-x_1) \hspace{7mm}<br />
\frac{\partial N_3}{\partial y}=-\frac{1}{2S}(x_1-x_2)<br />
\end{split}  \tag*{$(1.3-16)$}<br />
\end{equation}<br />
となります。これを使うと要素内で誘電率が一定とすれば要素行列は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}=\frac{\epsilon}{4S}\bigl[(y_2-y_3)^2+(x_2-x_3)^2\bigr]  \\<br />
&#038;K_{12}=K_{21}=\frac{\epsilon}{4S}\bigl[(y_2-y_3)(y_3-y_1)+(x_2-x_3)(x_3-x_1)\bigr]  \\<br />
&#038;K_{13}=K_{31}=\frac{\epsilon}{4S}\bigl[(y_2-y_3)(y_1-y_2)+(x_2-x_3)(x_1-x_2)\bigr]  \\<br />
&#038;K_{22}=\frac{\epsilon}{4S}\bigl[(y_3-y_1)^2+(x_3-x_1)^2\bigr]  \\<br />
&#038;K_{23}=K_{32}=\frac{\epsilon}{4S}\bigl[(y_3-y_1)(y_1-y_2)+(x_3-x_1)(x_1-x_2)\bigr]  \\<br />
&#038;K_{33}=\frac{\epsilon}{4S}\bigl[(y_1-y_2)^2+(x_1-x_2)^2\bigr]<br />
\end{split}  \tag*{$(1.3-17)$}<br />
\end{equation}<br />
次に行列ベクトルですが、（１．３－６）式より要素内で電荷密度が一定とすれば、<br />
\begin{equation}<br />
F_\alpha=\rho\int N_\alpha dS=\rho\int\frac{S_\alpha(x,y)}{S}dS  \notag<br />
\end{equation}<br />
となります。ここで要素の面積 $S$ は一定なのでこれを計算するには次の積分を行う必要があります。<br />
\begin{equation}<br />
\int S_\alpha(x,y)dS  \notag<br />
\end{equation}<br />
具体的な計算を行うためにここでは $S_1$ の積分を行います。積分を行うとき、座標系はどのようにとってもよいので、ここでは節点１の対辺と垂直になる方向を $x$ 軸にとります。そうすると上の積分は、<br />
\begin{equation}<br />
\int_{x_1}^{x_2}\Bigl(\int_{y_a(x)}^{y_b(x)}S_1(x,y)dy\Bigr)dx  \notag<br />
\end{equation}<br />
となります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_06.png" style="display: block; margin: auto;"><br />
$y$ での積分は図の点 $p$ を $x$ を固定して $y_a$ から $y_b$ まで動かせて行います。このとき $S_1(x,y)$ は高さが一定の三角形の面積なので一定の値となり次のようにかけます。<br />
\begin{equation}<br />
S_1(x,y)=\frac{1}{2}(y_3-y_2)(x_2-x)  \notag<br />
\end{equation}<br />
したがってこの $y$ での積分はこれに、<br />
\begin{equation}<br />
y_b-y_a=(y_3-y_2)\frac{x-x_1}{x_2-x_1}  \notag<br />
\end{equation}<br />
をかけたものとなります。<br />
\begin{equation}<br />
\begin{split}<br />
\int_{y_a(x)}^{y_b(x)}S_1(x,y)dy&#038;=\frac{1}{2}(y_3-y_2)(x2-x)\times(y_3-y_2)\frac{x-x_1}{x_2-x_1}  \\<br />
&#038;=-\frac{1}{2}\frac{(y_3-y_2)^2}{x_2-x_1}(x-x_1)(x-x_2)<br />
\end{split} \notag<br />
\end{equation}<br />
したがって、<br />
\begin{equation}<br />
\begin{split}<br />
\int S_1dS&#038;=-\frac{1}{2}\frac{(y_3-y_2)^2}{x_2-x_1}\int_{x_1}^{x_2}(x-x_1)(x-x_2)dx \\<br />
&#038;=-\frac{1}{2}\frac{(y_3-y_2)^2}{x_2-x_1}\Bigl[\frac{1}{3}x^3-\frac{1}{2}(x_1+x_2)x^2+x_1x_2x\Bigr]_{x_1}^{x_2}  \\<br />
&#038;=-\frac{1}{2}(y_3-y_2)^2\bigl\{\frac{1}{3}({x_1}^2+x_1x_2+{x_2}^2)-\frac{1}{2}(x_1+x_2)^2+x_1x_2\bigr\}  \\<br />
&#038;=\frac{1}{12}(y_3-y_2)^2(x_2-x_1)^2<br />
\end{split}  \notag<br />
\end{equation}<br />
ですが、<br />
\begin{equation}<br />
S=\frac{1}{2}(y_3-y_2)(x_2-x_1)  \notag<br />
\end{equation}<br />
なので次のようになります。<br />
\begin{equation}<br />
\int S_1dS=\frac{1}{3}S^2  \notag<br />
\end{equation}<br />
これより、<br />
\begin{equation}<br />
F_1=\rho\frac{1}{3}S  \notag<br />
\end{equation}<br />
となります。他の２節点に対しても同じようにしてこれと同じ結果が得られます。<br />
したがって要素ベクトルは次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;F_1=\frac{\rho}{3}S  \\<br />
&#038;F_2=\frac{\rho}{3}S  \\<br />
&#038;F_3=\frac{\rho}{3}S<br />
\end{split}  \tag*{$(1.3-18)$}<br />
\end{equation}<br />
簡単な例として一片の長さが $a$ の正方形領域に一定の電荷密度 $\rho$ が分布している場合を考えます。<br />
境界条件としては図のように座標軸上でポテンシャル $\phi$ がゼロであり他の境界では電場の法線成分がゼロとします。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_07.png" style="display: block; margin: auto;"><br />
この領域を下の図のように１８個の要素に分割します。節点数は１６になります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_08.png" style="display: block; margin: auto;"><br />
図を見てわかるように要素番号が奇数の要素はすべて同じ形状であり、偶数の要素もすべて同じ形をしています。<br />
要素行列は（１．３－１７）式からわかるように座標の差だけによって決まるので同じ形状の要素の要素行列は同じになります。<br />
これらのローカルな節点番号を下の図のようにつけます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_09.png" style="display: block; margin: auto;"><br />
これに基づいて要素行列を計算すると、まず奇数番号の要素の場合は、$S=(a/3)^2/2$ なので、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=\frac{\epsilon}{2}  \\<br />
&#038;K_{12}=K_{21}=0  \\<br />
&#038;K_{13}=K_{31}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=-\frac{\epsilon}{2}  \\<br />
&#038;K_{22}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=\frac{\epsilon}{2}  \\<br />
&#038;K_{23}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=-\frac{\epsilon}{2}  \\<br />
&#038;K_{33}=2\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=2\frac{\epsilon}{2}<br />
\end{split}  \notag<br />
\end{equation}<br />
となるので、まとめてかくと次のようになります。<br />
\begin{equation}<br />
K=\frac{\epsilon}{2}<br />
\begin{bmatrix}<br />
 1 &#038;  0 &#038; -1 \\<br />
 0 &#038;  1 &#038; -1 \\<br />
-1 &#038; -1 &#038;  2<br />
\end{bmatrix}  \tag*{$(1.3-19)$}<br />
\end{equation}<br />
偶数番号の要素については、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=\frac{\epsilon}{2}   \\<br />
&#038;K_{12}=K_{21}=-\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=-\frac{\epsilon}{2}   \\<br />
&#038;K_{13}=K_{31}=0  \\<br />
&#038;K_{22}=2\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=2\frac{\epsilon}{2}   \\<br />
&#038;K_{23}=-\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=-\frac{\epsilon}{2}   \\<br />
&#038;K_{33}=\frac{\epsilon}{4S}\bigl(\frac{a}{3})^2=\frac{\epsilon}{2}<br />
\end{split}  \notag<br />
\end{equation}<br />
なので、<br />
\begin{equation}<br />
K=\frac{\epsilon}{2}<br />
\begin{bmatrix}<br />
 1 &#038; -1 &#038;  0 \\<br />
-1 &#038;  2 &#038; -1 \\<br />
 0 &#038; -1 &#038;  1<br />
\end{bmatrix}  \tag*{$(1.3-20)$}<br />
\end{equation}<br />
となります。<br />
要素行列は（１．３－１８）式より次のようになります。<br />
\begin{equation}<br />
F=\frac{\rho a^2}{54}<br />
\begin{bmatrix}<br />
1 \\<br />
1 \\<br />
1<br />
\end{bmatrix}  \tag*{$(1.3-21)$}<br />
\end{equation}<br />
要素行列と要素ベクトルが求まったのでつぎはこれから全体の係数行列とベクトルを求めます。<br />
要素番号 $1$ の場合ローカルな節点番号と節点番号とは次の関係にあります。<br />
\begin{equation}<br />
1\rightarrow 1 \hspace{10mm} 2\rightarrow 6 \hspace{10mm} 3\rightarrow 5  \notag<br />
\end{equation}<br />
これよりこの要素行列を $K^{(1)}_{ij}$ とかくと、全体の係数行列に対して次のように代入します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}=K^{(1)}_{11} \hspace{10mm} K_{16}=K^{(1)}_{12} \hspace{10mm} K_{15}=K^{(1)}_{13}  \\<br />
&#038;K_{61}=K^{(1)}_{21} \hspace{10mm} K_{66}=K^{(1)}_{22} \hspace{10mm} K_{65}=K^{(1)}_{23}  \\<br />
&#038;K_{56}=K^{(1)}_{31} \hspace{10mm} K_{56}=K^{(1)}_{32} \hspace{10mm} K_{55}=K^{(1)}_{33}<br />
\end{split}  \notag<br />
\end{equation}<br />
同様に、要素番号 $2$ の場合ローカルな節点番号と節点番号の関係は、<br />
\begin{equation}<br />
1\rightarrow 1 \hspace{10mm} 2\rightarrow 2 \hspace{10mm} 3\rightarrow 6  \notag<br />
\end{equation}<br />
となり、この要素行列と全体の係数行列に対して次のように代入します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{11}=K^{(2)}_{11} \hspace{10mm} K_{12}=K^{(2)}_{12} \hspace{10mm} K_{16}=K^{(2)}_{13}  \\<br />
&#038;K_{21}=K^{(2)}_{21} \hspace{10mm} K_{22}=K^{(2)}_{22} \hspace{10mm} K_{26}=K^{(2)}_{23}  \\<br />
&#038;K_{61}=K^{(2)}_{31} \hspace{10mm} K_{62}=K^{(2)}_{32} \hspace{10mm} K_{66}=K^{(2)}_{33}<br />
\end{split}  \notag<br />
\end{equation}<br />
全ての要素についての要素行列を求めて下の図のように全体の係数行列の対応する番号に足しこみます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_10.png" style="display: block; margin: auto;"><br />
この図では見やすくするため一部だけ表示しています。<br />
その結果次の係数行列が得られます。<br />
\begin{equation}<br />
K=\frac{\epsilon}{2}<br />
\begin{bmatrix}<br />
 2 &#038; -1 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
-1 &#038;  4 &#038; -1 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038; -1 &#038;  4 &#038; -1 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038; -1 &#038;  2 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
-1 &#038;  0 &#038;  0 &#038;  0 &#038;  4 &#038; -2 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  8 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  8 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038; -2 &#038;  4 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  4 &#038; -2 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  8 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  8 &#038; -2 &#038;  0 &#038;  0 &#038; -2 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038; -2 &#038;  4 &#038;  0 &#038;  0 &#038;  0 &#038; -1 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 &#038;  2 &#038; -1 &#038;  0 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038; -1 &#038;  4 &#038; -1 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038; -1 &#038;  4 &#038; -1 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038; -1 &#038;  2<br />
\end{bmatrix}<br />
\hspace{2mm} F=\frac{\rho a^2}{54}<br />
\begin{bmatrix}<br />
2 \\<br />
3 \\<br />
3 \\<br />
1 \\<br />
3 \\<br />
6 \\<br />
6 \\<br />
3 \\<br />
3 \\<br />
6 \\<br />
6 \\<br />
3 \\<br />
1 \\<br />
3 \\<br />
3 \\<br />
2<br />
\end{bmatrix}  \tag*{$(1.3-22)$}<br />
\end{equation}<br />
この係数行列を見るとまず対称行列、すなわち行番号と列番号を入れ替えても同じであることが分かります。<br />
\begin{equation}<br />
K_{ij}=K_{ji}  \notag<br />
\end{equation}<br />
またゼロでない行列要素が対角項の付近に帯状に分布しておりゼロが結構多いことが分かります。<br />
次に境界条件を考える必要があります。<br />
この問題では、ポテンシャルがゼロである境界と電場も法線成分がゼロである境界があります。<br />
ポテンシャルが指定されている境界条件はディレクレ境界条件または第１種境界条件とよばれます。<br />
また、電場の法線成分つまりポテンシャルの法線方向の勾配が指定される境界条件はノイマン境界条件または第２種境界条件とよんでいます。<br />
ノイマン境界条件は基礎方程式である(１．３－３)式を導く際、境界積分をゼロにしましたのでこの場合自動的に満たされています。<br />
ポテンシャルがゼロの節点番号は、$1$、$2$、$3$、$4$、$5$、$9$、$13$ ですから、<br />
\begin{equation}<br />
\phi_1=\phi_2=\phi_3=\phi_4=\phi_5=\phi_9=\phi_{13}=0  \notag<br />
\end{equation}<br />
です。この条件を考慮するためには連立方程式のこの番号に対する行と列を除いてやればよいことが分かっています。<br />
これに関しては連立方程式の拘束条件として改めて議論します。<br />
この番号の行と列を除いた連立方程式は次のようになります。<br />
\begin{equation}<br />
\frac{\epsilon}{2}<br />
\begin{bmatrix}<br />
 8 &#038; -2 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
-2 &#038;  8 &#038; -2 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  0 &#038;  0 \\<br />
 0 &#038; -2 &#038;  4 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038;  0 &#038;  0 \\<br />
-2 &#038;  0 &#038;  0 &#038;  8 &#038; -2 &#038;  0 &#038; -2 &#038;  0 &#038;  0 \\<br />
 0 &#038; -2 &#038;  0 &#038; -2 &#038;  8 &#038; -2 &#038;  0 &#038; -2 &#038;  0 \\<br />
 0 &#038;  0 &#038; -1 &#038;  0 &#038; -2 &#038;  4 &#038;  0 &#038;  0 &#038; -1 \\<br />
 0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038;  0 &#038;  4 &#038; -1 &#038;  0 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038; -2 &#038;  0 &#038; -1 &#038;  4 &#038; -1 \\<br />
 0 &#038;  0 &#038;  0 &#038;  0 &#038;  0 &#038; -1 &#038;  0 &#038; -1 &#038;  2<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi_6 \\<br />
\phi_7 \\<br />
\phi_8 \\<br />
\phi_{10} \\<br />
\phi_{11} \\<br />
\phi_{12} \\<br />
\phi_{14} \\<br />
\phi_{15} \\<br />
\phi_{16}<br />
\end{bmatrix}<br />
=\frac{\rho a^2}{54}<br />
\begin{bmatrix}<br />
6 \\<br />
6 \\<br />
3 \\<br />
6 \\<br />
6 \\<br />
3 \\<br />
3 \\<br />
3 \\<br />
2<br />
\end{bmatrix}  \tag*{$(1.3-23)$}<br />
\end{equation}<br />
ここで、<br />
\begin{equation}<br />
\frac{\rho a^2}{27\epsilon}=1  \tag*{$(1.3-24)$}<br />
\end{equation}<br />
としてこれを解くと結果は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\phi_{13}=0 \hspace{5mm} \phi_{14}=4.692308 \hspace{6mm} \phi_{15}=7.230769 \hspace{5mm} \phi_{16}=8.230769 \\<br />
&#038;\phi_{09}=0 \hspace{5mm} \phi_{10}=4.269231 \hspace{6mm} \phi_{11}=6.5 \hspace{19mm} \phi_{12}=7.230769 \\<br />
&#038;\phi_{05}=0 \hspace{5mm} \phi_{06}=2.884615 \hspace{6mm} \phi_{07}=4.269231 \hspace{5mm} \phi_{08}=4.692308 \\<br />
&#038;\phi_{01}=0 \hspace{5mm} \phi_{02}=0 \hspace{24mm} \phi_{03}=0 \hspace{24mm} \phi_{04}=0<br />
\end{split}  \tag*{$(1.3-25)$}<br />
\end{equation}<br />
要素分割図と対応できるように表示しています。<br />
(１．３－２４)式をみたさない場合は、これに(１．３－２４）式の左辺をかけたものがポテンシャルの値となります。<br />
これまで電場の２次元において三角形要素を使った有限要素法をかなり詳しく説明してきました。これによって電場の基礎方程式をどのように有限要素に分割し、ポテンシャルを節点の持つ有限個のポテンシャル値から要素内のポテンシャルを内挿し、そのポテンシャルが基礎方程式をみたすようにこれら節点におけるポテンシャルの値を求める連立方程式をどのように作成するのかということがかなり具体的にわかっていただけたと思います。<br />
２次元の要素分割に使う要素としては三角形要素だけではなく四角形要素もよく使われますので次にその話をします。<br />
有限要素法では場の方程式を解析する領域で有限要素に分割し、要素内で場を内挿して表現します。このとき電場のポテンシャルなどの場は連続に分布していると考えていますので、有限要素に分割したとき要素境界で不連続になることは避けなければなりません。<br />
したがって隣り合う要素が共有する境界で補間関数が連続となるようなものを使う必要があります。一次元の場合は境界は点となるのでそこで連続にすることは簡単でした。また今まで述べてきた三角形要素は一次の補間関数を使っていたので要素境界で不連続になることはありません。<br />
ところが四角形要素の場合一次より高次の補間関数となるので要素境界で連続となるとは限りません。<br />
まず境界で連続となる補間関数を持つ正方形要素から出発します。<br />
下の図のように四つの頂点に節点を置き番号を付けます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_11.png" style="display: block; margin: auto;"><br />
この正方形要素内の補間関数として次のようなものを考えます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(x,y)=\frac{1}{4}(1-x)(1-y)  \\<br />
&#038;N_2(x,y)=\frac{1}{4}(1+x)(1-y)  \\<br />
&#038;N_3(x,y)=\frac{1}{4}(1+x)(1+y)  \\<br />
&#038;N_4(x,y)=\frac{1}{4}(1-x)(1+y)  \\<br />
\end{split}   \tag*{$(1.3-26)$}<br />
\end{equation}<br />
この補間関数を使って要素内の点におけるポテンシャル $\phi$ などを次のように補間します。<br />
\begin{equation}<br />
\phi(x,y)=\sum_{\alpha=1}^4N_\alpha(x,y)\phi^\alpha  \tag*{$(1.3-27)$}<br />
\end{equation}<br />
この補間関数から補間する点が節点と一致したときはポテンシャルの値がその節点値となることが分かります。<br />
この要素は一片の長さが $2$ で中心が原点に位置しています。したがって要素がこれ以外の大きさや位置の場合はこの補間関数を使うことが出来ません。<br />
ただしこの正方形を平行移動したときの補間関数はすこしの修正で補間関数を作ることが出来ます。<br />
例えば $x$ 方向に $2$ だけ平行移動した場合は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_5(x,y)=\frac{1}{4}(3-x)(1-y)  \\<br />
&#038;N_6(x,y)=\frac{1}{4}(-1+x)(1-y)  \\<br />
&#038;N_7(x,y)=\frac{1}{4}(-1+x)(1+y)  \\<br />
&#038;N_8(x,y)=\frac{1}{4}(3-x)(1+y)  \\<br />
\end{split}   \notag<br />
\end{equation}<br />
ただし節点番号は変えています。この要素と元の要素とは節点番号 $2$ と $5$、$3$ と $8$ を共有しておりこの節点の乗る境界が接しています。<br />
したがってこの辺に乗る点 $(1,y)$ のポテンシャルは両要素で次のように補間されます。<br />
まず最初の要素では、<br />
\begin{equation}<br />
\phi(1,y)=\frac{1}{2}(1-y)\phi^2+\frac{1}{2}(1+y)\phi^3  \notag<br />
\end{equation}<br />
となり、次に平行移動した位置にある要素では次のようになります。<br />
\begin{equation}<br />
\phi(1,y)=\frac{1}{2}(1-y)\phi^5+\frac{1}{2}(1+y)\phi^8  \notag<br />
\end{equation}<br />
ここで $\phi^2$ と $\phi^5$、$\phi^3$ と $\phi^8$ は同じ節点でありそれぞれ同じ値なのでこれらの関数は全く等しくなり、要素境界での関数の連続性が成り立っていることが分かります。<br />
このように正方形要素は関数の連続性は満たされますが場所ごとに補間関数を変える必要があります。<br />
ところが補間をする場合問題なのは要素の節点と補間する点の相対的な位置関係であり、節点の座標自体はどこにあってもよいはずです。<br />
そこで、最初の要素から平行移動で移せる要素については、原点まで平行移動して補間すれば（１．３－２６）式の補間関数が使えることになります。<br />
ただし実際の節点の座標と区別するために要素中心を原点とする新しい座標系 $(r,s)$ を導入します。<br />
すると補間関数はこの座標を使って次のように表されます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(r,s)=\frac{1}{4}(1-r)(1-s)  \\<br />
&#038;N_2(r,s)=\frac{1}{4}(1+r)(1-s)  \\<br />
&#038;N_3(r,s)=\frac{1}{4}(1+r)(1+s)  \\<br />
&#038;N_4(r,s)=\frac{1}{4}(1-r)(1+s)  \\<br />
\end{split}   \tag*{$(1.3-28)$}<br />
\end{equation}<br />
この要素の中心座標を $(x_c,y_c)$ とすれば、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;r=x-x_c  \\<br />
&#038;s=y-y_c<br />
\end{split}  \notag<br />
\end{equation}<br />
の関係があります。これは座標変換ですのでもっと一般的に平行移動ばかりでなく回転を考えることが出来ます。<br />
回転を行っても最初の座標と変換した座標の関係が分かっていれば回転移動した要素に対しても同じ補間関数が使えます。<br />
回転角を $\theta$ とすれば変換は次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
r \\<br />
s<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
\mathrm{cos}\theta &#038; \mathrm{sin}\theta \\<br />
-\mathrm{sin}\theta &#038; \mathrm{cos}\theta<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
x-x_c \\<br />
y-y_c<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
ここまでは一辺の長さが $2$ の正方形の形は変えないような変換を考えましたが、大きさを変えるような変換も可能です。<br />
たとえば、<br />
\begin{equation}<br />
\begin{bmatrix}<br />
r \\<br />
s<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
\alpha &#038; 0 \\<br />
0 &#038; \beta<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
x-x_c \\<br />
y-y_c<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
です。もちろんこれらを組み合わせたことも考えられますのでいろんな方向を向いた大きさの異なる要素を扱うことが出来ます。<br />
ただしこれらの変換で移行する要素は長方形ということになります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_12.png" style="display: block; margin: auto;"><br />
このように原点を中心とした一辺の長さが $2$ の正方形に座標変換できれば(１．３－２６)式の補間関数が使えることが分かりました。<br />
それでは一般の四角形の要素に対してはどうでしょうか。例えば下の図の左の四角形要素を右の図のように正方形になるような変換が出来れば同じ補間関数が使えます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_13.png" style="display: block; margin: auto;"><br />
そこで考えられるのが要素内の座標を同じ補間関数を使って節点の座標から補間することです。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;x=\sum_\alpha N_\alpha(r,s)x^\alpha  \\<br />
&#038;y=\sum_\alpha N_\alpha(r,s)y^\alpha<br />
\end{split}  \tag*{$(1.3-29)$}<br />
\end{equation}<br />
ここで $(x^\alpha,y^\alpha)$ は節点 $\alpha$ の座標です。この補間式を、現在使っている座標 $(x.y)$ と右の図のあるような $(r,s)$ 座標との変換式と考えているのです。このような場合これらの補間関数は、要素の形状を表現するので形状関数とよばれます。<br />
実際にはこのように形状関数が必ずしも補間関数と一致する必要はないのですが、一致した形状関数を使うことが多いので今後これを使用します。<br />
このような要素、すなわち形状関数と補間関数が同じものを使用する場合をアイソパラメトリック要素とよんでいます。<br />
また、この形状関数で表される要素は座標を $(r,s)$ で表した場合、要素は右の図にあるように頂点が座標 $(\pm1,\pm1)$ を持つことになりますが、この座標系を標準座標とよんでいます。<br />
標準座標系を使って話をする場合、元の変数と異なるため微分や積分をするさい注意が必要です。要素行列や要素ベクトルを作成する場合は(１．３－６)式、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}^{(n)}=\int_{S_n}\bigl(\frac{\partial N_\alpha(r,s)}{\partial x}\epsilon\frac{\partial N_\beta(r,s)}{\partial x}<br />
+\frac{\partial N_\alpha(r,s)}{\partial y}\epsilon\frac{\partial N_\beta(r,s)}{\partial y}\bigr)dS  \\<br />
&#038;F_\alpha^{(n)}=\int_{S_n}N_\alpha(r,s)\rho dS<br />
\end{split}  \notag<br />
\end{equation}<br />
を計算する必要があります。ここでの表現は元の座標におけるものですが、補間関数は標準座標でかかれているので微分をとるときは次のように<br />
変数変換を行います。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial N_\alpha(r,s)}{\partial x}=\frac{\partial N_\alpha(r,s)}{\partial r}\frac{\partial r}{\partial x}<br />
+\frac{\partial N_\alpha(r,s)}{\partial s}\frac{\partial s}{\partial x}  \\<br />
&#038;\frac{\partial N_\alpha(r,s)}{\partial y}=\frac{\partial N_\alpha(r,s)}{\partial r}\frac{\partial r}{\partial y}<br />
+\frac{\partial N_\alpha(r,s)}{\partial s}\frac{\partial s}{\partial y}<br />
\end{split}  \tag*{$(1,3-30)$}<br />
\end{equation}<br />
補間関数の標準座標 $(r,s)$ での微分は(１．３－２８)式から次のように計算することが出来ます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial N_1}{\partial r}=-\frac{1}{4}(1-s) \hspace{10mm} \frac{\partial N_1}{\partial s}=-\frac{1}{4}(1-r)  \\<br />
&#038;\frac{\partial N_2}{\partial r}=+\frac{1}{4}(1-s) \hspace{10mm} \frac{\partial N_2}{\partial s}=-\frac{1}{4}(1+r)  \\<br />
&#038;\frac{\partial N_3}{\partial r}=+\frac{1}{4}(1+s) \hspace{10mm} \frac{\partial N_3}{\partial s}=+\frac{1}{4}(1+r)  \\<br />
&#038;\frac{\partial N_4}{\partial r}=-\frac{1}{4}(1+s) \hspace{10mm} \frac{\partial N_4}{\partial s}=+\frac{1}{4}(1-r)<br />
\end{split}  \tag*{$(1.3-31)$}<br />
\end{equation}<br />
標準座標の微分、例えば $\partial r/\partial x$ を行うには次のようにします。まず(１．３－２９)式の両辺を標準座標で微分します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial x}{\partial r}=\sum_\alpha\frac{\partial N_\alpha}{\partial r}x^\alpha \hspace{10mm}<br />
\frac{\partial x}{\partial s}=\sum_\alpha\frac{\partial N_\alpha}{\partial s}x^\alpha \\<br />
&#038;\frac{\partial y}{\partial r}=\sum_\alpha\frac{\partial N_\alpha}{\partial r}y^\alpha \hspace{10mm}<br />
\frac{\partial y}{\partial s}=\sum_\alpha\frac{\partial N_\alpha}{\partial s}y^\alpha \\<br />
\end{split}  \notag<br />
\end{equation}<br />
ところで、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial x}{\partial x}=\frac{\partial x}{\partial r}\frac{\partial r}{\partial x}<br />
+ \frac{\partial x}{\partial s}\frac{\partial s}{\partial x} = 1 \hspace{10mm}<br />
\frac{\partial x}{\partial y}=\frac{\partial x}{\partial r}\frac{\partial r}{\partial y}<br />
+ \frac{\partial x}{\partial s}\frac{\partial s}{\partial y} = 0 \\<br />
&#038;\frac{\partial y}{\partial x}=\frac{\partial y}{\partial r}\frac{\partial r}{\partial x}<br />
+ \frac{\partial y}{\partial s}\frac{\partial s}{\partial x} = 0 \hspace{10mm}<br />
\frac{\partial y}{\partial y}=\frac{\partial y}{\partial r}\frac{\partial r}{\partial y}<br />
+ \frac{\partial y}{\partial s}\frac{\partial s}{\partial y} = 1<br />
\end{split}  \notag<br />
\end{equation}<br />
です。この関係を行列でかくと次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
{\partial x}/{\partial r} &#038; {\partial x}/{\partial s} \\<br />
{\partial y}/{\partial r} &#038; {\partial y}/{\partial s}<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
{\partial r}/{\partial x} &#038; {\partial r}/{\partial y} \\<br />
{\partial s}/{\partial x} &#038; {\partial s}/{\partial y}<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
1 &#038; 0 \\<br />
0 &#038; 1<br />
\end{bmatrix}  \tag*{$(1.3-32)$}<br />
\end{equation}<br />
これより、標準座標 $(r,s)$ の座標 $(x,y)$ による微係数で作った行列は、座標 $(x,y)$ を標準座標で微分した行列の逆行列であることが分かります。<br />
そこで、<br />
\begin{equation}<br />
D=\frac{\partial x}{\partial r}\frac{\partial y}{\partial s}-\frac{\partial x}{\partial s}\frac{\partial y}{\partial r}  \tag*{$(1.3-33)$}<br />
\end{equation}<br />
とおけば、クラーメルの公式より、<br />
\begin{equation}<br />
\begin{bmatrix}<br />
{\partial x}/{\partial r} &#038; {\partial x}/{\partial s} \\<br />
{\partial y}/{\partial r} &#038; {\partial y}/{\partial s}<br />
\end{bmatrix}^{-1}<br />
=\frac{1}{D}<br />
\begin{bmatrix}<br />
{\partial y}/{\partial s} &#038; -{\partial x}/{\partial s} \\<br />
-{\partial y}/{\partial r} &#038; {\partial x}/{\partial r}<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
となるので、標準座標の微分は次のようにかけます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial r}{\partial x}=\frac{1}{D}\frac{\partial y}{\partial s}=\frac{1}{D}\sum_\alpha\frac{\partial N_\alpha}{\partial s}y^\alpha  \\<br />
&#038;\frac{\partial r}{\partial y}=-\frac{1}{D}\frac{\partial x}{\partial s}=-\frac{1}{D}\sum_\alpha\frac{\partial N_\alpha}{\partial s}x^\alpha  \\<br />
&#038;\frac{\partial s}{\partial x}=-\frac{1}{D}\frac{\partial y}{\partial r}=-\frac{1}{D}\sum_\alpha\frac{\partial N_\alpha}{\partial r}y^\alpha  \\<br />
&#038;\frac{\partial s}{\partial y}=\frac{1}{D}\frac{\partial x}{\partial r}=\frac{1}{D}\sum_\alpha\frac{\partial N_\alpha}{\partial r}x^\alpha<br />
\end{split}  \tag*{$(1.3-34)$}<br />
\end{equation}<br />
これによって要素行列を求めるための(１．３－６)式の被積分関数を標準座標でかきかえることが出来ました。<br />
次に標準座標での積分ですが、一般に積分は座標変換によって次のようになります。被積分関数はどちらの座標でも同じなので同じ位置で、<br />
\begin{equation}<br />
f(x,y)=F(r,s)  \notag<br />
\end{equation}<br />
としたとき、<br />
\begin{equation}<br />
\int_Sf(x,y)dS=\int_{-1}^1\int_{-1}^1F(r,s)\Bigl|\frac{\partial(x,y)}{\partial(r,s)}\Bigr|drds  \tag*{$(1.3-35)$}<br />
\end{equation}<br />
となります。ここに、<br />
\begin{equation}<br />
\frac{\partial(x,y)}{\partial(r,s)}=det<br />
\begin{bmatrix}<br />
{\partial x}/{\partial r} &#038; {\partial x}/{\partial s} \\<br />
{\partial y}/{\partial r} &#038; {\partial y}/{\partial s}<br />
\end{bmatrix}  \tag*{$(1.3-36)$}<br />
\end{equation}<br />
は前に出てきた変換行列の行列式で、ヤコビアンといいます。<br />
さて次に必要なことは(１．３－６)式の積分を実行することですが、被積分関数を標準座標にかきなおしたとはいえかなり複雑な形をしています。<br />
また、誘電率などが要素内部で変化しているような場合この積分を計算することは難しくなります。<br />
そこで、数値積分を行うことになるのですが、ここで少し数値積分について簡単に説明しておきます。<br />
まず１次元積分として次の積分を考えます。<br />
\begin{equation}<br />
I=\int_a^bf(x)dx  \tag*{$(1.3-37)$}<br />
\end{equation}<br />
まずこの積分を近似的に解くために積分領域である区間 $[a,b]$ をいくつかの小区間に等分割します。分割された区間長を $h$ とします。<br />
分割された $i$ 番目の区間 $[x_i,x_{i+1}]$ で関数値が一定値 $f(x_i)$ で近似する場合この積分は次のようにかけます。<br />
\begin{equation}<br />
\int_a^bf(x)dx\simeq\sum_{i=1}^nf(x_i)h  \tag*{$(1.3-38)$}<br />
\end{equation}<br />
ここに $n$ は領域の分割数です。下の図の左にはこの近似の図を示しています。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_14.png" style="display: block; margin: auto;"><br />
図から分かるように分割数が粗いとこの方法では誤差が大きくなります。<br />
そこで図の右側に示したように分割された区間 $[x_i,x_{i+1}]$ で関数を線形補間して積分を近似します。<br />
\begin{equation}<br />
\int_{x_i}^{x_{i+1}}f(x)dx\simeq\frac{f(x_i)+f(x_{i+1})}{2}h  \notag<br />
\end{equation}<br />
この場合積分は次のようにかけます。<br />
\begin{equation}<br />
\int_a^bf(x)dx\simeq \frac{1}{2}f(x_1)h+\sum_{i=2}^{n-1}f(x_i)h+\frac{1}{2}f(x_n)h  \tag*{$(1.3-39)$}<br />
\end{equation}<br />
図を見るとこの近似の方がずいぶん精度が良くなるように思われますがこの式と(１．３－３８)式を比べると区間両端の関数値の扱いだけが異なっているだけです。<br />
この二つの場合分割された区間の両端の関数値を使ってこの区間の積分を表現しています。<br />
もっと精度を上げるために関数をもっと高次の関数で近似するために複数個の区間の節点数値を使うという方法があります。<br />
ここでは一つの区間内の複数の点を使ってできるだけ精度を上げる方法を考えます。<br />
区間 $[x_i,x_{i+1}]$ における積分を次のように近似します。<br />
\begin{equation}<br />
\int_{x_i}^{x_{i+1}}f(x)dx\simeq\sum_gf(x_g)w_g  \notag<br />
\end{equation}<br />
ここで $x_g$ は区間の中でいくつかの点を選び、誤差を最小にするように決まる$g$番目の座標であり、$w_g$ はその時の関数値にかける重みです。<br />
ただこのままでは、これらの点の座標は区間の取り方によって変わるので、積分する区間が $[-1,1]$ になるように変数変換をします。<br />
この場合は次のようになります。<br />
\begin{equation}<br />
\int_{-1}^1f(x)dx\simeq\sum_gf(x_g)w_g  \tag*{$(1.3-40)$}<br />
\end{equation}<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_15.png" style="display: block; margin: auto;"><br />
この近似法はガウスの求積法として知られており、点の数と数値積分は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;I_1=f(0)\times 2  \\<br />
&#038;I_2=f(-\sqrt{\frac{1}{3}})\times 1+f(+\sqrt{\frac{1}{3}})\times 1  \\<br />
&#038;I_3=f(-\sqrt{\frac{3}{5}})\times\frac{5}{9}+f(0)\times\frac{8}{9}+f(+\sqrt{\frac{3}{5}})\times\frac{5}{9}<br />
\end{split}  \tag*{$(1.3-41)$}<br />
\end{equation}<br />
この近似は２点でもかなりの精度が出ます。ちなみに関数が３次式以下であれば誤差無しで計算できます。<br />
それを示すために積分する関数を、<br />
\begin{equation}<br />
f(x)=ax^3+bx^2+cx+d  \notag<br />
\end{equation}<br />
この積分は、<br />
\begin{equation}<br />
\int_{-1}^1(ax^3+bx^2+cx+d)dx=\bigl[\frac{1}{4}ax^4+\frac{1}{3}bx^3+\frac{1}{2}cx^2+dx\bigr]_{-1}^1=\frac{2}{3}b+2d  \notag<br />
\end{equation}<br />
となりますが、ガウスの求積法では、<br />
\begin{equation}<br />
a\bigl(-\sqrt{\frac{1}{3}}\bigr)^3+b\bigl(-\sqrt{\frac{1}{3}}\bigr)^2+c\bigl(-\sqrt{\frac{1}{3}}\bigr)+d<br />
+a\bigl(\sqrt{\frac{1}{3}}\bigr)^3+b\bigl(\sqrt{\frac{1}{3}}\bigr)^2+c\bigl(\sqrt{\frac{1}{3}}\bigr)+d<br />
=\frac{2}{3}b+2d  \notag<br />
\end{equation}<br />
となり、両者は一致します。<br />
この方法を多重積分に拡張することは簡単です。２次元の場合は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
\int_{-1}^1\int_{-1}^1f(x,y)dxdy&#038;=\int_{-1}^1\bigl\{\int_{-1}^1f(x,y)dx\bigr\}dy  \\<br />
&#038;\simeq\int_{-1}^1\bigl\{\sum_if(x_i,y)w_i\bigr\}dy \\<br />
&#038;\simeq\sum_j\sum_if(x_i,y_j)w_iw_j<br />
\end{split}  \tag*{$(1.3-42)$}<br />
\end{equation}<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_16.png" style="display: block; margin: auto;"><br />
同様にして３次元の場合は、<br />
\begin{equation}<br />
\int_{-1}^1\int_{-1}^1\int_{-1}^1f(x,y,z)dxdydz\simeq\sum_k\sum_j\sum_if(x_i,y_j,z_k)w_iw_jw_k  \tag*{$(1.3-43)$}<br />
\end{equation}<br />
となります。<br />
さて、数値積分の方法が分かったのでこれで要素行列を求めることが出来ます。<br />
要素を標準座標で表現すると(１．３－６)式の要素行列と要素ベクトルは次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}^{(n)}=\int_{-1}^1\int_{-1}^1\bigl(\frac{\partial N_\alpha(r,s)}{\partial x}\epsilon\frac{\partial N_\beta(r,s)}{\partial x}<br />
+\frac{\partial N_\alpha(r,s)}{\partial y}\epsilon\frac{\partial N_\beta(r,s)}{\partial y}\bigr)\Bigl|\frac{\partial(x,y)}{\partial(r,s)}\Bigr|drds  \\<br />
&#038;F_\alpha^{(n)}=\int_{-1}^1\int_{-1}^1N_\alpha(r,s)\rho\Bigl|\frac{\partial(x,y)}{\partial(r,s)}\Bigr|drds<br />
\end{split}  \tag*{$(1.3-44)$}<br />
\end{equation}<br />
ただしこの被積分関数は(１．３－３０)式以降述べたようにすべて標準座標で表現することが出来ます。したがって今後、補間関数の微分 $\partial N_\alpha/\partial x$ や、<br />
ヤコビアンはこのようにかきますが標準座標で表現されているものとします。<br />
また、この積分領域は数値積分のところで説明したガウスの求積法の積分範囲と同じなのでそのまま適用することが出来ます。<br />
まず、要素行列は次のようになります。<br />
\begin{equation}<br />
K_{\alpha\beta}^{(n)}=\sum_i\sum_j\bigl(\frac{\partial N_\alpha(r_i,s_j)}{\partial x}\epsilon\frac{\partial N_\beta(r_i,s_j)}{\partial x}<br />
+\frac{\partial N_\alpha(r_i,s_j)}{\partial y}\epsilon\frac{\partial N_\beta(r_i,s_j)}{\partial y}\bigr)<br />
\Bigl|\frac{\partial(x,y)}{\partial(r,s)}\Bigr|_{(r_i,s_j)}w_{ij}  \tag*{$(1.3-45)$}<br />
\end{equation}<br />
ここでヤコビアンと重み $w_{ij}$ は積分点での値です。<br />
三角形要素の要素行列のときには誘電率 $\epsilon$ は要素内で一定としていましたが、数値積分を行う場合は積分点ごとに変えることもできます。<br />
これは誘電率が電場などによって変化する非線形誘電体を扱う場合必要になってきます。<br />
次に要素ベクトルは次のようになります。<br />
\begin{equation}<br />
F_\alpha^{(n)}=\sum_i\sum_jN_\alpha(r_i,s_j)\rho\Bigl|\frac{\partial(x,y)}{\partial(r,s)}\Bigr|_{(r_i,s_j)}w_{ij}  \tag*{$(1.3-46)$}<br />
\end{equation}<br />
ここでは電荷密度も誘電率と同じように要素内で場所ごとに変化してもかまいません。<br />
このようにしてすべての要素について要素行列と要素ベクトルができると、これから全体の係数行列とベクトルを構成することが出来ます。<br />
要素内部では節点についてローカルな番号 $\alpha$、$\beta$ を付けて表現してきたのですが、例えば要素番号 $n$ の $\alpha$ 番目の節点を $(n\alpha)$ などと表した節点はグローバルな節点番号を持っています。この対応が次のようになっているとします。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;ローカルな番号 \hspace{20mm} 節点番号  \\<br />
&#038;\hspace{10mm} (n\alpha) \hspace{10mm} \Longleftrightarrow \hspace{10mm} I  \\<br />
&#038;\hspace{10mm} (n\beta)  \hspace{10mm} \Longleftrightarrow \hspace{10mm} J<br />
\end{split}  \notag<br />
\end{equation}<br />
この場合要素番号 $n$ の要素行列と要素ベクトルは、全体の係数行列 $K_{IJ}$、ベクトルと次のように対応します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\hspace{5mm} 要素行列 \hspace{25mm} 係数行列  \\<br />
&#038;\hspace{10mm} K_{\alpha\beta}^{(n)} \hspace{10mm} \Longleftrightarrow \hspace{10mm} K_{IJ} \\<br />
&#038;\hspace{10mm} F_\alpha^{(n)} \hspace{10mm} \Longleftrightarrow \hspace{10mm} F_I<br />
\end{split}  \notag<br />
\end{equation}<br />
三角形要素のときの例としてあげた分割でも一つの節点が複数個の要素に共有されていることがあります。この場合上の対応は一対一ではなく多対一となり、係数行列の一つの行列要素 $K_{IJ}$ に対して複数個の要素行列が対応します。ですから係数行列の行列要素は対応する要素行列の行列要素の和となります。<br />
\begin{equation}<br />
K_{IJ}=K_{\alpha\beta}^{(n)}+K_{\gamma\delta}^{(m)}+\cdots  \tag*{$(1.3-47)$}<br />
\end{equation}<br />
ここで、$I$ に対して $(n\alpha)$、$(m\gamma)$ などが対応し、$J$ に対して $(n\beta)$、$(m\delta)$ などが対応しています。<br />
先の三角形要素の例を示したときはこのような要素行列から全体行列の作成を実際に行いましたが、要素数が多くなると大変な作業となります。<br />
このような作業はコンピュータプログラムにかけばずっと効率的に行うことが出来ます。<br />
手順をまとめると次のようになります。<br />
まず、要素の積分点 $(r_i,s_i)$ ごとの補間関数とその微分を求めます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_\alpha(r_i,s_i) \\<br />
&#038;\frac{\partial}{\partial r}N_\alpha(r_i,s_i) \hspace{5mm} \frac{\partial}{\partial s}N_\alpha(r_i,s_i)<br />
\end{split} \notag<br />
\end{equation}<br />
これより、<br />
\begin{equation}<br />
x=\sum_\alpha N_\alpha(r_i,s_i)x^\alpha \hspace{5mm} y=\sum_\alpha N_\alpha(r_i,s_i)y^\alpha \notag<br />
\end{equation}<br />
を使い変換行列、<br />
\begin{equation}<br />
\begin{bmatrix}<br />
{\partial x}/{\partial r} &#038; {\partial x}/{\partial s} \\<br />
{\partial y}/{\partial r} &#038; {\partial y}/{\partial s}<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
を求めます。これより(１．３－３６)式のヤコビアン、<br />
\begin{equation}<br />
\frac{\partial(x,y)}{\partial(r,s)}=det<br />
\begin{bmatrix}<br />
{\partial x}/{\partial r} &#038; {\partial x}/{\partial s} \\<br />
{\partial y}/{\partial r} &#038; {\partial y}/{\partial s}<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
と、次の逆行列を求めます。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
{\partial r}/{\partial x} &#038; {\partial r}/{\partial y} \\<br />
{\partial s}/{\partial x} &#038; {\partial s}/{\partial y}<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
次にこれを使って補間関数の勾配を(１．３－３０）式にしたがって計算します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial}{\partial x}N_\alpha(r_i,s_i)=\frac{\partial}{\partial r}N_\alpha(r_i,s_i)\frac{\partial r}{\partial x}<br />
+\frac{\partial}{\partial s}N_\alpha(r_i,s_i)\frac{\partial s}{\partial x}  \\<br />
&#038;\frac{\partial}{\partial y}N_\alpha(r_i,s_i)=\frac{\partial}{\partial r}N_\alpha(r_i,s_i)\frac{\partial r}{\partial y}<br />
+\frac{\partial}{\partial s}N_\alpha(r_i,s_i)\frac{\partial s}{\partial y}<br />
\end{split}  \notag<br />
\end{equation}<br />
これより要素行列の積分内の値、<br />
\begin{equation}<br />
\frac{\partial}{\partial x}N_\alpha(r_i,s_i)\epsilon\frac{\partial}{\partial x}N_\beta(r_i,s_i)<br />
+\frac{\partial}{\partial y}N_\alpha(r_i,s_i)\epsilon\frac{\partial}{\partial y}N_\beta(r_i,s_i)  \notag<br />
\end{equation}<br />
を計算し $k_{\alpha\beta}$ とします。<br />
これに先ほど求めたヤコビアンと数値積分のための重み $w_i$ をかけます。<br />
\begin{equation}<br />
k_{\alpha\beta}\frac{\partial(x,y)}{\partial(r,s)}w_i  \notag<br />
\end{equation}<br />
この値をすべての積分点で足しこみます。これでこの要素における要素行列 $K_{\alpha\beta}^{(n)}$ が求まりました。<br />
最後に $(n\alpha)$、$(n\beta)$ に対応する節点番号 $I$、$J$ の係数行列の行列要素にここで求まった要素行列の値を足しこみます。<br />
要素ベクトルも同様の方法で全体ベクトルの対応する成分に足しこみます。<br />
以上で全体の係数行列とベクトルが求まりましたので、次にこの連立方程式が境界条件をみたすように修正してやる必要があります。<br />
前にも言いましたように、ポテンシャルの法線方向の勾配つまり電場の法線成分がゼロの場合は自然境界条件となり何もしなくても自動的にこの条件が満たされます。またポテンシャルの値が決められているディレクレ境界では、対応する節点番号の行と列を縮小します。<br />
特にポテンシャルの値がゼロの場合は、対応する行と列を除くだけで境界条件が満たされます。<br />
ここで３角形要素のときと同じ例を使ってこの手順で計算を行ってみます。問題の図を下に再掲します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_17.png" style="display: block; margin: auto;"><br />
この領域を下の図のように９個の四角形要素に分割します。節点数は三角形要素のときと同じく１６になります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_18.png" style="display: block; margin: auto;"><br />
計算結果を以下に示します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\phi_{13}=0 \hspace{5mm} \phi_{14}=4.81585 \hspace{6mm} \phi_{15}=7.35435 \hspace{5mm} \phi_{16}=8.13784 \\<br />
&#038;\phi_{09}=0 \hspace{5mm} \phi_{10}=4.41488 \hspace{6mm} \phi_{11}=6.67133 \hspace{5mm} \phi_{12}=7.35435 \\<br />
&#038;\phi_{05}=0 \hspace{5mm} \phi_{06}=3.06264 \hspace{6mm} \phi_{07}=4.41488 \hspace{5mm} \phi_{08}=4.81585 \\<br />
&#038;\phi_{01}=0 \hspace{5mm} \phi_{02}=0 \hspace{22mm} \phi_{03}=0 \hspace{21mm} \phi_{04}=0<br />
\end{split}  \tag*{$(1.3-48)$}<br />
\end{equation}<br />
三角形要素の場合の結果(１．３－２５)式との比較を下の図に示します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_3_19.png" style="display: block; margin: auto;"><br />
ここに実線で示したものはこの領域を $30\times 30=900$ 要素の四角形要素に分割した場合の値です。この結果を見ると、一辺３分割という粗い分割にもかかわらずより精度の高い解析の結果に近い値が得られていることが分かります。<br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/895/">１.３　２次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.４　３次元問題</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/899/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 02:22:52 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=899</guid>

					<description><![CDATA[<p>３次元の場合、静電場の方程式は(１．１－６)式となります。今後座標の記号 $(x,y,z)$ を $(x_1,x_2,x_3)$ とかくことにします。 そうすればこの式は次のようにかけます。 \begin{equatio [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/899/">１.４　３次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code><!-- 図 140% に拡大・文中の式 $hoge$ の前後に半角スペースを挿入 --></code>３次元の場合、静電場の方程式は(１．１－６)式となります。今後座標の記号 $(x,y,z)$ を $(x_1,x_2,x_3)$ とかくことにします。<br />
そうすればこの式は次のようにかけます。<br />
\begin{equation}<br />
\sum_{i=1}^3\frac{\partial}{\partial x_i}\bigl(\epsilon\frac{\partial\phi}{\partial x_i}\bigr)=-\rho  \tag*{$(1.4-1)$}<br />
\end{equation}<br />
１次元や２次元で行ったのと同様に、両辺に任意関数 $w(x_1,x_2,x_3)$ をかけて考えている領域 $V$ で積分します。<br />
\begin{equation}<br />
\int_Vw(x_1,x_2,x_3)\sum_{i=1}^3\frac{\partial}{\partial x_i}\bigl(\epsilon\frac{\partial\phi}{\partial x_i}\bigr)dV<br />
=-\int_Vw(x_1,x_2,x_3)\rho dV  \tag*{$(1.4-2)$}<br />
\end{equation}<br />
ここで、<br />
\begin{equation}<br />
\sum_{i=1}^3\frac{\partial}{\partial x_i}\bigl(w\epsilon\frac{\partial\phi}{\partial x_i}\bigr)<br />
=\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}<br />
+w\sum_{i=1}^3\frac{\partial}{\partial x_i}\bigl(\epsilon\frac{\partial\phi}{\partial x_i}\bigr)  \notag<br />
\end{equation}<br />
に注意すると、上の式の左辺は次のように変形できます。<br />
\begin{equation}<br />
\int_V\sum_{i=1}^3\frac{\partial}{\partial x_i}\bigl(w\epsilon\frac{\partial\phi}{\partial x_i}\bigr)dV<br />
-\int_V\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}dV  \notag<br />
\end{equation}<br />
第一項はガウスの発散定理を使うと表面積分に変換できるので左辺は次のようになります。<br />
\begin{equation}<br />
\int_S\sum_{i=1}^3\bigl(w\epsilon\frac{\partial\phi}{\partial x_i}\bigr)n_idS<br />
-\int_V\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}dV  \notag<br />
\end{equation}<br />
ここに $S$ は領域 $V$ の境界面で、$\boldsymbol{n}$ はこの境界面に外向きにとった単位法線ベクトルです。２次元問題のときに説明したとおり、境界条件として電場の法線成分がゼロであるようなノイマン境界条件の場合、ポテンシャルの法線方向の勾配がゼロになるのでこの積分はゼロとなります。<br />
またポテンシャルの値が指定されているようなディレクレ境界条件の場合もこの項は考える必要がありません。<br />
したがってここではこの項は省略します。<br />
これより(１．４－２）式は次のようになります。<br />
\begin{equation}<br />
\int_V\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}dV<br />
=\int_Vw(x_1,x_2,x_3)\rho dV  \tag*{$(1.4-3)$}<br />
\end{equation}<br />
領域 $V$ を有限要素分割した場合はこの積分は領域ごとの積分の和として表わすことが出来るので、<br />
\begin{equation}<br />
\sum_n\int_{V_n}\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}dV<br />
=\sum_n\int_{V_n}w(x_1,x_2,x_3)\rho dV  \tag*{$(1.4-4)$}<br />
\end{equation}<br />
となります。ここに $V_n$ は $n$ 番目の要素領域です。<br />
１次元や２次元のときにやったのと同じように要素内でのポテンシャルや任意関数 $w$ を次のように補間します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\phi(\boldsymbol{x})=\sum_\alpha N_\alpha(\boldsymbol{x})\phi^\alpha  \\<br />
&#038;w(\boldsymbol{x})=\sum_\alpha N_\alpha(\boldsymbol{x})w^\alpha<br />
\end{split}  \tag*{$(1.4-5)$}<br />
\end{equation}<br />
ここで $\boldsymbol{x}$ は座標 $(x_1,x_2,x_3)$ の位置ベクトルです。<br />
ここから要素行列と要素ベクトルを作るのですが、基本的には１次元や２次元の場合と同じような手続きで行います。<br />
ここで表現を少し変えます。<br />
スカラー関数に作用する勾配ナブラ $\boldsymbol{\nabla}$ を使うと、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial w}{\partial x_i}=(\boldsymbol{\nabla}w)_i \\<br />
&#038;\epsilon\frac{\partial\phi}{\partial x_i}=\epsilon(\boldsymbol{\nabla}\phi)_i<br />
\end{split}  \notag<br />
\end{equation}<br />
とかけますが、これより(１．４－４)式の左辺の積分の中は次のようにかきかえることが出来ます。<br />
\begin{equation}<br />
\sum_{i=1}^3\frac{\partial w}{\partial x_i}\epsilon\frac{\partial\phi}{\partial x_i}<br />
=\boldsymbol{\nabla}w\cdot\epsilon\boldsymbol{\nabla}\phi  \notag<br />
\end{equation}<br />
この式に要素内で補間した任意関数 $w$ やポテンシャル(１．４－５)式を代入すると次のようになります。<br />
\begin{equation}<br />
\sum_\alpha\sum_\beta(\boldsymbol{\nabla}N_\alpha w^\alpha)\cdot(\epsilon\boldsymbol{\nabla}N_\beta\phi^\beta)<br />
=\sum_\alpha\sum_\beta w^\alpha\bigl(\boldsymbol{\nabla}N_\alpha\cdot\epsilon\boldsymbol{\nabla}N_\beta\bigr)\phi^\beta  \notag<br />
\end{equation}<br />
これを使うと $n$ 番目の要素の要素行列と要素ベクトルは、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}^{(n)}=\int_{V_n}\boldsymbol{\nabla}N_\alpha\cdot\epsilon\boldsymbol{\nabla}N_\beta dV  \\<br />
&#038;F_\alpha^{(n)}=\int_{V_n}N_\alpha\rho dV<br />
\end{split}  \tag*{$(1.4-6)$}<br />
\end{equation}<br />
と表すことが出来ます。<br />
要素行列と要素ベクトルから全体の係数行列とベクトルを作成する手順は２次元の場合詳しく説明しましたが、３次元の場合も全く同じです。<br />
ここからは３次元の要素と補間関数について話します。<br />
３次元の要素としてよく使われるのは四面体要素、五面体要素、そして六面体要素です。<br />
四面体要素は２次元の三角形要素のように要素内を四つの節点の値から一次補間を行いますので一番基本的な要素と考えることが出来ます。<br />
また、六面体要素は二次元の場合の四角形要素と同じようにアイソパラメトリック要素として使われることが多くその基本的な要素ということが出来ます。<br />
まず、四面体要素から始めます。四面体要素は図に示したように四つの節点から構成されておりこの節点におけるポテンシャルの値などから要素内の点における値を一次補間します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_4_01.png" style="display: block; margin: auto;"><br />
補間関数を求めるために要素内のポテンシャルを次のように一次関数で表します。<br />
\begin{equation}<br />
\phi(\boldsymbol{x})=ax+by+cz+d  \notag<br />
\end{equation}<br />
この係数を求めるために４節点の座標を $(x_1,y_1,z_1)$、$(x_2,y_2,z_2)$、$(x_3,y_3,z_3)$、$(x_4,y_4,z_4)$ とし対応するポテンシャルの値を、$\phi^1$、$\phi^2$、$\phi^3$、$\phi^4$ とすれば上の式から次の係数に対する連立方程式が得られます。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
x_1 &#038; y_1 &#038; z_1 &#038; 1 \\<br />
x_2 &#038; y_2 &#038; z_2 &#038; 1 \\<br />
x_3 &#038; y_3 &#038; z_3 &#038; 1 \\<br />
x_4 &#038; y_4 &#038; z_4 &#038; 1<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
a \\<br />
b \\<br />
c \\<br />
d<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
\phi^1  \\<br />
\phi^2  \\<br />
\phi^3  \\<br />
\phi^4<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
ここで左辺の行列の逆行列をクラーメルの公式を使って求めると次のようになります。<br />
\begin{equation}<br />
-\frac{1}{\Delta}<br />
\begin{bmatrix}<br />
h^1_x &#038; h^2_x &#038; h^3_x &#038; h^4_x \\<br />
h^1_y &#038; h^2_y &#038; h^3_y &#038; h^4_y \\<br />
h^1_z &#038; h^2_z &#038; h^3_z &#038; h^4_z \\<br />
-\Delta^1 &#038; -\Delta^2 &#038; -\Delta^3 &#038; -\Delta^4<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
ここで、$\boldsymbol{h}^1$、$\boldsymbol{h}^2$、$\boldsymbol{h}^3$、$\boldsymbol{h}^4$ は、節点の位置ベクトル $\boldsymbol{x}^\alpha$ から作られる次のようなベクトルです。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\boldsymbol{h}^1=\boldsymbol{x}^2\times\boldsymbol{x}^3+\boldsymbol{x}^3\times\boldsymbol{x}^4+\boldsymbol{x}^4\times\boldsymbol{x}^2  \\<br />
&#038;\boldsymbol{h}^2=\boldsymbol{x}^1\times\boldsymbol{x}^4+\boldsymbol{x}^4\times\boldsymbol{x}^3+\boldsymbol{x}^3\times\boldsymbol{x}^1  \\<br />
&#038;\boldsymbol{h}^3=\boldsymbol{x}^1\times\boldsymbol{x}^2+\boldsymbol{x}^2\times\boldsymbol{x}^4+\boldsymbol{x}^4\times\boldsymbol{x}^1  \\<br />
&#038;\boldsymbol{h}^4=\boldsymbol{x}^1\times\boldsymbol{x}^3+\boldsymbol{x}^3\times\boldsymbol{x}^2+\boldsymbol{x}^2\times\boldsymbol{x}^1<br />
\end{split}  \notag<br />
\end{equation}<br />
また、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\Delta^1=\boldsymbol{x}^2\cdot[\boldsymbol{x}^3\times\boldsymbol{x}^4]  \hspace{10mm} \Delta^2=\boldsymbol{x}^3\cdot[\boldsymbol{x}^1\times\boldsymbol{x}^4]  \\<br />
&#038;\Delta^3=\boldsymbol{x}^4\cdot[\boldsymbol{x}^1\times\boldsymbol{x}^2]  \hspace{10mm} \Delta^4=\boldsymbol{x}^1\cdot[\boldsymbol{x}^3\times\boldsymbol{x}^2]<br />
\end{split}  \notag<br />
\end{equation}<br />
であり、<br />
\begin{equation}<br />
\Delta=\Delta^1+\Delta^2+\Delta^3+\Delta^4  \notag<br />
\end{equation}<br />
は元の行列の行列式の符号を逆にしたものです。これより、係数 $a$、$b$、$c$、$d$ は次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
a \\<br />
b \\<br />
c \\<br />
d<br />
\end{bmatrix}<br />
=-\frac{1}{\Delta}<br />
\begin{bmatrix}<br />
h^1_x &#038; h^2_x &#038; h^3_x &#038; h^4_x \\<br />
h^1_y &#038; h^2_y &#038; h^3_y &#038; h^4_y \\<br />
h^1_z &#038; h^2_z &#038; h^3_z &#038; h^4_z \\<br />
-\Delta^1 &#038; -\Delta^2 &#038; -\Delta^3 &#038; -\Delta^4<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^1  \\<br />
\phi^2  \\<br />
\phi^3  \\<br />
\phi^4<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
これより、<br />
\begin{equation}<br />
\begin{split}<br />
\phi(\boldsymbol{x})&#038;=<br />
\begin{bmatrix}<br />
x &#038; y &#038; z &#038; 1<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
a \\<br />
b \\<br />
c \\<br />
d<br />
\end{bmatrix} \\<br />
&#038;=-\frac{1}{\Delta}<br />
\begin{bmatrix}<br />
\boldsymbol{h}^1\cdot\boldsymbol{x}-\Delta^1 &#038; \boldsymbol{h}^2\cdot\boldsymbol{x}-\Delta^2 &#038; \boldsymbol{h}^3\cdot\boldsymbol{x}-\Delta^3 &#038; \boldsymbol{h}^4\cdot\boldsymbol{x}-\Delta^4<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi^1  \\<br />
\phi^2  \\<br />
\phi^3  \\<br />
\phi^4<br />
\end{bmatrix}  \notag<br />
\end{split}<br />
\end{equation}<br />
となり、補間関数が次のように求まります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(\boldsymbol{x})=-\frac{1}{\Delta}(\boldsymbol{h}^1\cdot\boldsymbol{x}-\Delta^1)  \\<br />
&#038;N_2(\boldsymbol{x})=-\frac{1}{\Delta}(\boldsymbol{h}^2\cdot\boldsymbol{x}-\Delta^2)  \\<br />
&#038;N_3(\boldsymbol{x})=-\frac{1}{\Delta}(\boldsymbol{h}^3\cdot\boldsymbol{x}-\Delta^3)  \\<br />
&#038;N_4(\boldsymbol{x})=-\frac{1}{\Delta}(\boldsymbol{h}^4\cdot\boldsymbol{x}-\Delta^4)<br />
\end{split}  \notag<br />
\end{equation}<br />
もう少し物理的な意味が取れるように辺ベクトル、<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\boldsymbol{x}^{12}=\boldsymbol{x}^2-\boldsymbol{x}^1  \hspace{10mm} \boldsymbol{x}^{23}=\boldsymbol{x}^3-\boldsymbol{x}^2  \\<br />
&#038;\boldsymbol{x}^{13}=\boldsymbol{x}^3-\boldsymbol{x}^1  \hspace{10mm} \boldsymbol{x}^{14}=\boldsymbol{x}^4-\boldsymbol{x}^1  \\<br />
&#038;\boldsymbol{x}^{24}=\boldsymbol{x}^4-\boldsymbol{x}^2  \hspace{10mm} \boldsymbol{x}^{34}=\boldsymbol{x}^4-\boldsymbol{x}^3  \\<br />
\end{split}  \notag<br />
\end{equation}<br />
を使って変形すると次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(\boldsymbol{x})=\frac{1}{\Delta}[\boldsymbol{x}^{24}\times\boldsymbol{x}^{23}]\cdot(\boldsymbol{x}-\boldsymbol{x}^2)  \\<br />
&#038;N_2(\boldsymbol{x})=\frac{1}{\Delta}[\boldsymbol{x}^{13}\times\boldsymbol{x}^{14}]\cdot(\boldsymbol{x}-\boldsymbol{x}^3)  \\<br />
&#038;N_3(\boldsymbol{x})=\frac{1}{\Delta}[\boldsymbol{x}^{14}\times\boldsymbol{x}^{12}]\cdot(\boldsymbol{x}-\boldsymbol{x}^4)  \\<br />
&#038;N_4(\boldsymbol{x})=\frac{1}{\Delta}[\boldsymbol{x}^{12}\times\boldsymbol{x}^{13}]\cdot(\boldsymbol{x}-\boldsymbol{x}^1)<br />
\end{split}  \tag*{$(1.4-7)$}<br />
\end{equation}<br />
またこのベクトルを使うと、<br />
\begin{equation}<br />
\Delta = [\boldsymbol{x}^{12}\times\boldsymbol{x}^{13}]\cdot\boldsymbol{x}^{14}  \tag*{$(1.4-8)$}<br />
\end{equation}<br />
となりますが下の左の図から分かるように、これはこれらのベクトルを辺にもつ長方形の体積となります。したがって要素の体積 $V$ との関係は、<br />
\begin{equation}<br />
\Delta=6V  \notag<br />
\end{equation}<br />
です。同様にして、(１．４－７)式の補間関数で例えば、<br />
\begin{equation}<br />
N_2(\boldsymbol{x})=\frac{1}{\Delta}[\boldsymbol{x}^{13}\times\boldsymbol{x}^{14}]\cdot(\boldsymbol{x}-\boldsymbol{x}^3)  \notag<br />
\end{equation}<br />
の中の $[\boldsymbol{x}^{13}\times\boldsymbol{x}^{14}]\cdot(\boldsymbol{x}-\boldsymbol{x}^3)$ は右の図の太線で囲まれた四面体の体積 $V_2$ の６倍となります。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_4_02.png" style="display: block; margin: auto;"><br />
これより四面体要素の補間関数（１．４－７)式は次のようにかくことが出来ます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(\boldsymbol{x})=\frac{V_1}{V}  \\<br />
&#038;N_2(\boldsymbol{x})=\frac{V_2}{V}  \\<br />
&#038;N_3(\boldsymbol{x})=\frac{V_3}{V}  \\<br />
&#038;N_4(\boldsymbol{x})=\frac{V_4}{V}  \\<br />
\end{split}  \tag*{$(1.4-9)$}<br />
\end{equation}<br />
これは体積座標といい三角形要素の場合の面積座標に対応しており図形的にも分かりやすい表現になっています。<br />
次に六面体要素について述べます。３次元の電場解析において六面体要素は精度向上のために重要な要素でよく使われています。２次元の場合の四角形要素のように３次元解析においても六面体要素は標準座標に変換して、その座標系における補間関数を使います。<br />
下の図は、一般的な六面体要素の形状を示していますが、これを右の図のように一辺の長さが $2$ の頂点の座標が、$(\pm 1,\pm 1,\pm 1)$ の立方体になる座標系に変換します。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_4_03.png" style="display: block; margin: auto;"><br />
補間関数は次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;N_1(r,s,t)=\frac{1}{8}(1-r)(1-s)(1-t) \hspace{10mm} N_2(r,s,t)=\frac{1}{8}(1+r)(1-s)(1-t)  \\<br />
&#038;N_3(r,s,t)=\frac{1}{8}(1+r)(1+s)(1-t) \hspace{10mm} N_4(r,s,t)=\frac{1}{8}(1-r)(1+s)(1-t)  \\<br />
&#038;N_5(r,s,t)=\frac{1}{8}(1-r)(1-s)(1+t) \hspace{10mm} N_6(r,s,t)=\frac{1}{8}(1+r)(1-s)(1+t)  \\<br />
&#038;N_7(r,s,t)=\frac{1}{8}(1+r)(1+s)(1+t) \hspace{10mm} N_8(r,s,t)=\frac{1}{8}(1-r)(1+s)(1+t)<br />
\end{split}   \tag*{$(1.4-10)$}<br />
\end{equation}<br />
アイソパラメトリック要素の場合、標準座標への変換は節点座標の座標を使って要素内部の座標をこの補間関数を使って補間します。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;x=\sum_{\alpha=1}^8N_\alpha(r,s,t)x^\alpha  \\<br />
&#038;y=\sum_{\alpha=1}^8N_\alpha(r,s,t)y^\alpha  \\<br />
&#038;z=\sum_{\alpha=1}^8N_\alpha(r,s,t)z^\alpha<br />
\end{split}  \tag*{$(1.4-11)$}<br />
\end{equation}<br />
座標成分を系統的に扱うため座標 $(x,y,z)$ を $(x_1,x_2,x_3)$ とかいたように、標準座標 $(r,s,t)$ を $(\xi_1,\xi_2,\xi_3)$ とかきます。<br />
\begin{equation}<br />
x_i=\sum_\alpha N_\alpha(\boldsymbol{\xi})x_i^\alpha   \tag*{$(1.4-12)$}<br />
\end{equation}<br />
ここで標準座標をベクトル $\boldsymbol{\xi}$ で表しています。<br />
（１．４－６）式の要素行列を求めるには、この補間関数の勾配を求める必要がありますが、補間関数は標準座標の関数なので次のように変形します。<br />
\begin{equation}<br />
\frac{\partial N_\alpha(\boldsymbol{\xi})}{\partial x_i}=\sum_j\frac{\partial N_\alpha(\boldsymbol{\xi})}{\partial\xi_j}\frac{\partial\xi_j}{\partial x_i}<br />
 \tag*{$(1.4-13)$}<br />
\end{equation}<br />
ここで標準座標の微分を計算する必要があるのですが、次のように求めます。まず座標を標準座標で表した（１．４－１２）式の両辺を標準座標で微分します。<br />
\begin{equation}<br />
\frac{\partial x_i}{\partial \xi_j}=\sum_\alpha\frac{\partial N_\alpha(\boldsymbol{\xi})}{\partial \xi_j}x_i^\alpha   \tag*{$(1.4-14)$}<br />
\end{equation}<br />
ここで、<br />
\begin{equation}<br />
\frac{\partial x_i}{\partial x_j}=\sum_k\frac{\partial x_i}{\partial\xi_k}\frac{\partial\xi_k}{\partial x_j}=\delta_{ij}  \notag<br />
\end{equation}<br />
ですが、これを行列でかけば次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
\partial x_1/\partial\xi_1 &#038; \partial x_1/\partial\xi_2 &#038; \partial x_1/\partial\xi_3  \\<br />
\partial x_2/\partial\xi_1 &#038; \partial x_2/\partial\xi_2 &#038; \partial x_2/\partial\xi_3  \\<br />
\partial x_3/\partial\xi_1 &#038; \partial x_3/\partial\xi_2 &#038; \partial x_3/\partial\xi_3<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\partial\xi_1/\partial x_1 &#038; \partial\xi_1/\partial x_2 &#038; \partial\xi_1/\partial x_3  \\<br />
\partial\xi_2/\partial x_1 &#038; \partial\xi_2/\partial x_2 &#038; \partial\xi_2/\partial x_3  \\<br />
\partial\xi_3/\partial x_1 &#038; \partial\xi_3/\partial x_2 &#038; \partial\xi_3/\partial x_3<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
1 &#038; 0 &#038; 0 \\<br />
0 &#038; 1 &#038; 0 \\<br />
0 &#038; 0 &#038; 1<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
これより、<br />
\begin{equation}<br />
\begin{bmatrix}<br />
\partial\xi_1/\partial x_1 &#038; \partial\xi_1/\partial x_2 &#038; \partial\xi_1/\partial x_3  \\<br />
\partial\xi_2/\partial x_1 &#038; \partial\xi_2/\partial x_2 &#038; \partial\xi_2/\partial x_3  \\<br />
\partial\xi_3/\partial x_1 &#038; \partial\xi_3/\partial x_2 &#038; \partial\xi_3/\partial x_3<br />
\end{bmatrix}<br />
=\begin{bmatrix}<br />
\partial x_1/\partial\xi_1 &#038; \partial x_1/\partial\xi_2 &#038; \partial x_1/\partial\xi_3  \\<br />
\partial x_2/\partial\xi_1 &#038; \partial x_2/\partial\xi_2 &#038; \partial x_2/\partial\xi_3  \\<br />
\partial x_3/\partial\xi_1 &#038; \partial x_3/\partial\xi_2 &#038; \partial x_3/\partial\xi_3<br />
\end{bmatrix}^{-1}  \notag<br />
\end{equation}<br />
となります。これより標準座標の微分 $\partial\xi_j/\partial x_i$ を求めることができます。<br />
ここで変換行列の行列式を、<br />
\begin{equation}<br />
\Delta=det<br />
\begin{bmatrix}<br />
\partial x_1/\partial\xi_1 &#038; \partial x_1/\partial\xi_2 &#038; \partial x_1/\partial\xi_3  \\<br />
\partial x_2/\partial\xi_1 &#038; \partial x_2/\partial\xi_2 &#038; \partial x_2/\partial\xi_3  \\<br />
\partial x_3/\partial\xi_1 &#038; \partial x_3/\partial\xi_2 &#038; \partial x_3/\partial\xi_3<br />
\end{bmatrix}   \tag*{$(1.4-15)$}<br />
\end{equation}<br />
とおけば次のようになります。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;\frac{\partial\xi_1}{\partial x_1}=\frac{1}{\Delta}\bigl(\frac{\partial x_2}{\partial\xi_2}\frac{\partial x_3}{\partial\xi_3}<br />
-\frac{\partial x_3}{\partial\xi_2}\frac{\partial x_2}{\partial\xi_3}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_1}{\partial x_2}=\frac{1}{\Delta}\bigl(\frac{\partial x_3}{\partial\xi_2}\frac{\partial x_1}{\partial\xi_3}<br />
-\frac{\partial x_1}{\partial\xi_2}\frac{\partial x_3}{\partial\xi_3}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_1}{\partial x_3}=\frac{1}{\Delta}\bigl(\frac{\partial x_2}{\partial\xi_3}\frac{\partial x_1}{\partial\xi_2}<br />
-\frac{\partial x_1}{\partial\xi_3}\frac{\partial x_2}{\partial\xi_2}\bigr)  \\<br />
&#038;\frac{\partial\xi_2}{\partial x_3}=\frac{1}{\Delta}\bigl(\frac{\partial x_3}{\partial\xi_1}\frac{\partial x_2}{\partial\xi_3}<br />
-\frac{\partial x_2}{\partial\xi_1}\frac{\partial x_3}{\partial\xi_3}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_2}{\partial x_1}=\frac{1}{\Delta}\bigl(\frac{\partial x_1}{\partial\xi_1}\frac{\partial x_3}{\partial\xi_3}<br />
-\frac{\partial x_3}{\partial\xi_1}\frac{\partial x_1}{\partial\xi_3}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_2}{\partial x_3}=\frac{1}{\Delta}\bigl(\frac{\partial x_1}{\partial\xi_3}\frac{\partial x_2}{\partial\xi_1}<br />
-\frac{\partial x_2}{\partial\xi_3}\frac{\partial x_1}{\partial\xi_1}\bigr)  \\<br />
&#038;\frac{\partial\xi_3}{\partial x_1}=\frac{1}{\Delta}\bigl(\frac{\partial x_2}{\partial\xi_1}\frac{\partial x_3}{\partial\xi_2}<br />
-\frac{\partial x_3}{\partial\xi_1}\frac{\partial x_2}{\partial\xi_2}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_3}{\partial x_2}=\frac{1}{\Delta}\bigl(\frac{\partial x_1}{\partial\xi_2}\frac{\partial x_3}{\partial\xi_1}<br />
-\frac{\partial x_3}{\partial\xi_2}\frac{\partial x_1}{\partial\xi_1}\bigr)  \hspace{5mm}<br />
\frac{\partial\xi_3}{\partial x_3}=\frac{1}{\Delta}\bigl(\frac{\partial x_1}{\partial\xi_1}\frac{\partial x_2}{\partial\xi_2}<br />
-\frac{\partial x_2}{\partial\xi_1}\frac{\partial x_1}{\partial\xi_2}\bigr)<br />
\end{split}   \notag<br />
\end{equation}<br />
これを使って（１．４－１３）式の補間関数の勾配を計算することができます。<br />
これより要素行列と要素ベクトルは、<br />
\begin{equation}<br />
\begin{split}<br />
K_{\alpha\beta}&#038;=\iiint\sum_i\frac{\partial N_\alpha}{\partial x_i}\epsilon\frac{\partial N_\beta}{\partial x_i}dxdydz  \\<br />
&#038;=\iiint\sum_i\frac{\partial N_\alpha}{\partial x_i}\epsilon\frac{\partial N_\beta}{\partial x_i}<br />
\Bigl|\frac{\partial(x,y,z)}{\partial(r,s,t)}\Bigr|drdsdt　　\\<br />
F_\alpha&#038;=\iiint N_\alpha\rho\Bigl|\frac{\partial(x,y,z)}{\partial(r,s,t)}\Bigr|drdsdt<br />
\end{split} \tag*{$(1.4-16)$}<br />
\end{equation}<br />
となります。ここにヤコビアンは、<br />
\begin{equation}<br />
\frac{\partial(x,y,z)}{\partial(r,s,t)}=\Delta  \notag<br />
\end{equation}<br />
です。<br />
これらの積分は２次元のところで説明したガウスの求積法によって次のように計算できます。<br />
\begin{equation}<br />
\begin{split}<br />
&#038;K_{\alpha\beta}=\sum_i\sum_j\sum_k\boldsymbol{\nabla}N_\alpha(r_i,s_j,t_k)\cdot\epsilon\boldsymbol{\nabla}N_\beta(r_i,s_j,t_k)<br />
\Bigl|\frac{\partial(x,y,z)}{\partial(r,s,t)}\Bigr|_{(r_i,s_j,t_k)}w_{ijk}  \\<br />
&#038;F_\alpha\sum_i\sum_j\sum_kN_\alpha(r_i,s_j,t_k)\rho\Bigl|\frac{\partial(x,y,z)}{\partial(r,s,t)}\Bigr|_{(r_i,s_j,t_k)}w_{ijk}<br />
\end{split}  \tag*{$(1.4-17)$}<br />
\end{equation}<br />
ここに、$w_{i,j,k}$ は積分点における重みです。<br />
このようにしてすべての要素について要素行列と要素ベクトルが求まると、２次元の場合行ったように要素内のローカルな節点番号と対応するグローバルな節点番号の全体の係数行列とベクトルの要素に足しこむことによって連立方程式を作成することができます。<br />
連立方程式が求まると、静電場に関する境界条件を適用します。<br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/899/">１.４　３次元問題</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.５　静電場の境界条件</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/901/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 02:41:17 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=901</guid>

					<description><![CDATA[<p>微分方程式を解くには境界条件が必要になります。静電場の方程式も微分方程式ですから解くためには境界条件を考慮しなければなりません。 境界条件には、第一種境界条件、第二種境界条件などがあります。 境界で電位つまりポテンシャル [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/901/">１.５　静電場の境界条件</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p><code><!-- 図 140% に拡大・文中の式 $hoge$ の前後に半角スペースを挿入 --></code>微分方程式を解くには境界条件が必要になります。静電場の方程式も微分方程式ですから解くためには境界条件を考慮しなければなりません。<br />
境界条件には、第一種境界条件、第二種境界条件などがあります。<br />
境界で電位つまりポテンシャルが決まっている場合が第一種境界条件で、ポテンシャルの勾配すなわち電場の法線成分が定まっている場合を<br />
第二種境界条件といいます。<br />
まず第一種境界条件から考えます。この境界条件はディレクレ境界条件ともよばれており境界上でポテンシャルの値が決まっています。<br />
この境界条件を有限要素法に適用するためには境界上の節点のポテンシャル値を与えられた境界条件のポテンシャル値とする必要があります。<br />
有限要素法ではポテンシャルの節点値を未知数とした連立方程式を解くので、この条件を適用するためには境界上の節点に対応する未知数を方程式から除くことになります。<br />
例えば次の連立方程式を考えます。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
k_{1,1} &#038; \cdots &#038; k_{1,i-1} &#038; k_{1,i} &#038; k_{1,i+1} &#038; \cdots &#038; k_{1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{i-1,1} &#038; \cdots &#038; k_{i-1,i-1} &#038; k_{i-1,i} &#038; k_{i-1,i+1} &#038; \cdots &#038; k_{i-1,n}  \\<br />
k_{i,1} &#038; \cdots &#038; k_{i,i-1} &#038;k_{i,i} &#038; k_{i,i+1} &#038; \cdots &#038; k_{i,n}  \\<br />
k_{i+1,1} &#038; \cdots &#038; k_{i+1,i-1} &#038; k_{i+1,i} &#038; k_{i+1,i+1} &#038; \cdots &#038; k_{i+1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{n,1} &#038; \cdots &#038; k_{n,i-1} &#038; k_{n,i} &#038; k_{n,i+1} &#038; \cdots &#038; k_{n,n}<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi_1     \\<br />
\vdots     \\<br />
\phi_{i-1} \\<br />
\phi_i     \\<br />
\phi_{i+1} \\<br />
\vdots     \\<br />
\phi_n<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
f_1     \\<br />
\vdots  \\<br />
f_{i-1} \\<br />
f_i     \\<br />
f_{i+1} \\<br />
\vdots  \\<br />
f_n<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
ここで境界条件として $i$ 番目のポテンシャル $\phi_i$ が定まっているとします。するとこれは未知ではなく既知なので上の連立方程式を変形してこれに関連する項を右辺に移項します。すると下の方程式となります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
k_{1,1} &#038; \cdots &#038; k_{1,i-1} &#038; k_{1,i+1} &#038; \cdots &#038; k_{1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{i-1,1} &#038; \cdots &#038; k_{i-1,i-1} &#038; k_{i-1,i+1} &#038; \cdots &#038; k_{i-1,n}  \\<br />
k_{i,1} &#038; \cdots &#038; k_{i,i-1} &#038; k_{i,i+1} &#038; \cdots &#038; k_{i,n}  \\<br />
k_{i+1,1} &#038; \cdots &#038; k_{i+1,i-1} &#038; k_{i+1,i+1} &#038; \cdots &#038; k_{i+1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{n,1} &#038; \cdots &#038; k_{n,i-1} &#038; k_{n,i+1} &#038; \cdots &#038; k_{n,n}<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi_1     \\<br />
\vdots     \\<br />
\phi_{i-1} \\<br />
           \\<br />
\phi_{i+1} \\<br />
\vdots     \\<br />
\phi_n<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
f_1     \\<br />
\vdots  \\<br />
f_{i-1} \\<br />
f_i     \\<br />
f_{i+1} \\<br />
\vdots  \\<br />
f_n<br />
\end{bmatrix}<br />
&#8211;<br />
\begin{bmatrix}<br />
k_{1,i}\phi_i   \\<br />
\vdots  \\<br />
k_{i-1,i}\phi_i \\<br />
k_{i,i}\phi_i   \\<br />
k_{i+1,i}\phi_i \\<br />
\vdots  \\<br />
k_{n,i}\phi_i<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
このように変形すると未知数の数は $n$ から $n-1$ となりますが方程式の数は $n$ のままであり、方程式の数が多くなってしまいます。<br />
そこでこの方程式の $i$ 行目の方程式を取り除きます。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
k_{1,1} &#038; \cdots &#038; k_{1,i-1} &#038; k_{1,i+1} &#038; \cdots &#038; k_{1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{i-1,1} &#038; \cdots &#038; k_{i-1,i-1} &#038; k_{i-1,i+1} &#038; \cdots &#038; k_{i-1,n}  \\<br />
k_{i+1,1} &#038; \cdots &#038; k_{i+1,i-1} &#038; k_{i+1,i+1} &#038; \cdots &#038; k_{i+1,n}  \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \vdots &#038; \ddots &#038; \vdots  \\<br />
k_{n,1} &#038; \cdots &#038; k_{n,i-1} &#038; k_{n,i+1} &#038; \cdots &#038; k_{n,n}<br />
\end{bmatrix}<br />
\begin{bmatrix}<br />
\phi_1     \\<br />
\vdots     \\<br />
\phi_{i-1} \\<br />
\phi_{i+1} \\<br />
\vdots     \\<br />
\phi_n<br />
\end{bmatrix}<br />
=<br />
\begin{bmatrix}<br />
f_1     \\<br />
\vdots  \\<br />
f_{i-1} \\<br />
f_{i+1} \\<br />
\vdots  \\<br />
f_n<br />
\end{bmatrix}<br />
&#8211;<br />
\begin{bmatrix}<br />
k_{1,i}\phi_i   \\<br />
\vdots  \\<br />
k_{i-1,i}\phi_i \\<br />
k_{i+1,i}\phi_i \\<br />
\vdots  \\<br />
k_{n,i}\phi_i<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
このようにして変形すると係数行列は $n-1$ 行 $n-1$ 列の行列となり最初の連立方程式より元数が一つ小さな方程式となります。<br />
また、縮小後の係数行列も対称行列になることが分かります。<br />
このようにしてこの境界条件の節点に対してこの操作を繰り返すと境界上の節点の数だけ縮小した係数行列を持つ方程式が得られます。<br />
ポテンシャルの値が分かっているディレクレ境界条件はこのように有限要素法の係数行列を縮小して適用することができます。<br />
次に第二種境界条件についてですが、静電場解析の場合この境界条件はポテンシャルの法線方向の勾配を指定する条件となります。<br />
１．４節では、静電場の方程式(１．４－１)式を（１．４－３）式に変形するとき境界積分が出てきますが、この項は境界条件によって考慮されるので省略できるとして話を進めてきました。この境界積分は、<br />
\begin{equation}<br />
\int_V\sum_{i=1}^3\bigl(w\epsilon\frac{\partial\phi}{\partial x_i}\bigr)dV<br />
=\int_Sw\epsilon(\boldsymbol{\nabla}\phi\cdot\boldsymbol{n})dS  \notag<br />
\end{equation}<br />
ですが、ここで、<br />
\begin{equation}<br />
\boldsymbol{D}=-\epsilon\boldsymbol{\nabla}\phi  \notag<br />
\end{equation}<br />
ですからポテンシャルの法線方向の勾配すなわち電束密度の法線成分がゼロの場合この積分はゼロとなり省略できたのです。<br />
ところが一般的には電束密度の法線成分の値がゼロではなく決まった値を持つ境界条件を与える場合があります。<br />
このような場合はこの積分は省略できず要素行列と要素ベクトルを作る段階で境界上の節点を持つ要素についてその補間関数から、<br />
\begin{equation}<br />
\int_{S_n}N_\alpha D_ndS  \notag<br />
\end{equation}<br />
を計算して要素ベクトルに加える必要があります。ここに $D_n$ は指定された電束密度の値であり、面積分は境界面を含む要素番号 $n$ の境界面 $S_n$ で行います。<br />
境界面での電束密度の法線成分が指定される境界条件とはどのようなものかといいますと、例えば金属の表面では表面電荷密度に対応します。<br />
このような境界条件はノイマン境界条件ともいわれディレクレ境界条件と共によく使われます。<br />
静電場の問題では周期的な構造を持った誘電体などを扱うことがありますが、このような場合はこの周期性を利用して解析する領域を小さくすることが出来ます。<br />
下の図は２次元の周期的な構造物の例ですが、周期性を利用して右の図のように破線で囲まれた領域を取り出して解析領域とすることが出来ます。<br />
<img decoding="async" src="https://www.photon-cae.co.jp/fem_intro_img/fem_intro_1_5_01.png" style="display: block; margin: auto;"><br />
周期境界条件は領域の左右に実線で示している境界線に適用します。周期的に対応する節点のポテンシャルをすべて等しいとします。<br />
図には例えとして節点 $i$ と $j$ のポテンシャルを示しています。<br />
\begin{equation}<br />
\phi_i=\phi_j  \notag<br />
\end{equation}<br />
ディレクレ境界条件ではポテンシャルの値が分かっていたので対応する列を右辺に移項したのですが、この場合は二つの未知数が等しいので、これに対応する列を次のように足しこみます。<br />
\begin{equation}<br />
k_{k,i}\phi_i+k_{k,j}\phi_j=(K_{k,i}+K_{k,j})\phi_i \hspace{10mm} (k=1\cdots n)  \notag<br />
\end{equation}<br />
ただし方程式の次数を $n$ とします。これによって係数行列は $n$ 行 $n-1$ 列になりますが、列に関しても、<br />
\begin{equation}<br />
k_{i,k}\phi_i+k_{j,k}\phi_k=(K_{i,k}+K_{j,k})\phi_k \hspace{10mm} (k=1\cdots n)  \notag<br />
\end{equation}<br />
このように足しこみます。これにより係数行列とベクトルは次のようになります。<br />
\begin{equation}<br />
\begin{bmatrix}<br />
k_{1,1} &#038; \cdots &#038; k_{1,i}+k_{1,j} &#038; \cdots &#038; k_{1,n} \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \ddots &#038; \vdots \\<br />
k_{i,1}+k_{j,1} &#038; \cdots &#038; k_{i,i}+k_{i,j}+k_{j,i}+k_{j,j} &#038; \cdots &#038; k_{i,n}+k_{j,n} \\<br />
\vdots &#038; \ddots &#038; \vdots &#038; \ddots &#038; \vdots \\<br />
k_{n,1} &#038; \cdots &#038; k_{n,i}+k_{n,j} &#038; \cdots &#038; k_{n,n}<br />
\end{bmatrix}<br />
\hspace{10mm}<br />
\begin{bmatrix}<br />
f_1     \\<br />
\vdots  \\<br />
f_i+f_j \\<br />
\vdots  \\<br />
f_n<br />
\end{bmatrix}  \notag<br />
\end{equation}<br />
このようにして周期境界上の全ての節点について対応する行と列を縮小することによって周期境界条件を適用することが出来ます。<br />
<script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/901/">１.５　静電場の境界条件</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>１.６　有限要素法のプログラム(その１)</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/903/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Fri, 06 Aug 2021 02:46:45 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=903</guid>

					<description><![CDATA[<p>これから有限要素法のプログラムを作っていきたいと思います。言語はC++を使いますが、C言語の知識があれば十分理解できると思います。もしC言語の知識がない場合は、先にC言語の簡単な入門書を読んでおくことをお勧めします。 C [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/903/">１.６　有限要素法のプログラム(その１)</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>これから有限要素法のプログラムを作っていきたいと思います。言語はC++を使いますが、C言語の知識があれば十分理解できると思います。もしC言語の知識がない場合は、先にC言語の簡単な入門書を読んでおくことをお勧めします。<br />
C++はC言語をオブジェクト指向化したもので、クラスがプログラムの構成単位となります。オブジェクト指向については特に説明しませんが、まずこのクラスの例を示します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Node
{
    int       ID;
    double    coord[3];          //座標
    double*   value;             //値
public:
    Node()
    {
        value   = NULL;
    }
    virtual ~Node()
    {
        if(value   != NULL) delete[] value;
    }
    void setCoord(int i, double coordi) { coord[i] = coordi; }
    double getCoord(int i) { return coord[i]; }
};
</code></pre>
</div>
<p>これは節点を定義するためのクラスで最初のキーワード class の後にクラス名 Node とかきます。クラスの定義はそのあとの $\{$ と $\}$ の間にかきます。<br />
この例では三つの変数 ID、coord そして value が定義されています。最初は整数型の変数で「節点番号」、次の倍精度型の配列は座標 $(x,y,z)$ を表し、最後の倍精度のポインター型変数はこの節点が持っている値などを格納するためのものです。これらの変数のことをこのクラスのメンバー変数とよびます。<br />
クラスはこれらの変数だけでなくこれら変数を操作するための関数もメンバー関数として持っています。この例では Node()、<sup>~</sup>Node()、setCoord(int i,double coordi)、getCoord(int i)などです。<br />
ここで最初の二つの関数は特別な関数で、Node()はクラス名と同じ名前を持ち関数の型宣言がありません。この関数はこのクラスの変数が作成される時に自動的呼び出される関数で「コンストラクター」といいます。この例ではポインター型変数 value に NULL を代入して未定義になることを避けています。<br />
次の <sup>~</sup>Node はまえに virtual という宣言をされていますがやはり型宣言がありません。これは「デストラクター」とよばれコンストラクターとは逆にこのクラスの型宣言をされた変数が消去されるときに自動的に呼び出されます。この例ではポインター型変数が作成されているときにはそれを消去する処理を行っています。この virtual という宣言は仮想関数であるということですがデストラクターには付けるものだと思っておいてもいいと思います。<br />
さて、これらの関数の定義の前に public というキーワードがありますがこの説明をします。そもそもC言語にはなかったクラスというものを導入したのは、出来るだけ関連した処理はプログラムの中で独立して扱おうということからです。そのためにはこのクラス単位の処理はこの中だけで完結すれば、プログラムは非常に分かりやすくなります。というのもプログラムは大きくなればなるほどいろんな部分が関連して、一つの個所を修正するのにもいろんな場所に影響を与えてしまいます。そこで独立性の高い部品であるクラスと、クラスどうしの関係からプログラムを構築するするということが考えられたのです。<br />
したがってクラスのメンバーである変数や関数はできるだけ外部から直接参照できないことが望ましいのです。そのためにこれらのメンバー変数や関数にどの程度外部からの参照を許すかの基準を設けています。C++ではこの基準を以下の３種類のキーワードで決めています。<br />
private      :　何もしないとこれが適用され、このクラス内の関数からしか参照できません。<br />
public       :　どこからでも参照できます。<br />
protected  :　後から出てくる継承によってこのクラスから派生したクラスからだけ参照できます。<br />
これらのキーワードの後にかかれたメンバーにはこれが適用されます。<br />
この例では座標値を設定したり座標値を外部から参照できる関数が public で定義されています。<br />
このクラスでは関数の実装もこの関数で行っていますが、通常はクラス内部では関数の型宣言だけをしておき、実装は外部で行います。その場合はクラス名を頭につけ、</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
void Node::setCoord(int i, double coordi)
{
    coord[i] = coordi;
}
</code></pre>
</div>
<p>などとします。<br />
それではここからプログラムを作っていくことにします。実際に有限要素法のプログラムを作成して、有限要素法の基本的な問題を解けるようにします。<br />
C++のシステムがあればそれを使えば良いのですが、ここでは Windows 環境を使っているものとして無料の MinGW(Minimalist GNU for Windows) がインストールされていることを前提にお話しします。この開発環境は MinGW の公式サイトから入手できます。<br />
まず FEM というホルダーを作成して下さい。そしてその中に次のようなホルダーを作成します。<br />
Include　： クラスを定義したヘッダーファイルを格納するホルダー<br />
Source　  : ソースコードを格納するホルダー<br />
次にメモ帳などのテキストエディターを使ってファイル <font color="red">fem.h</font> をホルダー Include の中に作成し、ファイル <font color="blue">fem.cpp</font> を、ホルダー Source の中に作成します。<br />
最初にファイル <font color="red">fem.h</font> の先頭に次のようにヘッダーファイルのインクルード文と定義文をかいてください。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
#include &lt;stdlib.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &lt;string.h&gt;
#include &lt;sstream&gt;
#include &lt;math.h&gt;
using namespace std;
#define MAX_COLUMN 512
#define ELMAX1  24
#define ELMAX2  24
#define PI 3.14159265358979
#define ZERO_EPS  1.0e-20
#define SMALL_EPS 1.0e-9
</math.h></sstream></string.h></fstream></iostream></stdlib.h></code></pre>
</div>
<p>次にテキスト読込用クラス Input を定義します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Input
{
    //カンマ区切りの文字列の読み込み用クラス
public:
    static int readln(ifstream* fp_in, string strArray[]);
};
</code></pre>
</div>
<p>このクラスにはメンバー変数はなく、一つのメンバー関数 readln のみを持っています。この関数の実装はファイル <font color="blue">fem.cpp</font> で行います。<br />
まず、このファイルに次のインクルード文をかいてからその下にこの関数の実体をかいてください。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
#include "../include/fem.h"
#include "../include/solver.h"
int Input::readln(ifstream* fp_in, string strArray[])
{
    //ファイルポインタfp_inから１行読み込みカンマで分割された文字列を返す
    //データの最後はカンマをつける（空文はnum=0）
    int num = 0;
    char str[MAX_COLUMN];
    char buf[MAX_COLUMN];
    while (true)
    {
        fp_in->getline(str, MAX_COLUMN);    //１行読み込み
        int len = strlen(str);              //文字の数
        if(len >= 2)
        {
            //コメント文処理
            if(str[0] == '/' && str[1] == '/')
                continue;
        }
        num = 0;
        int col = 0;
        for (int n=0; n&lt;len+1; n++)
        {
            if(str[n] == ',')
            {
                buf[col] = '\0';
                strArray[num] = buf;
                num++;
                col = 0;
            }
            else
            {
                buf[col] = str[n];
                col++;
                if(str[n] == '\0')
                {
                    strArray[num] = buf;
                    num++;
                    break;
                }
            }
        }
        break;
    }
    return num;
}
</code></pre>
</div>
<p>次にアドレスクラスをファイル <font color="red">fem.h</font> に定義します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Address
{
protected:
    int* address;
public:
    Address(int dim)
    {
        //節点要素（スカラー）  dim = 1
        //節点要素（ベクトル）  dim = 3
        //辺要素                dim = 1
        address = new int[dim];
    }
    virtual ~Address()
    {
        delete[] address;
    }
    void setAddress(int address) { this->address[0] = address; }
    void setAddress(int i, int address) { this->address[i] = address; }
    int getAddress() { return address[0]; }
    int getAddress(int i) { return address[i]; }
};
</code></pre>
</div>
<p>このクラスは有限要素法の連立方程式を作るときの未知数の番号を定めるもので、スカラー場の場合節点に対応してひとつづつアドレスが与えられますが、拘束条件などがある場合その節点はこの番号から除かれます。またベクトル場の場合節点にベクトルの成分の数だけ番号が付けられます。<br />
このクラスのメンバー関数は全てこの中で実装されていますので、ファイル fem.cpp での記述は必要ありません。<br />
テーブルクラスをファイル <font color="red">fem.h</font> に定義します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Table
{
    //テーブルクラス
    int      ID;
    string   title;
    int      type;            // = 1 : 非線形   =  2 : 時間     =  3 : 温度
    int      numtabpt;        //　テーブル点数
    double   *x,*y;
public:
    Table()
    {
        numtabpt = 0;
        x = NULL;
        y = NULL;
    }
    virtual ~Table()
    {
        if(numtabpt > 0)
        {
            delete[] x;
            delete[] y;
        }
    }
    int  getID() { return ID; }
    string getTitle() { return title; }
    int getType() { return type; }
    int getNumtabpt() { return numtabpt; }
    double getX(int i) { return x[i]; }
    double getY(int i) { return y[i]; }
    double getValue(double inx, double& dydx);
    void read(ifstream* fp_in);
    void write(ofstream* fp_out);
};
</code></pre>
</div>
<p>このクラスは過渡応答解析の時間テーブルや非線形材料の材料特性を表すテーブルを定義するときに使います。メンバー変数には ID やタイプ、テーブル点数と二つの実数を格納する倍精度のポインターを持っています。メンバー関数にはこのテーブルから値を得るための getValue やデータの入出力用のものがあり、実装はファイル <font color="blue">fem.cpp</font> で次のように行います。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
//テーブルクラス
double Table::getValue(double inx, double& dydx)
{
    //テーブルの範囲外の場合最後の値から外挿した値を使用
    int    n;
    double value = 0.0;
    if(numtabpt <= 0)
    {
        cout << "テーブルエラー   テーブルがセットされていません！" << endl;
        dydx  = 0.0;
        value = 0.0;
        return value;
    }
    if(inx < x[0])
    {
        if(type == 2)    //時間テーブル
        {
            value = 0.0;
            return value;
        }
        cout << "テーブルエラー   " << inx  << " は範囲外の値です！" << endl;
        cout << "                 " << x[0] << " から外挿した値を使用しました！" << endl;
        dydx  = (y[1]-y[0])/(x[1]-x[0]);
        value = y[0] + dydx*(inx-x[0]);
        return value;
    }
    if(x[numtabpt-1] < inx)
    {
        cout << "テーブルエラー   " << inx  << " は範囲外の値です！" << endl;
        cout << "                 " << x[numtabpt-1] << " から外挿した値を使用しました！" << endl;
        dydx  = (y[numtabpt-1]-y[numtabpt-2])/(x[numtabpt-1]-x[numtabpt-2]);
        value = y[numtabpt-1] + dydx*(inx-x[numtabpt-1]);
        return value;
    }
    if(numtabpt == 1)
    {
        if(x[0] > 0.0)
            dydx = y[0]/x[0];
        else
            dydx = 0.0;
        value   = y[0];
    }
    for (n=1; n&lt;numtabpt; n++)
    {
        if((x[n]-x[n-1]) < 1.0e-20)
        {
            cout << "テーブルエラー   Ｘ値 " << x[n] << " は単調増加になっていません！" << endl;
        }
        if(inx <= x[n])
        {
            dydx  = (y[n]-y[n-1])/(x[n]-x[n-1]);
            value = y[n-1] + dydx*(inx-x[n-1]);
            break;
        }
    }
    return value;
}
void Table::read(ifstream* fp_in)
{
    string strArray[MAX_COLUMN];
    char str[MAX_COLUMN];
    //ID、タイプ
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); ID   = atoi(str);
    strcpy(str,strArray[1].c_str()); type = atoi(str);
    //タイトル
    Input::readln(fp_in, strArray);
    title = strArray[0];
    //テーブル点数
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); numtabpt = atoi(str);
    if(numtabpt > 0)
    {
        x = new double[numtabpt];
        y = new double[numtabpt];
    }
    for (int i=0; i&lt;numtabpt; i++)
    {
        Input::readln(fp_in, strArray);
        strcpy(str,strArray[0].c_str()); x[i] = atof(str);
        strcpy(str,strArray[1].c_str()); y[i] = atof(str);
    }
}
void Table::write(ofstream* fp_out)
{
    *fp_out << ID << "," << type << "," << endl;
    *fp_out << title << endl;
    *fp_out << numtabpt << "," << endl;
    for (int i=0; i&lt;numtabpt; i++)
        *fp_out << x[i] << "," << y[i] << "," << endl;
}
</code></pre>
</div>
<p>物性を定義するクラス Material をファイル <font color="red">fem.h</font> にかきます。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Material
{
    //物性クラス
    int     ID;
    string  title;
    double  value[2];
    Table*  table[2];
public:
    int getID() {return ID; }
    string getTitle() { return title; }
    double getValue(int i) { return value[i]; }
    Table* getTable(int i) { return table[i]; }
    void read(int numtab, Table** tableArray, ifstream* fp_in);
    void write(ofstream* fp_out);
};
</code></pre>
</div>
<p>線形材料の場合は値をメンバー変数 value に格納します。２個の配列を持っているのは例えば電気伝導率と非透磁率などを指定するためです。非線形材料の場合は Table クラスの変数 table に材料特性テーブルを入れます。<br />
データの入出力用メンバー変数の実装はファイル <font color="blue">fem.cpp</font>p で行います。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
//物性クラス
void Material::read(int numtab, Table** tableArray, ifstream* fp_in)
{
    string strArray[MAX_COLUMN];
    char str[MAX_COLUMN];
    //ID
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); ID   = atoi(str);
    //タイトル
    Input::readln(fp_in, strArray);
    title = strArray[0];
    //物性値
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); value[0] = atof(str);
    strcpy(str,strArray[1].c_str()); value[1] = atof(str);
    //非線形テーブル
    int tableID[2];
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); tableID[0] = atoi(str);
    strcpy(str,strArray[1].c_str()); tableID[1] = atoi(str);
    for (int i=0; i&lt;2; i++)
    {
        table[i] = NULL;
        for (int n=0; n&lt;numtab; n++)
        {
            if(tableArray[n]->getID() == tableID[i])
            {
                table[i] = tableArray[n];
                break;
            }
        }
    }
}
void Material::write(ofstream* fp_out)
{
    *fp_out << ID << "," << endl;
    *fp_out << title << endl;
    *fp_out << value[0] << "," << value[1] << endl;
}
</code></pre>
</div>
<p>境界条件のためのクラス Boundary と荷重のためのクラス Load をファイル <font color="red">fem.h</font> に定義します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class Boundary
{
    //境界条件クラス
    int    ID;
    double value;
public:
    int getID() {return ID; }
    double getValue() { return value; }
    void read(ifstream* fp_in);
    void write(ofstream* fp_out);
};
class Load
{
    //荷重クラス
    int    ID;
    int    type;
    double value[3];
    Table* table;
public:
    int getID() {return ID; }
    int getType() { return type; }
    double getValue(int i) { return value[i]; }
    Table* getTable() { return table; }
    void read(int numtab, Table** tableArray, ifstream* fp_in);
    void write(ofstream* fp_out);
};
</code></pre>
</div>
<p>境界条件は節点や辺が拘束されている場合に参照されるものでメンバー変数として ID と拘束値 value を持っています。<br />
また荷重クラスは電流密度や磁化などのベクトル値を指定するために３個の配列と時間依存性を表すテーブルを持っています。<br />
これらのクラスの入出力関数はファイル <font color="blue">fem.cpp</font> で次のように実装します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
//境界条件クラス
void Boundary::read(ifstream* fp_in)
{
    string strArray[MAX_COLUMN];
    char str[MAX_COLUMN];
    //ID
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); ID   = atoi(str);
    //境界値
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); value = atof(str);
}
void Boundary::write(ofstream* fp_out)
{
    *fp_out << ID << "," << endl;
    *fp_out << value << "," << endl;
}
//荷重クラス
void Load::read(int numtab, Table** tableArray, ifstream* fp_in)
{
    string strArray[MAX_COLUMN];
    char str[MAX_COLUMN];
    //ID、タイプ
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); ID   = atoi(str);
    strcpy(str,strArray[1].c_str()); type = atoi(str);
    //荷重値
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); value[0] = atof(str);
    strcpy(str,strArray[1].c_str()); value[1] = atof(str);
    strcpy(str,strArray[2].c_str()); value[2] = atof(str);
    //時間テーブル
    int tableID;
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str()); tableID = atoi(str);
    table = NULL;
    for (int n=0; n&lt;numtab; n++)
    {
        if(tableArray[n]->getID() == tableID)
        {
            table = tableArray[n];
            break;
        }
    }
}
void Load::write(ofstream* fp_out)
{
    *fp_out << ID << "," << type << "," << endl;
    *fp_out << value[0] << "," << value[1] << "," << value[2] << "," << endl;
}
</code></pre>
</div>
<p>この節最後に、節点のためのクラス Node をファイル <font color="red">fem.h</font> に定義します。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
class ElementList;
class Node
{
    //節点クラス
    int       ID;
    double    coord[3];
    Address*  address;
    Boundary* boundary;
    Load*     load;
    double*   value;
    ElementList* elementlist;
public:
    Node()
    {
        address = NULL;
        boundary = NULL;
        load = NULL;
        value = new double[2];
        for (int i=0; i&lt;2; i++)
            value[i] = 0.0;
        elementlist = NULL;
    }
    virtual ~Node()
    {
        delete[] value;
    }
    int getID() {return ID; }
    double getCoord(int i) { return coord[i]; }
    void setAddress(Address* address) { this->address = address; }
    void setAddress(int i, int address) { this->address->setAddress(i,address); }
    int getAddress()
    {
        if(address != NULL)
            return address->getAddress();
        else
            return -1;
    }
    int getAddress(int i)
    {
        if(address != NULL)
            return address->getAddress(i);
        else
            return -1;
    }
    Boundary* getBoundary() { return boundary; }
    Load* getLoad() { return load; }
    void setValue(int i, double value) { this->value[i] = value; }
    double* getValue() { return value; }
    double getValue(int i) { return value[i]; }
    void setElementlist(ElementList* elementlist) { this->elementlist = elementlist; }
    ElementList* getElementlist() { return elementlist; }
    void read(int numbc, Boundary** boundArray, int numld, Load** loadArray, ifstream* fp_in);
    void write(ofstream* fp_out);
};
</code></pre>
</div>
<p>最初に class ElementList; とかかれているのはこのクラスのメンバー変数にこのクラスの型が使われているからです。<br />
このクラスはこれより後で定義しているためこの記述がないと未定義の型としてエラーとみなされるからです。<br />
このクラスはメンバー変数として ID と座標値、アドレス、境界条件、荷重を持っています。またこの節点としての値 value をもっています。<br />
メンバー関数である入出力関数の実装はファイル <font color="blue">fem.cpp</font> で次のように行います。</p>
<div class="hcb_wrap">
<pre class="prism line-numbers lang-cpp" data-lang=""><code>
//節点クラス
void Node::read(int numbc, Boundary** boundArray, int numld, Load** loadArray, ifstream* fp_in)
{
    string strArray[MAX_COLUMN];
    char str[MAX_COLUMN];
    int boundID,loadID;
    //ID、座標値、荷重条件
    Input::readln(fp_in, strArray);
    strcpy(str,strArray[0].c_str());      ID   = atoi(str);
    strcpy(str,strArray[1].c_str()); boundID   = atoi(str);
    strcpy(str,strArray[2].c_str()); loadID    = atoi(str);
    strcpy(str,strArray[3].c_str()); coord[0]  = atof(str);
    strcpy(str,strArray[4].c_str()); coord[1]  = atof(str);
    strcpy(str,strArray[5].c_str()); coord[2]  = atof(str);
    boundary = NULL;
    for (int n=0; n&lt;numbc; n++)
    {
        if(boundArray[n]->getID() == boundID)
        {
            boundary = boundArray[n];
            break;
        }
    }
    load = NULL;
    for (int n=0; n&lt;numld; n++)
    {
        if(loadArray[n]->getID() == loadID)
        {
            load = loadArray[n];
            break;
        }
    }
}
void Node::write(ofstream* fp_out)
{
    int boundID = 0;
    if(boundary != NULL)
        boundID = boundary->getID();
    int loadID = 0;
    if(load != NULL)
        loadID = load->getID();
    *fp_out << ID << "," << boundID  << "," << loadID << "," << coord[0] << "," << coord[1] << "," << coord[2] << "," << endl;
}
</code></pre>
</div>
<p><script>MathJax = {chtml: {matchFontHeight: false},tex: {inlineMath: [['$', '$']]}};</script><br />
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"></script></p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/903/">１.６　有限要素法のプログラム(その１)</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>２．磁場解析</title>
		<link>https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/912/</link>
		
		<dc:creator><![CDATA[loop]]></dc:creator>
		<pubDate>Thu, 12 Aug 2021 04:37:08 +0000</pubDate>
				<guid isPermaLink="false">https://www.photon-cae.co.jp/?post_type=technicalinfo&#038;p=912</guid>

					<description><![CDATA[<p>磁場解析と一言で言っても静的な磁場と動的な磁場では大きく異なってきます。動的な磁場を問題にする場合はファラデーの法則により電場が発生するので導体があるとその内部に渦電流が発生します。したがって電場を考慮する必要があります [&#8230;]</p>
<p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/912/">２．磁場解析</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></description>
										<content:encoded><![CDATA[<p>磁場解析と一言で言っても静的な磁場と動的な磁場では大きく異なってきます。動的な磁場を問題にする場合はファラデーの法則により電場が発生するので導体があるとその内部に渦電流が発生します。したがって電場を考慮する必要があります。<br />
また高周波になると電場の変化が磁場を発生させるため、電場と磁場が密接に関係しており電磁場に関するマックスウェルの方程式のすべてを考慮する必要があります。<br />
静磁場の場合アンペールの法則は磁場だけの閉じた法則となり扱いが非常に簡単になります。したがってまず静磁場解析から始めたいと思います。</p><p>The post <a href="https://www.photon-cae.co.jp/technicalinfo-list/technicalinfo/912/">２．磁場解析</a> first appeared on <a href="https://www.photon-cae.co.jp">電磁場解析シミュレーションの株式会社フォトン</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
