<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>NPO法人 natural science</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/" />
    <link rel="self" type="application/atom+xml" href="http://www.natural-science.or.jp/atom.xml" />
    <id>tag:www.natural-science.or.jp,2008-09-17://12</id>
    <updated>2012-02-02T00:18:58Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.261</generator>

<entry>
    <title>WebGLを使ってみる―２次元ガウス分布を描画―</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120201181336.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13023</id>

    <published>2012-02-01T09:13:36Z</published>
    <updated>2012-02-02T00:18:58Z</updated>

    <summary> WebGLとは、３次元コンピュータグラッフィックを実現するOpenGLを、 ウ...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="html5" label="HTML5" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="javascript" label="javascript" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="webgl" label="WebGL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ガウス分布" label="ガウス分布" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
WebGLとは、３次元コンピュータグラッフィックを実現するOpenGLを、
ウェブブラウザ上でプラグインなしで利用するための仕様です。
HTML5 + Javascript で利用することができます。
WebGLの最大の特徴は、PCのグラフィックカードに直接描画データを送ることが出来るため、
見た目にも重そうな３次元グラフィックを高速に描画することができるとのことです。
ただし、今のところ閲覧可能なブラウザは限られています（<a href="http://ja.wikipedia.org/wiki/WebGL" target="_blank">利用可能なブラウザについてはこちらをご覧ください</a>）。
</p>

<h2>２次元ガウス分布の描画</h2>
<p>
WebGL の使い方を勉強がてら、２次元ガウス分布を描画てみます。<br />
【２次元ガウス分布についての参考ページ】<br />
■ <a href="http://www.natural-science.or.jp/article/20111007174724.php">１軸ガウシアンによる電子パルスの拡散</a><br />
■ <a href="http://www.natural-science.or.jp/article/20120105114833.php">gnuplot ３次元カラーマップで補間（interpolate）</a>
</p>


<h3>WebGLによる描画結果</h3>
<p>
このWEBページはHTML5ではないので、外部ページに描画結果を用意しています。
WebGLに対応しているブラウザでこちらをご覧ください。視点もLookAt関数を用いて、意味もなく動かしています。
</p>
<p>
<a href="http://www.natural-science.or.jp/WebGL/gaussian.html">http://www.natural-science.or.jp/WebGL/gaussian.html</a>
</p>


<p style="text-align:center">
<span style="font-size:x-small">これはGIFファイルです。こんな感じになります。</span><br />
<a href="http://www.natural-science.or.jp/WebGL/gaussian.html"><img src="http://www.natural-science.or.jp/images/20120201-1.gif" alt="WEBGLデモ" /></a>
</p>

<br />
<h2>HTML5+Javascript プログラムソース</h2>
<p>
本プログラムソースは、下記のページをかなり参考にして勉強させていただいております。<br />
→<a href="https://sites.google.com/site/hackthewebgl/learning-webglhon-yaku/the-lessons/lesson-4">Hack The WebGL (WebGL勉強会)</a><br />
</p>
<p style="color:red">
※注意：使い始めたばかりなので、WebGLの関数を開発者の意図通り使っていない可能性があります。
</p>
<pre class="brush: js;">
&lt;html&gt;

&lt;head&gt;
&lt;title&gt;Learning WebGL &amp;mdash; lesson 3&lt;/title&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=ISO-8859-1&quot;&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;glMatrix-0.9.5.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;webgl-utils.js&quot;&gt;&lt;/script&gt;


&lt;!--シェーダ言語--&gt;
&lt;script id=&quot;shader-fs&quot; type=&quot;x-shader/x-fragment&quot;&gt;
    precision mediump float;

    varying vec4 vColor;

    void main(void) {
        gl_FragColor = vColor;
    }
&lt;/script&gt;

&lt;script id=&quot;shader-vs&quot; type=&quot;x-shader/x-vertex&quot;&gt;
    attribute vec3 aVertexPosition;
    attribute vec4 aVertexColor;

    uniform mat4 uMVMatrix;
    uniform mat4 uPMatrix;

    varying vec4 vColor;

    void main(void) {
        gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
        vColor = aVertexColor;
    }
&lt;/script&gt;


&lt;script type=&quot;text/javascript&quot;&gt;

    var gl;

    function initGL(canvas) {
        try {
            gl = canvas.getContext(&quot;experimental-webgl&quot;);
            gl.viewportWidth = canvas.width;
            gl.viewportHeight = canvas.height;
        } catch (e) {
        }
        if (!gl) {
            alert(&quot;Could not initialise WebGL, sorry :-(&quot;);
        }
    }


    function getShader(gl, id) {
        var shaderScript = document.getElementById(id);
        if (!shaderScript) {
            return null;
        }

        var str = &quot;&quot;;
        var k = shaderScript.firstChild;
        while (k) {
            if (k.nodeType == 3) {
                str += k.textContent;
            }
            k = k.nextSibling;
        }

        var shader;
        if (shaderScript.type == &quot;x-shader/x-fragment&quot;) {
            shader = gl.createShader(gl.FRAGMENT_SHADER);
        } else if (shaderScript.type == &quot;x-shader/x-vertex&quot;) {
            shader = gl.createShader(gl.VERTEX_SHADER);
        } else {
            return null;
        }

        gl.shaderSource(shader, str);
        gl.compileShader(shader);

        if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
            alert(gl.getShaderInfoLog(shader));
            return null;
        }

        return shader;
    }


    var shaderProgram;

    function initShaders() {
        var fragmentShader = getShader(gl, &quot;shader-fs&quot;);
        var vertexShader = getShader(gl, &quot;shader-vs&quot;);

        shaderProgram = gl.createProgram();
        gl.attachShader(shaderProgram, vertexShader);
        gl.attachShader(shaderProgram, fragmentShader);
        gl.linkProgram(shaderProgram);

        if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {
            alert(&quot;Could not initialise shaders&quot;);
        }

        gl.useProgram(shaderProgram);

        shaderProgram.vertexPositionAttribute = gl.getAttribLocation(shaderProgram, &quot;aVertexPosition&quot;);
        gl.enableVertexAttribArray(shaderProgram.vertexPositionAttribute);

        shaderProgram.vertexColorAttribute = gl.getAttribLocation(shaderProgram, &quot;aVertexColor&quot;);
        gl.enableVertexAttribArray(shaderProgram.vertexColorAttribute);

        shaderProgram.pMatrixUniform = gl.getUniformLocation(shaderProgram, &quot;uPMatrix&quot;);
        shaderProgram.mvMatrixUniform = gl.getUniformLocation(shaderProgram, &quot;uMVMatrix&quot;);
    }


    var mvMatrix = mat4.create();
    var mvMatrixStack = [];
    var pMatrix = mat4.create();

    function mvPushMatrix() {
        var copy = mat4.create();
        mat4.set(mvMatrix, copy);
        mvMatrixStack.push(copy);
    }

    function mvPopMatrix() {
        if (mvMatrixStack.length == 0) {
            throw &quot;Invalid popMatrix!&quot;;
        }
        mvMatrix = mvMatrixStack.pop();
    }


    function setMatrixUniforms() {
        gl.uniformMatrix4fv(shaderProgram.pMatrixUniform, false, pMatrix);
        gl.uniformMatrix4fv(shaderProgram.mvMatrixUniform, false, mvMatrix);
    }

    function degToRad(degrees) {
        return degrees * Math.PI / 180;
    }

    var squareVertexPositionBuffer;
    var squareVertexColorBuffer;

    function initBuffers() {
        ///////////////////////////////////////////////
        //三角形
        ///////////////////////////////////////////////
        //三角形の頂点位置         ///////////////////////////////////////////////
        triangleVertexPositionBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
        var vertices = [
             0.0,  1.0,  0.0,
            -1.0, -1.0,  0.0,
             1.0, -1.0,  0.0
        ];
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
        triangleVertexPositionBuffer.itemSize = 3;
        triangleVertexPositionBuffer.numItems = 3;

        //三角形の頂点色         ///////////////////////////////////////////////
        triangleVertexColorBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
        var colors = [
            1.0, 0.0, 0.0, 1.0,
            0.0, 1.0, 0.0, 1.0,
            0.0, 0.0, 1.0, 1.0,
        ];
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
        triangleVertexColorBuffer.itemSize = 4;
        triangleVertexColorBuffer.numItems = 3;

        ///////////////////////////////////////////////
        //四角形
        ///////////////////////////////////////////////
        //四角形の頂点位置         ///////////////////////////////////////////////
        squareVertexPositionBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
        vertices = [
             1.0,  1.0,  0.0,
            -1.0,  1.0,  0.0,
             1.0, -1.0,  0.0,
            -1.0, -1.0,  0.0
            ];
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
        squareVertexPositionBuffer.itemSize = 3;
        squareVertexPositionBuffer.numItems = 4;
        //四角形の頂点色         ///////////////////////////////////////////////
        squareVertexColorBuffer = gl.createBuffer();
        gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexColorBuffer);
        colors = []
        for (var i=0; i &lt; 4; i++) {
            colors = colors.concat([0.5, 0.5, 1.0, 1.0]);
        }
        gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(colors), gl.STATIC_DRAW);
        squareVertexColorBuffer.itemSize = 4;
        squareVertexColorBuffer.numItems = 4;
    }


    var rTri = 0;
    var rSquare = 0;

    function drawScene() {
        gl.viewport(0, 0, gl.viewportWidth, gl.viewportHeight);
        gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

        mat4.perspective(45, gl.viewportWidth / gl.viewportHeight, 0.1, 100.0, pMatrix);
        mat4.identity(mvMatrix);
        mat4.translate(mvMatrix, [-1.5, 0.0, -7.0]);

        mvPushMatrix();
        mat4.rotate(mvMatrix, degToRad(rTri), [0, 1, 0]);

        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexPositionBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, triangleVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

        gl.bindBuffer(gl.ARRAY_BUFFER, triangleVertexColorBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, triangleVertexColorBuffer.itemSize, gl.FLOAT, false, 0, 0);

        setMatrixUniforms();
        gl.drawArrays(gl.TRIANGLES, 0, triangleVertexPositionBuffer.numItems);
        mvPopMatrix();


        mat4.translate(mvMatrix, [3.0, 0.0, 0.0]);

        mvPushMatrix();
        mat4.rotate(mvMatrix, degToRad(rSquare), [1, 0, 0]);

        gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexPositionBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexPositionAttribute, squareVertexPositionBuffer.itemSize, gl.FLOAT, false, 0, 0);

        gl.bindBuffer(gl.ARRAY_BUFFER, squareVertexColorBuffer);
        gl.vertexAttribPointer(shaderProgram.vertexColorAttribute, squareVertexColorBuffer.itemSize, gl.FLOAT, false, 0, 0);

        setMatrixUniforms();
        gl.drawArrays(gl.TRIANGLE_STRIP, 0, squareVertexPositionBuffer.numItems);

        mvPopMatrix();
    }

    var lastTime = 0;

    function animate() {
        var timeNow = new Date().getTime();
        if (lastTime != 0) {
            var elapsed = timeNow - lastTime;

            rTri += (90 * elapsed) / 1000.0;
            rSquare += (75 * elapsed) / 1000.0;
        }
        lastTime = timeNow;
    }

    function tick() {
        requestAnimFrame(tick);
        drawScene();
        animate();
    }

    function webGLStart() {
        var canvas = document.getElementById(&quot;lesson03-canvas&quot;);
        initGL(canvas);
        initShaders()
        initBuffers();
        gl.clearColor(0.0, 0.0, 0.0, 1.0);
        gl.enable(gl.DEPTH_TEST);
        tick();
    }
&lt;/script&gt;

&lt;/head&gt;


&lt;body onload=&quot;webGLStart();&quot;&gt;
    &lt;a href=&quot;http://learningwebgl.com/blog/?p=239&quot;&gt;&lt;&lt; Back to Lesson 3&lt;/a&gt;&lt;br /&gt;
    &lt;canvas id=&quot;lesson03-canvas&quot; style=&quot;border: none;&quot; width=&quot;500&quot; height=&quot;500&quot;&gt;&lt;/canvas&gt;
    &lt;br/&gt;
    &lt;a href=&quot;http://learningwebgl.com/blog/?p=239&quot;&gt;&lt;&lt; Back to Lesson 3&lt;/a&gt;&lt;br /&gt;


&lt;/body&gt;

&lt;/html&gt;
</pre>



<h2>Google ChromeのJavascript デバッガ</h2>
<p>
参考までに、プログラミングする場合、デバッガが必要となりますが、Google Chromeに標準でついている デバッガが良かったのです。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120201-2.gif" alt="" />
</p>


<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120201-1.gif" src="http://www.natural-science.or.jp/images/20120201-1.gif" width="399" height="399" class="mt-image-none" style="" /></span>
-->]]>
        
    </content>
</entry>

<entry>
    <title>実装しているGPUのOpenGLのバージョンを調べる</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120126175607.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13020</id>

    <published>2012-01-26T08:56:07Z</published>
    <updated>2012-01-26T08:57:48Z</updated>

    <summary> OpenGLにはバージョンがあります。 PCに実装しているGPUによって異なる...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="opengl" label="OpenGL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[
<p>
OpenGLにはバージョンがあります。
PCに実装しているGPUによって異なるバージョンは、OpenGLの関数「glGetString()」を利用することで調べることができます。
また、利用可能なOpenGLの拡張を調べることも出来ます。
</p>

<pre class="brush: cpp;">
#include &lt;iostream&gt;
#include &lt;GL/glut.h&gt;
using namespace std; 
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutCreateWindow(&quot;Check OpenGL&quot;);

  cout &lt;&lt; &quot;Vendor :&quot;&lt;&lt;glGetString(GL_VENDOR)&lt;&lt;'\n';
  cout &lt;&lt; &quot;GPU : &quot;&lt;&lt;glGetString(GL_RENDERER) &lt;&lt;'\n';
  cout &lt;&lt; &quot;OpenGL ver. &quot; &lt;&lt;glGetString(GL_VERSION)&lt;&lt;'\n';
  cout &lt;&lt; &quot;【拡張機能一覧】&quot;&lt;&lt;endl;
  cout &lt;&lt; glGetString(GL_EXTENSIONS) &lt;&lt;endl;

  int i; cin &gt;&gt; i;
  return 0;
}
</pre>
<br />
<h3>実行結果</h3>
<p>
<img src="http://www.natural-science.or.jp/images/20120126-1.gif" alt="" />
</p>
<br />
<h3>【参考ページ】</h3>
<p>
■<a href="http://wiki.livedoor.jp/mikk_ni3_92/d/GPU%a4%c8OpenGL%a4%ce%a5%d0%a1%bc%a5%b8%a5%e7%a5%f3" target="_blank">OpenGL de プログラミング</a>
■<a href="http://www7a.biglobe.ne.jp/~kirii/kiriicom/EVANGELS/oglsgi/chap5.html" target="_blank">シリコングラフィックスシステムでのOpenGLプログラミング</a>
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120126-1.gif" src="http://www.natural-science.or.jp/images/20120126-1.gif" width="673" height="492" class="mt-image-none" style="" /></span>
-->]]>
        
    </content>
</entry>

<entry>
    <title>週末科学実験講座「アルゴリズムを学んでロボットカーを制御しよう」報告書</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120114161458.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13016</id>

    <published>2012-01-14T07:14:58Z</published>
    <updated>2012-01-14T07:18:36Z</updated>

    <summary> 11月19日(土)から12月17日(土) にかけて、毎週土曜日に全5回(各2時...</summary>
    <author>
        <name>イットワンシット</name>
        
    </author>
    
        <category term="体験編" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="labview" label="LabVIEW" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="アルゴリズム" label="アルゴリズム" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="週末科学講座" label="週末科学講座" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p style="border:solid 1px gray; padding:10px 10px">
11月19日(土)から12月17日(土) にかけて、毎週土曜日に全5回(各2時間)の週末科学実験講座をFiveBridge 会議室（仙台市青葉区北目町4-7 HSG ビル３階）において実施し、小学生５人が受講した。以下に、本講座の報告をする。
</p>

<h2>目的</h2>
<p>
<img src="http://www.natural-science.or.jp/img3/tanki7.gif" alt="" style="float:right; margin:0px 0px 20px 20px" />
本講座はロボットカーを走らせるアルゴリズム作成をとおして、課題解決能力を養うことを目的とし、小学校高学年向けの２時間×
5回の講座です。本講座では、、ロボットカーがコースを自動で認識して決められたコースから外れずにコールするためのアルゴリズムを作成するを
通じて、「アルゴリズムとは何か？」ということを学びます。
各会の目的は次のとおりです。
</p>

<h3>第1回：「アルゴリズムとは何か？」を学ぶ</h3>
<p>
ロボットカーが決められたコースをゴールするまでの手順(アルゴリズム)を、パソコンを使わず手動
で行うことで、そもそも「アルゴリズムとは何か？」を学びます。
</p>

<h3>第2回：パソコンを用いてロボットカーの車輪を制御する</h3>
<p>
ロボットカーの車輪の動きを制御するために、ON/OFFのディジタル信号をパソコンでロボットに入
力する方法を学びます。
</p>

<h3>第3回：ロボットカーの複雑な動きを実現するためにコンピュータプログラミングを学ぶ</h3>
<p>
コンピュータプログラミング開発環境LabVIEWを用いて、ロボットカーを自在に動かすプログラム作成
方法を学びます。
</p>

<h3>第4回：ロボットカーがコースを認識1 するために必要な光センサーの特性を学ぶ</h3>
<p>
はじめに光センサーの特性を理解するために、色の測定実験を行います。その特性に基づいて、
ロボットカーがコースを認識するためのアルゴリズムを考えます。
</p>
<h3>第5回：ロボットカーがコースを完走するためのアルゴリズムを構築する</h3>
<p>
光センサーでコースを認識してコースを完走できるためのアルゴリズムを作成します。またさらに、
より速くゴールできるようにロボットカーのスピードを調節するアルゴリズムの構築に挑戦します。
</p>

<br />
<h2>活動内容</h2>
<h3>１日目　アルゴリズムを考える</h3>
<p>
　アルゴリズムの難しさを実感してもらうために、１日目は簡単なコース上でコントローラカーを動かして、その
｢手順｣であるアルゴリズムを考えてもらいました。そのあと、考えたアルゴリズム通りにコースを見ずに
ロボットカーを動かしてみた結果、予想通り目的地から遠く離れました。これを通して、受講者はアルゴリズム
の作成の上で、様々な問題点に直面しなければならないことを実感してもらいました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120114-1.gif" alt=""  />
</p>

<h3>２日目　パソコンを用いたロボットカーの動かし方を学ぶ</h3>
<p>
　2日目はパソコンを使ってロボットカーを動かせるように前回のコントローラのスイッチ操作をディジタル
信号に変えて、パソコンに入力しました。そのディジタル信号に対してロボットカーがどのように動くかを
確認してもらいました。ここで、測定及び制御に優れたLabVIEW開発環境を利用してDAQを制御装置として
使用しました。そのため、LabVIEWの必要最低限の基本的な知識を学んでもらいました。<br />
　スイッチ操作からディジタル信号に変換することは簡単でしたが、LabVIEWの使い方がまだなれていない
生徒にとって最初は苦しい状況でしたが、繰り返して練習した結果DAQの使い方及びロボットの動きを
設定することができるようになりました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120114-2.gif" alt=""  />
</p>


<h3>３日目　ロボットカーをより複雑な動きを実現するためにプログラミングを学ぶ</h3>
<p>
　これまでの知識ではロボットカーの単独な動きしか実現できないため、決められたコースを走行すること
が困難となります。ここで、今回はロボットカーをより複雑な動きが実現できるようにLabVIEWのプログラ
ミングを学んでもらいました。そして、一日目のアルゴリズムを入力して走行試験を行ってもらいました。
走行試験では、二人一組でプログラムの作成及び時間の測定などをしてもらいました。お互いが積極的に相
談しながらアルゴリズムを考えて、また、時間の変数を繰り返し調節した結果、一日目よりロボットカーの
動きが大幅に改善できましたが、タイヤについているモータの強さや走行中、摩擦係数の不一致などにより
、目的地まで辿り付けることはまだ難しかったです。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120114-3.gif" alt=""  />
</p>


<h3>４日目　ロボットカーがコースを認識できるように光センサーの特性を学ぶ</h3>
<p>
　4日目はコースが認識できるように光センサーを導入しました。そのため、光センサーの特性を知る必要が
あります。光センサーの原理について説明し、また、DAQへのデータ収録方法を学んでもらい、光センサー
から値を取得して色の測定実験を行ってもらいました。<br />
　今回、生徒にとってデータの読み取りが難しく、また、測定項目である色の種類が多かったため、とても
時間がかかってしまいました。しかし、光センサーの特徴をちゃんと理解して、コース認識にはどのように
使えば良いかを考えられるのは重要です。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120114-4.gif" alt=""  />
</p>



<h3>５日目　コースを走行させるアルゴリズムを完成する</h3>
<p>
　5日目は光センサーをロボットカーに取り付けて、ロボットカーがコースを認識して、走行するように
アルゴリズムを改善しました。また、ロボットカーの動力をPWM制御によって、調節してゴールまでの
時間が短縮できるように繰り返しパラメータを設定してもらいました。結果として、コースの一周に要する
平均時間が21.24秒でした。また、最短記録を出したチームは、一周8.2秒まで短縮することができました。
その時のパラメータは以下のようなりました。
</p>
<p>
・左モータの強さ：75％<br />
・右モータの強さ：77％<br />
・前進する時の動力：50％<br />
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120114-5.gif" alt=""  />
</p>

<br />
<h2>まとめ</h2>
<p>
自分が作成したアルゴリズムによるロボットカーの動きを観測することで、受講生全員、自らのアルゴ
リズムの問題点を見つけることができ改善することができた。さらに、改善を繰り返すことでより良いア
ルゴリズムを構築することができました。また、授業中に受講生同士が積極的に議論する場面も見られ、
更なる改善が成された。最終的には講師が想定したコースタイムよりも大幅に上回り、本講座の目的であ
る問題解決能力を十分に養うことができた。
</p>

<br />
<h2>反省点</h2>
<p>
コンピュータプログラミング開発環境LabVIEW の習得に課題<br />
＊原因：本講座は週一回開講のため、一週間の間にLabVIEW の使い方を忘れてしまう<br />
＊解決：コンピュータプログラミングを含む講座の場合、講座の開講日程は連続で行うべき<br />
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tanki7.gif" src="http://www.natural-science.or.jp/images/tanki7.gif" width="168" height="159" class="mt-image-none" style="" /></span>
-->


]]>
        
    </content>
</entry>

<entry>
    <title>夏休み科学実験工作教室  「デジタルオルゴールを作ってみよう! （2時間×4回）」の報告</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120112165654.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13014</id>

    <published>2012-01-12T07:56:54Z</published>
    <updated>2012-01-12T08:01:18Z</updated>

    <summary> 夏休み科学実験工作教室「デジタルオルゴールを作ってみよう! （２時間×４回）」...</summary>
    <author>
        <name>イットワンシット</name>
        
    </author>
    
        <category term="体験編" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="デジタルオルゴール" label="デジタルオルゴール" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="報告" label="報告" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="夏休み" label="夏休み" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[
<p style="border:solid 1px gray; padding:10px 10px">
<a href="http://www.natural-science.or.jp/article/20110702235206.php">夏休み科学実験工作教室「デジタルオルゴールを作ってみよう! （２時間×４回）」</a>では、小学校高学年の生徒を対象に、回路の基礎、プログラミングの基本を学ぶとともにものづくりの全体像を理解してもらうことを目的として行いました。2時間×4日間で、ディジタルオルゴールを完成させるのが目標です。
</p>

<h2>１日目　電子工作の基礎をかためる（半田づけの基本、部品の付け方、配線）</h2>
<p>
１日目は半田づけの練習から始め、抵抗、LEDの付け方を練習し、LEDの点灯回路を製作し、部品の配線について学びます。すべての電子工作の基本である半田づけの技術を学び、次にLEDを光らせる回路に取り組みました。オルゴールの製作の工夫として、(+)と(-)線をすずめっき線で配線してもらいました。LED回路を作る時はそのすずめっき線から引張って来て、部品を配線してもらいました。LEDと抵抗の置く場所によって同じ回路でもより簡単に配線できることにつて考えてもらいました。
</p>

<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-30.gif" alt=""  />
</p>
<br />

<h2>２日目　回路図を学ぶ</h2>
<p>
２日目は部品の記号について学び、回路図の基礎、回路図の役割について説明し、オルゴールの回路を作成しました。回路図とは、部品のつなぎ方を記号を使って図にしたものである。複雑な回路を解読しやすくするために回路図が用いられます。回路図が読めて、オルゴールの基本回路が作成できます。<br />
マイコンのピン置が間違わないようにマイコンを先に基板に半田付けしてピン番号を基板上で書いてもらいました。回路図を読んで、実際の基板上で配線してオルゴールのハードウェアを完成しました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-31.gif" alt=""  />
</p>
<br />

<h2>３日目　プログラミングの基礎を学ぶ</h2>
<p>
３日目はパソコンのキーボードから文字や数字などの入力練習をしてオルゴールのプログラムを書くのに必要な知識を学びました。そのあと、曲を生成するプログラムに挑戦してもらいました。人間 には機械(パソコン)の言葉はわからないし機械（パソコン)も人間 の言葉は分かりません。そのために人間が理解できるプログラムを書いて、コンパイラを通して機械が分かる言葉に変換する必要があります。プログラムを書くにはたくさんの約束があり、その約束通りに書かないとコンパイルするときにエラーが出ます。エラーが出た時の解決方法を説明し、実際にエラーとなるプログラムを繰り返し書いて、生徒たちに考えて直してもらいました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-32.gif" alt=""  />
</p>
<br />
<h2>４日目　好きな曲をプログラムする</h2>
<p>
　４日目は各自の好きな曲を自分で用意して、プログラミングしてもらいました。プログラムを書いて、コンパイルして、マイコンに曲を入れる方法を学びました。また、エラーが出た時、しっかりと対処できるように解決方法を覚えてもらいました。生徒たちが興味を示して自分が持ってきた曲が聴けるために真剣に取り組んで頂いています。生徒たちが作った曲は「海底大戦争」、「マルマルモルモリ」、「崖の上のポニョ」、「メヌエット」、「エリーゼのために」などでした。<br />
　このオルゴールの製作を通して回路の基礎、プログラミングの基本を学ぶとともに楽しみながらものづくりの全体像を理解して頂きます。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-33.gif" alt=""  />
</p>


<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tanki3.gif" src="http://www.natural-science.or.jp/images/tanki3.gif" width="168" height="159" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>週末科学実験講座「色測定器をつくろう～色ってなんだろう～」報告書</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120112155036.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13012</id>

    <published>2012-01-12T06:50:36Z</published>
    <updated>2012-01-14T06:56:33Z</updated>

    <summary> 10 月15 日( 土) から11 月12 日( 土) にかけて、毎週土曜日に...</summary>
    <author>
        <name>茅根 慎通</name>
        <uri>http://www.natural-science.or.jp/</uri>
    </author>
    
        <category term="体験編" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="報告" label="報告" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="色" label="色" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="週末科学講座" label="週末科学講座" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p style="border:solid 1px gray; padding:10px 10px">
10 月15 日( 土) から11 月12 日( 土) にかけて、毎週土曜日に全5 回( 各2 時間)の週末科学実験講座をFiveBridge 会議室（仙台市青葉区北目町4-7 HSG ビル３階）において実施し、小学生４人が受講した。以下に、本講座の報告をする。
</p>

<h2>1. 講座の目的</h2>
<p>
<img src="http://www.natural-science.or.jp/img3/tanki6.gif" alt="" style="float:right; margin:0px 0px 20px 20px" />
色が3 色の光からなることは知識としては持っているが、これを実感できる機会は少ない。そこで本講座では、色を定量化する、色測定器を製作し、色の測定を行うことにした。この制作・実験を通して、光の3 原色を実感を伴って理解することが本講座の目的である。
</p>

<br />
<h2>2. 色測定器の原理</h2>
<p>
物体の色はRGB3 色の光が反射される割合で決まる。今回の色測定器では、3 色の反射光の強さを別々に電気抵抗に変換することで反射光の強さを定量化し、色を測る。
</p>


<br />
<h2>3. 色測定器の実験結果を色の理解につなげる方法</h2>
<p>
色測定器の実験結果から、物の色がRGB の反射の割合で決まることを理解するためには、以下の２点が重要である。<br />
<br />
①反射光の強さと光センサの一種であるCdS の電気抵抗の定量的な関係の理解<br />
②RGB の光の組み合わせとできる色の対応の理解<br />
<br />
そこで、①のために、CdS の特性を実際に測る実験を行い、生徒一人ひとりにグラフを描かせた。②のために、３色LEDで色を混ぜる実験を行った。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-20.gif" alt=""  />
</p>

<br />
<h2>4. 本講座の構成</h2>
<p>
<img src="http://www.natural-science.or.jp/images/20120112-21.gif" alt="" style="float:right; margin:0px 0px 20px 20px" />
本講座の目的を達成するために、講座の構成を以下のように計画した。<br />
1 日目：はんだ付けの練習をし、基本的な工作技術を身につける。<br />
2 日目：3 色の光で様々な色の光を作れることを理解する。<br />
3 日目：CdS の定量的な性質を理解する。<br />
4 日目：色測定器を作り、実験する。<br />
5 日目：色測定器を使って様々な色を測り、色とは何か理解する。<br />
</p>


<br />
<h2>5. 講座の様子</h2>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-22.gif" alt=""  />
</p>




<br />
<h2>6. 講座の結果</h2>
<p>
2 日目までは予定通り順調に進んでいたが、3 日目から、はんだ付けの未熟さのために、製作した回路の故障が相次ぎ、ややスケジュールが遅れてしまった。結局4 人中1 人はCdS の特性を自分で測ることが出来なかった。しかし、その生徒もCdS の定性的な理解をすることはできた。光測定器も、4 人中1 人は完成させることが出来なかった。その生徒には、講師が用意していた予備を貸しだした。<br />
<br />
色測定器が測っている光の強さが反射光の強さであるということが十分に理解されていなかったために、色測定器の実験結果から「色とは何か」に対する答えを導く際に講師からの誘導がかなり必要になってしまった。しかしながら最終的には、生徒自ら答えを導くことができ、全員が色とはRGB の３色の光の反射の割合で決まることを理解することができた。
</p>

<br />
<h2>7. 反省点</h2>
<p>
・色測定器が測っているものが反射光の強さであることが十分に理解されていなかったため、いきなりセンサを使って測るのではなく、反射光が明るいか暗いかを目で確認するような実験をはさむべきだった。<br />
・はんだ付けの技術不足による回路故障が目立ったため、はんだ付けの練習にもっと時間をかけるべきだった。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tanki6.gif" src="http://www.natural-science.or.jp/images/tanki6.gif" width="168" height="159" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>「ロボコンマガジン 2012年1月号」に 「natural science 科学講座」受講生の記事が掲載されました</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120112135039.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13010</id>

    <published>2012-01-12T04:50:39Z</published>
    <updated>2012-01-12T04:53:21Z</updated>

    <summary> 「第23回 知能ロボットコンテスト 2011」に出場し「メカトロで遊ぶ会賞」を...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="パブリシティ" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ロボコンマガジン" label="ロボコンマガジン" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="受賞" label="受賞" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
「第23回 知能ロボットコンテスト 2011」に出場し「メカトロで遊ぶ会賞」を受賞した、
「<a href="http://www.science-lecture.com/">natural science 科学講座</a>」受講生の野口宙くん（富谷町立成田中学校1年生、受講歴3年）と平塚薫（大野田小学校5年、受講歴1年）の記事が掲載されました。
</p>
<p style="text-align:center">
<img src="http://www.science-lecture.com/images/20120112-11.gif" alt="" />
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120112-10.jpg" src="http://www.natural-science.or.jp/images/20120112-10.jpg" width="600" height="805" class="mt-image-none" style="" /></span>-->

]]>
        
    </content>
</entry>

<entry>
    <title>夏休み科学実験工作教室  「LEDライトと扇風機を作ってみよう! （２時間×４回）」の報告</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120112104457.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13013</id>

    <published>2012-01-12T01:44:57Z</published>
    <updated>2012-01-12T08:01:30Z</updated>

    <summary> 夏休み科学実験工作教室「LEDライトと扇風機を作ってみよう! （２時間×４回）...</summary>
    <author>
        <name>イットワンシット</name>
        
    </author>
    
        <category term="体験編" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ledライト" label="LEDライト" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="夏休み" label="夏休み" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="扇風機" label="扇風機" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p style="border:solid 1px gray; padding:10px 10px">
<a href="http://www.natural-science.or.jp/article/20110702235206.php">夏休み科学実験工作教室「LEDライトと扇風機を作ってみよう! （２時間×４回）」</a>では、小学校高学年の生徒を対象に、電流の「向き」と「大きさ」を理解してもらうことを目的として行いました。2時間×4日間で、LEDライトと扇風機を完成させる
のが目標です。
</p>

<h2>１日目　電子工作の基礎をかためる（半田づけの基本、LEDの点灯）</h2>
<p>
１日目は半田づけの練習から始め、LEDの点灯回路を製作し抵抗について学びます。すべての電子工作の基本である半田づけの技術を学び、次にLEDを光らせる回路に取り組みました。実は受講生が作ったLED回路にある抵抗は、全部違う値のものを用意していました。見比べてみると全く明るさが違います。全員でLEDの明るさの順位付けをしたあと、その順位と抵抗の値との関係を考えてもらいました。
</p>

<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-30.gif" alt=""  />
</p>
<br />

<h2>２日目　電気の流れを考える（回路図について学ぶ）</h2>
<p>
２日目は、電気の流れを考える上で重要となる回路図を理解し、電流の流れを切り替えるはたらきをするスイッチについて学びます。受講生は、回路図の読み方を学び、１日目につくった回路と、それの回路図をつきあわせて電流の流れる経路を考えました。さらに、スイッチでLEDに流れる電流を切り替える回路をつくりました。回路図が複雑になるにつれ、回路における電流の流れを理解できなくなる受講生もいました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-31.gif" alt=""  />
</p>
<br />

<h2>３日目　電流の大きさを考えてつくる（LEDライトの製作）</h2>
<p>
３日目は、１日目に考えたLEDと抵抗の関係をもとに、受講生が自分の作りたいライトに合わせて選んだ抵抗を使って白色LEDライトをつくります。受講生は、課題となるLEDライトの回路図から自分のライトの回路を配線し、半田づけしました。２日目に扱ったスイッチの知識を生かしてON-OFFスイッチを取り付けた受講生や、スイッチを使って抵抗の値を切り替えることで「明・暗」の二つのモードを設けたLEDライトを完成させた受講生もいました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-32.gif" alt=""  />
</p>
<br />
<h2>４日目　電流の大きさを考えてつくる②（扇風機の製作）</h2>
<p>
４日目は、モーターに加え、これまでに扱ってきた抵抗とスイッチを用いて風量の「強・弱」モードがある扇風機を製作します。まずはモーターに電流を流す向きを変えると回転の向きが変わることを確認し、次に抵抗をつなぐことでモーターが減速することを確認しました。全員が扇風機を完成させたあと、これまでに得た知識を活用して受講生は回転速度を自分の好みに調整することができました。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120112-33.gif" alt=""  />
</p>
<p>
今回の講座では、先に掲げた目的に加え、受講生には「自分の作りたいもの」をつくるためには何が必要なのか？を考え試行錯誤するという過程を通じ、ものづくりの面白さにふれてもらうことができたと思います。
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="tanki3.gif" src="http://www.natural-science.or.jp/images/tanki3.gif" width="168" height="159" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>プランクの放射法則４．任意の温度に対する完全導体中の電磁波シミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120106164405.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13004</id>

    <published>2012-01-06T07:44:05Z</published>
    <updated>2012-01-06T07:50:23Z</updated>

    <summary> 量子力学の創成に重要な影響を与えたプランクの放射法則のシミュレーションを行いま...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シミュレーション" label="シミュレーション" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="完全導体" label="完全導体" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="時間発展" label="時間発展" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="電磁波" label="電磁波" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p style="border:solid 1px gray; padding:10px 10px">
量子力学の創成に重要な影響を与えたプランクの放射法則のシミュレーションを行います。<br />
本稿では、完全導体で囲まれた真空中における電磁波の基本モードを用いた各種シミュレーションを次のステップで行います。<br />
１．<a href="http://www.natural-science.or.jp/article/20111230191657.php">プランクの法則の解析解</a><br />
２．<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a><br />
３．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a><br />
４．<a href="http://www.natural-science.or.jp/article/20120106164405.php">任意の温度に対する完全導体中の電磁波シミュレーション</a>
</p>
<p>
本稿の目的である「プランクの放射法則」の理解の最後として、任意の温度に対する完全導体中の電場の時間発展を計算します。
完全導体中の電磁波復習ついでに、計算までの道筋を示します。<br />
</p>
<br />
<h3>（１）完全導体中の電磁波のモード</h3>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20111213-7.gif" alt="">
</div>
<p>
<?php WriteEquation("E_x, E_y, E_z") ?>は互いに独立ではなく、
電磁波の波数ベクトル<?php WriteEquation("\mathbf{k}=(k_x,k_y,k_z)") ?>によって決まります。ただし、<em>電磁波の振幅は任意</em>です。
<?php WriteEquation("(E_x,E_y,E_z)") ?>と<?php WriteEquation("\mathbf{k}") ?>の関係は、
「２．<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a>」
で示したとおりです。
</p>

<h3>（２）エネルギーの量子化による電場強度の制限</h3>
<p>
「３．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a>」で示したとおり、
<strong>エネルギーの量子仮説</strong>を課すことで、電場強度は
</p>
<div class="waku">
<div style="float:right">(2)</div>
<img src="http://www.natural-science.or.jp/images/20111229-8.gif" alt="">
</div>
<p>
となります。
ここで重要なのは、平均励起数<?php WriteEquation("\bar{n}") ?>は温度<?php WriteEquation("T") ?>と角振動数<?php WriteEquation("\omega") ?>に依存することです。つまり、エネルギーの量子仮説は<em>電磁波の振幅に制限</em>を加えることを意味します。
ただし、<?php WriteEquation("\omega") ?>は電磁波の波数ベクトル<?php WriteEquation("\mathbf{k}") ?>で決まります。
</p>

<h3>（３）電場強度の決定と各電場モードの重ね合わせ</h3>
<p>
完全導体中の任意の電場<?php WriteEquation("\mathbf{E}") ?>は、
電磁波の波数ベクトル<?php WriteEquation("\mathbf{k}") ?>と垂直で、互いにも垂直な<?php WriteEquation("\mathbf{E}_1") ?>、<?php WriteEquation("\mathbf{E}_2") ?>に分解することができます。
さらに、熱によって励起された電磁波の各電場振幅<?php WriteEquation("|\mathbf{E}_1|,\, |\mathbf{E}_2|") ?>は（等重率の原理的に？）等しいと仮定します。つまり、
</p>
<div class="waku">
<div style="float:right">(3)</div>
<img src="http://www.natural-science.or.jp/images/20120106-2.gif" alt="" class="e2"><br />
<img src="http://www.natural-science.or.jp/images/20120106-3.gif" alt="" class="e2"><br />
<img src="http://www.natural-science.or.jp/images/20120106-4.gif" alt="">
</div>
<p>
と表せます。くどいですが、<?php WriteEquation("E_1") ?>,<?php WriteEquation("E_2") ?>は、波数ベクトル<?php WriteEquation("\mathbf{k}=(k_x,k_y,k_z)") ?>に依存します。式(1)に対して、
「２．<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a>」
で示した<?php WriteEquation("(E_x, E_y, E_z)") ?>の関係を踏まえて、
各モード<?php WriteEquation("\mu_x,\mu_y,\mu_z") ?>の電磁波は
</p>
<div class="waku">
<div style="float:right">(4)</div>
<img src="http://www.natural-science.or.jp/images/20120106-5.gif" alt="">
</div>
<p>
となります。<?php WriteEquation("\mathbf{E}_2") ?>も同様です。
任意の温度<?php WriteEquation("T") ?>に対する最終的な電場は、
各モード<?php WriteEquation("\mu_x,\mu_y,\mu_z") ?>に対する電場の和で得られます。また、<?php WriteEquation("\mathbf{E}_2") ?>も加えます。つまり、
</p>
<div class="waku">
<div style="float:right">(5)</div>
<img src="http://www.natural-science.or.jp/images/20120106-6.gif" alt="">
</div>
<p>
となります。
</p>

<h2>任意の温度に対する完全導体中の電磁波シミュレーション</h2>
<p>
一辺がL=5000[nm]の完全導体中の電磁波Ezの時間発展（温度 T=300[K]）。<br />
<br />
横軸 x[nm] <br />
縦軸 y[nm] <br />
カラーバー：電場強度 [a.u.] <br />
時間間隔：Δt=10^{-16}[s]<br />
<br />
※z=L/2 の断面における電場を描画
</p>

<h3><?php WriteEquation("T=100\,[\rm K]") ?></h3>

<h4 style="text-align:center"><?php WriteEquation("E_x") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/8I2mZVKP9oA" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_y") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/qLBijlCXDSg" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_z") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/KW3lJJ3Bsvc" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("|\mathbf{E}|") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/qUWeu88_EZ4" frameborder="0" allowfullscreen></iframe>
</div>
<p>
<?php WriteEquation("T=100\,[\rm K]") ?>では、
「２．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a>」で示したとおり、ほとんど最低次のモードしか励起していないため、時間的に周期的な振る舞いとなっています。
</p>

<h3><?php WriteEquation("T=300\,[\rm K]") ?></h3>
<h4 style="text-align:center"><?php WriteEquation("E_x") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/3U7Hz5nT9qE" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_y") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/jCdb7ta34VA" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_z") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/CHN0H5eBCpc" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("|\mathbf{E}|") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/M0HWghUfszs" frameborder="0" allowfullscreen></iframe>
</div>

<p>
<?php WriteEquation("T=300\,[\rm K]") ?>では、
「２．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a>」で示したとおり、最低次のモードとあと２つのモードしか励起していません。ただし、<?php WriteEquation("T=100\,[\rm K]") ?>と比べて、<em>電場の振幅は約800倍</em>です。
</p>

<h3><?php WriteEquation("T=1000\,[\rm K]") ?></h3>

<h4 style="text-align:center"><?php WriteEquation("E_x") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/PS416wBt6G4" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_y") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/CBzQWnukXk8" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("E_z") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/cnr5nEwaKlI" frameborder="0" allowfullscreen></iframe>
</div>

<h4 style="text-align:center"><?php WriteEquation("|\mathbf{E}|") ?></h4>
<div style="text-align:center">
<iframe width="480" height="360" src="http://www.youtube.com/embed/TcGyub3OcvE" frameborder="0" allowfullscreen></iframe>
</div>

<p>
<?php WriteEquation("T=1000\,[\rm K]") ?>では、
「２．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a>」で示したとおり、様々なモードが励起されています。それにともなって、
<em>電場の振幅は約10000倍</em>です。
</p>



<br />
<h2>C言語プログラムソース</h2>
<pre class="brush: cpp;">
/*
完全導体中の電場の時間依存性
（2012.01.06公開）
*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;complex&gt;
#if defined(_OPENMP)
  #include &lt;omp.h&gt;
#endif
#if defined(_MSC_VER)
  #include &lt;direct.h&gt;   // Windowsフォルダ作成用
#elif defined(__GNUC__)
  #include &lt;sys/stat.h&gt; //  UNIX系ディレクトリ作成用
#endif
using namespace std;

const double PI = acos(-1.0);
const double e = 2.7182818284590452354;
const complex&lt;double&gt; I = complex&lt;double&gt;(0.0,1.0);
const double c = 2.99792458E+8;
const double lambda0 = 500.0E-9;
const double mu0 = 4.0*PI*1.0E-7;
const double epsilon0 = 1.0/(4.0*PI*c*c)*1.0E+7;
const double h  = 6.6260896 * 1.0E-34;
const double hbar = h/(2.0*PI);
const double me = 9.10938215 * 1.0E-31;
const double eV = 1.60217733 * 1.0E-19;
const double kB = 1.3806503  * 1.0E-23;


const int Lx=5000, Ly=5000, Ld=50;
const double dz = 1.0E-9; //XY平面を描画する際には dz = 1.0E-8
const double dt = 1.0E-16;
const double L = Lx * dz; 
const double V = pow(L,3);

const int ts = 0, te = 1000;                   //&lt;------------ステップ数を指定

string folder = &quot;BlackBody3&quot;;//作成するフォルダ名
char str[200];
int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif
  #if defined(_OPENMP)
    omp_set_num_threads(7);
    cout &lt;&lt; &quot;OpenMPを利用します（最大スレッド数：&quot; &lt;&lt; omp_get_max_threads() &lt;&lt; &quot;）&quot; &lt;&lt;  endl;
  #endif

  const int n_max = 10;
  double z = L/2.0;
  for(double T=1000.0; T&lt;=1000.0; T+=200.0){
    cout &lt;&lt; T &lt;&lt; endl;
    char str[200];
    sprintf(str, &quot;/%d&quot;, int(T));
    string folder_n = folder + str;
    #if defined(_MSC_VER)
      _mkdir(folder_n.c_str());  // Windowsフォルダ作成
    #elif defined(__GNUC__)
      mkdir(folder_n.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
    #endif

    #pragma omp parallel
    {
      #pragma omp for //schedule(dynamic, 100)
      for(int tn=ts; tn&lt;=te; tn++)
      {
        double t_real = dt * double(tn);
        //cout &lt;&lt;  tn &lt;&lt; endl;
        char str[200];
        string str1;
        ofstream fout_s, fout_p;
        sprintf(str, &quot;/%d/s%d.data&quot;,  int(T) , tn); str1 = folder + str;
        fout_s.open(str1.c_str());

        for(int ix=0; ix&lt;=Lx ;ix=ix+Ld)
        {
          for(int iy=0 ; iy&lt;=Lx ;iy=iy+Ld)
          {
            double x = ix *dz, y = iy*dz;
            complex&lt;double&gt; EE1[3] ={0.0}, EE2[3] = {0.0};

            for(int nux=0; nux&lt;=n_max; nux++ )
            {
              for(int nuy=0; nuy&lt;=n_max; nuy++ )
              {
                for(int nuz=0; nuz&lt;=n_max; nuz++ )
                {
                  if((nux==0 &amp;&amp; nuy==0) || (nuy==0 &amp;&amp; nuz==0) || (nuz==0 &amp;&amp; nux==0) ) continue;
                  double kx = PI/L * double(nux);
                  double ky = PI/L * double(nuy);
                  double kz = PI/L * double(nuz);
                  double k = sqrt(pow(kx,2)+pow(ky,2)+pow(kz,2));
                  double omega = c * k;
                  double nbar = 1.0/(exp((hbar*omega)/(kB*T))-1.0);
                  double EE = sqrt(1.0/V * 16.0/epsilon0 * nbar * hbar * omega)/sqrt(2.0);
                  double E1x,E1y,E1z,E2x,E2y,E2z;
                  if(nux==0){
                    E1x = EE;
                    E1y = 0;
                    E1z = 0;
                    E2x = 0;
                    E2y = EE         /sqrt(pow(1.0, 2)+pow(-ky/kz, 2));
                    E2z = EE*(-ky/kz)/sqrt(pow(1.0, 2)+pow(-ky/kz, 2));
                  }else if(nuy==0){
                    E1x = 0;
                    E1y = EE;
                    E1z = 0;
                    E2x = EE         /sqrt(pow(1.0, 2)+pow(-kx/kz, 2));
                    E2y = 0;
                    E2z = EE*(-kx/kz)/sqrt(pow(1.0, 2)+pow(-kx/kz, 2));
                  }else if(nuz==0){
                    E1x = 0;
                    E1y = 0;
                    E1z = EE;
                    E2x = EE         /sqrt(pow(1.0, 2)+pow(-kx/ky, 2));
                    E2y = EE*(-kx/ky)/sqrt(pow(1.0, 2)+pow(-kx/ky, 2));
                    E2z = 0;
                  }else{
                    E1x = EE         /sqrt(pow(1.0, 2)+pow(-kx/ky, 2));
                    E1y = EE*(-kx/ky)/sqrt(pow(1.0, 2)+pow(-kx/ky, 2));
                    E1z = 0;
                    E2x = EE                       /sqrt(pow(1.0, 2)+pow(ky/kx, 2)+pow(-kx/kz - ky*ky/(kz*kx), 2));
                    E2y = EE*(ky/kx)               /sqrt(pow(1.0, 2)+pow(ky/kx, 2)+pow(-kx/kz - ky*ky/(kz*kx), 2));
                    E2z = EE*(-kx/kz-ky*ky/(kz*kx))/sqrt(pow(1.0, 2)+pow(ky/kx, 2)+pow(-kx/kz - ky*ky/(kz*kx), 2));
                  }
                  EE1[0] += E1x*cos(kx*x)*sin(ky*y)*sin(kz*z) * exp(-I*omega*t_real);
                  EE1[1] += E1y*sin(kx*x)*cos(ky*y)*sin(kz*z) * exp(-I*omega*t_real);
                  EE1[2] += E1z*sin(kx*x)*sin(ky*y)*cos(kz*z) * exp(-I*omega*t_real);
                  EE2[0] += E2x*cos(kx*x)*sin(ky*y)*sin(kz*z) * exp(-I*omega*t_real);
                  EE2[1] += E2y*sin(kx*x)*cos(ky*y)*sin(kz*z) * exp(-I*omega*t_real);
                  EE2[2] += E2z*sin(kx*x)*sin(ky*y)*cos(kz*z) * exp(-I*omega*t_real);
                }
              }
            }
            fout_s  &lt;&lt; x/dz  &lt;&lt; &quot; &quot; &lt;&lt; y/dz &lt;&lt; &quot; &quot;  &lt;&lt; EE1[0].real()+EE2[0].real() &lt;&lt; &quot; &quot; &lt;&lt; EE1[1].real() +EE2[1].real()&lt;&lt;  &quot; &quot; &lt;&lt; EE1[2].real() + EE2[2].real() &lt;&lt; &quot; &quot;&lt;&lt; sqrt(pow(abs(EE1[0]+EE2[0]),2)+pow(abs(EE1[1]+EE2[1]),2)+pow(abs(EE1[2]+EE2[2]),2)) &lt;&lt; endl;
          }
          fout_s &lt;&lt;&quot;&quot;&lt;&lt; endl;
        }
        fout_s.close();
      }
    }
    /*
    for(int i=0; i &lt;= n_max*n_max*n_max; i++ ){
      if(count[i]!=0){
        double omega = c * PI/L * sqrt(double(i));
        double lambda = (2.0*PI*c)/omega;
        double EE = E[i] * count[i];
        fout_s &lt;&lt; lambda &lt;&lt; &quot; &quot; &lt;&lt; EE &lt;&lt; endl;
      }
    }
    */
  }
}
</pre>

<h2>ファイル</h2>
<h3>C言語ソースファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody4.cpp" target="_blank">完全導体中の電場の時間依存性</a><br />
</p>
<h3>動画、gnuplot テンプレート、Illustrator ファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/blackbody4.zip" target="_blank">完全導体中の電場の時間依存性</a><br />
</p>



<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120106-1.gif" src="http://www.natural-science.or.jp/images/20120106-1.gif" width="600" height="480" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>gnuplot ３次元カラーマップで補間（interpolate）</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120105114833.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13002</id>

    <published>2012-01-05T02:48:33Z</published>
    <updated>2012-01-05T02:51:09Z</updated>

    <summary> ３次元の計算結果をプロットする際によく利用するのが gnuplot の カラー...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="3d" label="3D" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gnuplot" label="gnuplot" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="interpolate" label="interpolate" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="カラーマップ" label="カラーマップ" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="補間" label="補間" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
３次元の計算結果をプロットする際によく利用するのが gnuplot の カラーマップ表示（set pm3d map）です。
「pm3d」のデフォルトの設定では、与えたデータ数が少ないとデータ間を単一色で塗りつぶされてしまい、パッチワークの様になってしまいます。その際に、データ間を中間色で補間する設定を行うのがpm3dの「interpolate」オプションです。
</p>
<p>
※関数に対する描画間隔の設定は samples、 isosamples オプションで設定することができます。
</p>

<h2>interpolate 設定方法</h2>
<pre>
set pm3d interpolate &lt;steps in scan&gt;,&lt;steps between scans&gt;
</pre>
<p>
パラメタの詳細については、下記の外部ページを参考ください。
</p>
<p>
■<a href="http://takeno.iee.niit.ac.jp/~foo/gp-jman/data/20070304/gnuplot-ja-div/node214.html" target="_blank">43.49 Pm3d</a> (竹野茂治 氏)<br />
■<a href="http://www-ise2.ist.osaka-u.ac.jp/~shinkai/gnuplot/" target="_blank">タイトル未定: Gnuplot</a> (新開健一氏)<br />
</p>

<h2>interpolate の使用例</h2>
<p>
次のような２次元ガウス分布を用意し、<?php WriteEquation("-1\leq x \leq 1") ?>、<?php WriteEquation("-1\leq y \leq 1") ?>の範囲を<?php WriteEquation("10\times10") ?>に分割してファイルに出力します（参考：<a href="http://www.natural-science.or.jp/article/20120101230008.php" target="_blank">１次元ガウシアンのスプライン補間を試す</a>）。
</p>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20120105-0.gif" alt="">
</div>

<p>
その後、以下の<a href="#t">テンプレート</a>を用いてカラーマップ表示する際に、「interpolate」のパラメータを変えてプロットしたのが次の結果です。
</p>
<div class="ImageList">
	<span>「interpolate」 なし</span>
<img src="http://www.natural-science.or.jp/images/20120105-i0.gif" alt="" />
</div>

<div class="ImageList">
	<span>interpolate 5,5</span>
<img src="http://www.natural-science.or.jp/images/20120105-i5.gif" alt="" />
</div>

<div class="ImageList">
	<span>interpolate 10,10</span>
<img src="http://www.natural-science.or.jp/images/20120105-i10.gif" alt="" />
</div>

<div class="ImageList">
	<span>interpolate 15,15</span>
<img src="http://www.natural-science.or.jp/images/20120105-i15.gif" alt="" />
</div>
<p>
ガウス分布の外形もわからない「「interpolate」なし」の場合と比べて、パラメータの数値が大きいほど、滑らかになっていることがわかります。
「interpolate 5,5」とすることで、たった<?php WriteEquation("10\times10") ?>に対するデータでも、ガウシ分布の外形を理解することができます。
ただし、「interpolate 10,10」「interpolate 15,15」では、ガウス分布の中心に本来はないはずの十字の線があるように見えます。
つまり、「interpolate 」オプションを利用した補間時の問題点といえるかもしれません。大きくしすぎないようにすべきですね。
</p>

<h2>gnuplot によるカラーマップ表示の最適値</h2>
<p>
本稿では terminalで「gif」を選択し、gifファイルのサイズ「600×480」ピクセルに指定しています。
その際に、上記ののような<?php WriteEquation("x-y") ?>平面の分割数が<?php WriteEquation("10\times10") ?>では足りません。
そこで、元データで<?php WriteEquation("100\times100") ?>に分割に対するデータを用意し、「interpolate」オプションを試してみます。
ちなみに
</p>
<div class="ImageList">
	<span>「interpolate」</span>
<img src="http://www.natural-science.or.jp/images/20120105-r.gif" alt="" />
</div>
<div class="ImageList">
	<span>interpolate 5,5</span>
<img src="http://www.natural-science.or.jp/images/20120105-r5.gif" alt="" />
</div>
<p>
「「interpolate」なし」の場合でも、十分ですが、「interpolate 5,5」で、色の段差がほとんどわからなくなりました。
元データのサイズを大きくするほど、描画は正確になり、色合いは滑らかになります。
しかしながら、データサイズは<?php WriteEquation("10\time10") ?>→<?php WriteEquation("100\times100") ?>で100倍と飛躍的に大きくなります。また、計算時間も計算方法によっては100倍となります。
つまり、計算結果を gnuplot を用いて描画するぐらいであれば、<?php WriteEquation("100\times100") ?>で「interpolate 5,5」と設定するのが最適ですね。
</p>


<h2>プログラムソース</h2>
<h3 id="t">gnuplot テンプレート</h3>
<pre>
set pm3d                           ## 3次元カラー表示
set pm3d map                       ## カラーマップ表示
set ticslevel 0
set cbrange[0:1]
set palette defined ( 0 &quot;black&quot;, 1 &quot;white&quot;)

set nokey
set tics font 'Times,14'
set size square

set xr[-1:1]            ##&lt;---------描画x軸の範囲
set yr[-1:1]            ##&lt;---------描画y軸の範囲

set terminal gif optimize size 600, 480
set output '0.gif'
splot &quot;f.data&quot; u 1:2:3 with pm3d

set pm3d interpolate 5, 5          ## 補間
set output '5.gif'
splot &quot;f.data&quot; u 1:2:3 with pm3d

set pm3d interpolate 10, 10          ## 補間
set output '5.gif'
splot &quot;f.data&quot; u 1:2:3 with pm3d

set pm3d interpolate 15, 15          ## 補間
set output '15.gif'
splot &quot;f.data&quot; u 1:2:3 with pm3d
</pre>


<h3>２次元ガウス分布の出力（C言語）</h3>
<pre class="brush: cpp;">
/*
２次元ガウス分布
*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;fstream&gt;
#include &lt;string&gt;
#include &lt;direct.h&gt;   // Windowsフォルダ作成用
using namespace std;

const int N=10;

char str[200];
string folder = &quot;data&quot;;//作成するフォルダ名
int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif

  string str1;
  ofstream fout_s;
  sprintf(str, &quot;/f.data&quot;); str1 = folder + str;
  fout_s.open(str1.c_str());

  double x_min=-1.0, x_max =1.0;
  double y_min=-1.0, y_max =1.0;

  for(int i=0; i&lt;=N; i++){
    for(int j=0; j&lt;=N; j++){
      double x = x_min + (x_max - x_min) * double(i)/double(N);
      double y = y_min + (y_max - y_min) * double(j)/double(N);
      double f = exp(-10.0*(pow(x,2)+pow(y,2)));
      fout_s &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; y &lt;&lt; &quot; &quot; &lt;&lt; f &lt;&lt; endl;
    }
    fout_s &lt;&lt;endl;
  }
  fout_s.close();
}
</pre>


<h2>その他の参考ページ</h2>
<p>
■ <a href="http://t16web.lanl.gov/Kawano/gnuplot/plot3d.html" target="_blank">gnuplot tips (not so Frequently Asked Questions)</a>（kawano 氏）<br />
■ <a href="http://ryukyu.astr.tohoku.ac.jp/pukiwiki/index.php?Members%2Fchinone%2F%B3%D0%BD%F1%2FGnuplot" target="_blank">Members/chinone/覚書/Gnuplot - Cosmological Experiment Group</a>(服部誠 氏)<br />
</p>


<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120105-r5.gif" src="http://www.natural-science.or.jp/images/20120105-r5.gif" width="600" height="480" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>１次元ガウシアンのスプライン補間を試す</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20120101230008.php" />
    <id>tag:www.natural-science.or.jp,2012://12.13001</id>

    <published>2012-01-01T14:00:08Z</published>
    <updated>2012-01-01T14:02:14Z</updated>

    <summary> スプライン補間とは、グラフ上の点を多項式を用いて曲線をでつなぐアルゴリズムで、...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ガウシアン" label="ガウシアン" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="スプライン補間" label="スプライン補間" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
スプライン補間とは、グラフ上の点を多項式を用いて曲線をでつなぐアルゴリズムで、
３次関数を用いる<em>３次スプライン補間</em>が一般的です。
本稿では、次式で与えられる１次元ガウシアンを、与えられた１０点を用いてスプライン補間を行います。
</p>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20120101-2.gif" alt="" />
</div>
<p>
式(1)で与えられるガウシアンから１０点を用意し、この点を用いてスプライン補間を行います。
</p>
<br />
<h2>計算結果</h2>
<p>
<span style="color:red">赤線</span>は式(1)の<?php WriteEquation("f(x)") ?>、<span style="color:blue">青の四角</span>は与えた１０点、
<span style="color:blue">青線</span>が与えた１０点を用いたスプライン補間。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20120101-1.gif" alt="" />
</p>
<p>
おおよそ、元のガウシアンと一致していることがわかります。
</p>

<h2>スプライン補間に関する参考ページ</h2>
<p>
■ <a href="http://next1.cc.it-hiroshima.ac.jp/MULTIMEDIA/numeanal1/node16.html" target="_blank">３次スプライン補間法</a>（横田壽 氏）<br />
■ <a href="http://www.akita-nct.ac.jp/yamamoto/lecture/2004/5E/interpolation/text/html/node3.html" target="_blank">3 スプライン補間</a>（山本昌志 氏）<br />
<!--gltest26 氏
http://maglog.jp/gltest/Article671351.html-->
</p>

<br />
<h2>C言語プログラムソース</h2>
<p>
中心アルゴリズムは<a href="http://chaste.web.fc2.com/Reference.files/Algo.html" target="_blank">pspline.c -- スプライン補間</a>（Hidekazu Ito 氏）から拝借しております。
</p>
<pre class="brush: cpp;">
/*
１次元ガウス分布のスプライン補間
（2012.01.01）
*/
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;math.h&gt;
#include &lt;iostream&gt;
#include &lt;fstream&gt;
using namespace std;

/***********************************************************
  pspline.c -- スプライン補間
  Hidekazu Ito 氏
  http://chaste.web.fc2.com/Reference.files/Algo.html
***********************************************************/
/* 周期関数用 */
#define  N  10
double xs[N + 1],
       ys[N + 1],
       zs[N + 1];

void maketable(double xs[], double ys[], double zs[])
{
  int i;
  double t;
  static double h[N + 1], d[N + 1], w[N + 1];

  for (i = 0; i &lt; N; i++) {
    h[i] = xs[i + 1] - xs[i];
    w[i] = (ys[i + 1] - ys[i]) / h[i];
  }
  w[N] = w[0];
  for (i = 1; i &lt; N; i++) d[i] = 2 * (xs[i + 1] - xs[i - 1]);
  d[N] = 2 * (h[N - 1] + h[0]);
  for (i = 1; i &lt;= N; i++) zs[i] = w[i] - w[i - 1];
  w[1] = h[0];  w[N - 1] = h[N - 1];  w[N] = d[N];
  for (i = 2; i &lt; N - 1; i++) w[i] = 0;
  for (i = 1; i &lt; N; i++) {
    t = h[i] / d[i];
    zs[i + 1] = zs[i + 1] - zs[i] * t;
    d[i + 1] = d[i + 1] - h[i] * t;
    w[i + 1] = w[i + 1] - w[i] * t;
  }
  w[0] = w[N];  zs[0] = zs[N];
  for (i = N - 2; i &gt;= 0; i--) {
    t = h[i] / d[i + 1];
    zs[i] = zs[i] - zs[i + 1] * t;
    w[i] = w[i] - w[i + 1] * t;
  }
  t = zs[0] / w[0];  zs[0] = t;  zs[N] = t;
  for (i = 1; i &lt; N; i++)
    zs[i] = (zs[i] - w[i] * t) / d[i];
}

double spline(double t, double xs[], double ys[], double zs[])
{
  int i, j, k;
  double d, h, period;

  period = xs[N] - xs[0];
  while (t &gt; xs[N]) t -= period;
  while (t &lt; xs[0]) t += period;
  i = 0;  j = N;
  while (i &lt; j) {
    k = (i + j) / 2;
    if (xs[k] &lt; t) i = k + 1;  else j = k;
  }
  if (i &gt; 0) i--;
  h = xs[i + 1] - xs[i];
  d = t - xs[i];
  return (((zs[i + 1] - zs[i]) * d / h + zs[i] * 3) * d
    + ((ys[i + 1] - ys[i]) / h
    - (zs[i] * 2 + zs[i + 1]) * h)) * d + ys[i];
}

int main(void)
{
  //１次元ガウシアン
  ofstream ofs( &quot;Gaussian1.data&quot; ); 
  for (int i=0; i&lt;=N; i++)
  {
    xs[i] = -1.0 + 2.0 * double(i)/double(N);
    ys[i] = exp( -10.0 * pow(xs[i],2));
    ofs &lt;&lt; xs[i] &lt;&lt; &quot; &quot; &lt;&lt; ys[i] &lt;&lt; endl;
  }
  ofs.close();
  maketable(xs, ys, zs);
  ofstream ofs1_2( &quot;Gaussian1_2.data&quot; ); 
  for (double x = -1.0; x &lt;= 1.0; x+=0.01)
  {
    ofs1_2 &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; exp( -10.0 * pow(x,2)) &lt;&lt; &quot; &quot; &lt;&lt; spline(x, xs, ys, zs) &lt;&lt; endl;
  }
  ofs1_2.close();
}

</pre>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20120101-1.gif" src="http://www.natural-science.or.jp/images/20120101-1.gif" width="579" height="403" class="mt-image-none" style="" /></span>
-->]]>
        
    </content>
</entry>

<entry>
    <title>プランクの放射法則３．完全導体で囲まれた空洞における各電場モード振幅の温度依存性</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20111230193653.php" />
    <id>tag:www.natural-science.or.jp,2011://12.12999</id>

    <published>2011-12-30T10:36:53Z</published>
    <updated>2012-01-06T07:48:37Z</updated>

    <summary> 量子力学の創成に重要な影響を与えたプランクの放射法則のシミュレーションを行いま...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="プランク" label="プランク" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="モード" label="モード" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="完全導体" label="完全導体" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="量子光学" label="量子光学" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p style="border:solid 1px gray; padding:10px 10px">
量子力学の創成に重要な影響を与えたプランクの放射法則のシミュレーションを行います。<br />
本稿では、完全導体で囲まれた真空中における電磁波の基本モードを用いた各種シミュレーションを次のステップで行います。<br />
１．<a href="http://www.natural-science.or.jp/article/20111230191657.php">プランクの法則の解析解</a><br />
２．<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a><br />
３．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a><br />
４．<a href="http://www.natural-science.or.jp/article/20120106164405.php">任意の温度に対する完全導体中の電磁波シミュレーション</a>
</p>
<p>
完全導体中には特定の電磁モードのみの存在が許されることは「<a href="http://www.natural-science.or.jp/article/20111214180854.php">２．完全導体で囲まれた空洞における電磁波の基本モード</a>」で示したとおりです。
しかしながら、各電場モードの強度は任意ではなく<em>エネルギー量子仮説</em>に従う必要があります。
つまり、各電場モードの強度は
</p>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20111229-6.gif" alt="">
</div>
<p>
を満たす必要があります。
左辺は空洞内の電磁波のエネルギー、右辺は角振動数<?php WriteEquation("\omega") ?>に対する量子化されたエネルギーを表します。
<?php WriteEquation("n") ?>は<?php WriteEquation("\omega") ?>の電磁波の励起数を表します。
電磁波の励起数の平均値<?php WriteEquation("\bar{n}") ?>はカノニカル分布から
</p>
<div class="waku">
<div style="float:right">(2)</div>
<img src="http://www.natural-science.or.jp/images/20111229-3.gif" alt="">
</div>
<p>
と与えられます。<?php WriteEquation("\bar{n}") ?>は温度<?php WriteEquation("T") ?>に依存し、
<?php WriteEquation("T") ?>が大きくなるほど<?php WriteEquation("\bar{n}") ?>も単調増加します。
</p>
<p>
以上のことを調べるために、本節では下図のような有限サイズ<?php WriteEquation("L") ?>の完全導体中の電磁波について考えます。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111229-9.gif" alt="">
</p>
<p>
電磁波の具体的表式は「<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a>」の式(3)で与えられ、式(1)の積分を実行することをができます。
</p>
<div class="waku">
<div style="float:right">(3)</div>
<img src="http://www.natural-science.or.jp/images/20111229-7.gif" alt="">
</div>
<p>
つまり、各電場モードの振幅は式(1)(3)から
</p>
<div class="waku">
<div style="float:right">(4)</div>
<img src="http://www.natural-science.or.jp/images/20111229-8.gif" alt="">
</div>
<p>
と決まります。つまり、任意の温度<?php WriteEquation("T") ?>に対する各電場モードの振幅が得られることになります。
各電場モードの振幅を計算する手順は次のとおりです。
</p>
<p>
（１）完全導体のサイズ<?php WriteEquation("L") ?>と温度<?php WriteEquation("T") ?>を指定する<br />
（２）<?php WriteEquation("(\nu_x,\nu_y,\nu_z)") ?>を指定する　→　<?php WriteEquation("\omega") ?>が得られる<br />
（３）<?php WriteEquation("\bar{n}") ?>が得られる　→　角振動数<?php WriteEquation("\omega") ?>の電場の振幅<?php WriteEquation("|\mathbf{E}|") ?>が得られる<br />
</p>
<br />
<h2>各電場モードの振幅の計算結果</h2>
<p>
黒体放射のサイズ<?php WriteEquation("L=5000\,[\rm nm]") ?>、温度<?php WriteEquation("T=1000\,[\rm K]") ?>における
各電場モードの振幅を計算した結果が次のグラフです。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111229-10.gif" alt="">
</p>
<p>
横軸は電磁波の波長<?php WriteEquation("\lambda \,[\rm nm]") ?>、縦軸は電場の振幅<?php WriteEquation("|\mathbf{E}|") ?>です。
各点は完全導体内で存在可能なモードを表します。ただし、図中の<?php WriteEquation("(0, 1, 1)") ?>の振幅は、<?php WriteEquation("(1, 1, 0)") ?>と<?php WriteEquation("(1, 0, 1)") ?>の振幅の合計となります。
<?php WriteEquation("(0, 1, 1)") ?>は最低次の電場モードで、<?php WriteEquation("L=5000\,[\rm nm]") ?>では<?php WriteEquation("\lambda = 7050\, [\rm nm]") ?>が最も波長の長い電磁波となります。
<?php WriteEquation("(0, 1, 1)") ?>に比較して<?php WriteEquation("(1, 1, 1)") ?>の電場モードの振幅が小さいのは、同じ波長となるモードが１パターンしか存在しないためです。つまり、同じ波長となるモード数が多いほど電場の振幅が大きくなります。
</p>
<p>
次のグラフは<?php WriteEquation("T=100\,,\,300\,,\,500\,,\,700 \,[\rm K]") ?>に対する結果を示します。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111229-11.gif" alt="">
</p>
<p>
<?php WriteEquation("T=100") ?>ではほとんど最低次のモードしか存在してないことがわかります。
各温度で縦軸は同じスケールなので、<?php WriteEquation("T=100") ?>と<?php WriteEquation("T=300") ?>を比較すると、<?php WriteEquation("T=100") ?>の電場強度は非常に小さな値であることがわかります。
</p>

<!--<p>
比較のために、「１．<a href="">プランクの法則の解析解</a>」で計算した<?php WriteEquation("T=1000\, [\rm K]") ?>におけるエネルギー密度<?php WriteEquation("\bar{W}d\omega") ?>を掲載します。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111229-12.gif" alt="">
</p>
<p>
プランクの法則は完全導体のサイズが大きな極限でのけっ
</p>-->

<br />
<h2>C言語プログラムソース</h2>
<pre class="brush: cpp;">
/*
完全導体で囲まれた空洞における各電場モード振幅の温度依存性
（2011.12.30公開）
*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;complex&gt;
#if defined(_OPENMP)
  #include &lt;omp.h&gt;
#endif
#if defined(_MSC_VER)
  #include &lt;direct.h&gt;   // Windowsフォルダ作成用
#elif defined(__GNUC__)
  #include &lt;sys/stat.h&gt; //  UNIX系ディレクトリ作成用
#endif
using namespace std;

const double PI = acos(-1.0);
const double e = 2.7182818284590452354;
const complex&lt;double&gt; I = complex&lt;double&gt;(0.0,1.0);
const double c = 2.99792458E+8;
const double lambda0 = 500.0E-9;
const double mu0 = 4.0*PI*1.0E-7;
const double epsilon0 = 1.0/(4.0*PI*c*c)*1.0E+7;
const double h  = 6.6260896 * 1.0E-34;
const double hbar = h/(2.0*PI);
const double me = 9.10938215 * 1.0E-31;
const double eV = 1.60217733 * 1.0E-19;
const double kB = 1.3806503  * 1.0E-23;

const int Lx=5000, Ly=5000, Ld=10;
const double dz = 1.0E-9; //XY平面を描画する際には dz = 1.0E-8
const double dt = 1.0E-16;
const double L = Lx * dz; 
const double V = pow(L,3);

const int ts = 0, te = 0;                   //&lt;------------ステップ数を指定

string folder = &quot;BlackBody&quot;;//作成するフォルダ名
char str[200];
int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif
  #if defined(_OPENMP)
    omp_set_num_threads(1);
    cout &lt;&lt; &quot;OpenMPを利用します（最大スレッド数：&quot;&lt;&lt; omp_get_max_threads() &lt;&lt; &quot;）&quot; &lt;&lt;  endl;
  #endif

  const int n_max = 20;

  for(double T=100.0; T&lt;=1000.0; T+=100.0){
    cout &lt;&lt; T &lt;&lt; endl;
    char str[200];
    string str1;
    ofstream fout_s;
    sprintf(str, &quot;/%d.data&quot;, int(T)); str1 = folder + str;
    fout_s.open(str1.c_str());
    int *count;
    count = new int[n_max*n_max*n_max+1];//動的に領域を確保
    for(int i=0; i&lt;=n_max*n_max*n_max; i++){
      count[i]=0;
    }
    double *E;
    E = new double[n_max*n_max*n_max+1];//動的に領域を確保
    for(int i=0; i&lt;=n_max*n_max*n_max; i++){
      E[i]=0;
    }
    for(int nux=0; nux&lt;=n_max; nux++ ){
      for(int nuy=0; nuy&lt;=n_max; nuy++ ){
        for(int nuz=0; nuz&lt;=n_max; nuz++ ){
          if((nux==0 &amp;&amp; nuy==0) || (nuy==0 &amp;&amp; nuz==0) || (nuz==0 &amp;&amp; nux==0) ) continue;
          double kx = PI/L * double(nux);
          double ky = PI/L * double(nuy);
          double kz = PI/L * double(nuz);
          double k = sqrt(pow(kx,2)+pow(ky,2)+pow(kz,2));
          double omega = c * k;
          double nbar = 1.0/(exp((hbar*omega)/(kB*T))-1.0);
          E[nux*nux+nuy*nuy+nuz*nuz] = 1.0/V * 16.0/epsilon0 * nbar * hbar * omega;
          count[nux*nux+nuy*nuy+nuz*nuz]++;
        }
      }
    }
    for(int i=0; i &lt;= n_max*n_max*n_max; i++ ){
      if(count[i]!=0){
        double omega = c * PI/L * sqrt(double(i));
        double lambda = (2.0*PI*c)/omega;
        double EE = E[i] * count[i];
        fout_s &lt;&lt; lambda*1.0E+9 &lt;&lt; &quot; &quot; &lt;&lt; omega &lt;&lt; &quot; &quot; &lt;&lt; EE &lt;&lt; endl;
      }
    }
    delete [] count;       // 動的に確保した領域を解放
    delete [] E;       // 動的に確保した領域を解放
  }
}
</pre>

<h2>ファイル</h2>
<h3>C言語ソースファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody2.cpp" target="_blank">完全導体で囲まれた空洞における各電場モード振幅の温度依存性</a><br />
</p>

<h3>Illustratorファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody2.ai" target="_blank">完全導体で囲まれた真空中における電磁波の基本モード</a><br />
</p>

<h3>Originファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody2.OPJ" target="_blank">BlackBody2.OPJ</a><br />
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111229-10.gif" src="http://www.natural-science.or.jp/images/20111229-10.gif" width="580" height="415" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>プランクの放射法則１．プランクの法則の解析解</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20111230191657.php" />
    <id>tag:www.natural-science.or.jp,2011://12.12998</id>

    <published>2011-12-30T10:16:57Z</published>
    <updated>2012-01-06T07:49:06Z</updated>

    <summary> 物理学において、古典論では物理量であるエネルギーは連続的な値を許します。 それ...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="プランクの法則" label="プランクの法則" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="解析解" label="解析解" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="量子光学" label="量子光学" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
物理学において、古典論では物理量であるエネルギーは連続的な値を許します。
それに対して、その後発展した量子論ではエネルギーが飛び飛びの値しか許さないという、不思議な制約が存在することが明らかになりました。
その発端となったのは、古典論では説明できなかった空洞放射の放射スペクトルの実験結果を説明するために、プランクによって導入された<em>エネルギー量子仮説</em>です。空洞放射の放射スペクトルの温度依存性を示したのが<em>プランクの法則</em>として知られています。
（詳細は「<a href="http://ja.wikipedia.org/wiki/%E9%BB%92%E4%BD%93" target="_blank">黒体 - Wikipedia</a>」をご覧ください。）
</p>

<p>
本稿は、プランクの放射法則を用いて有限サイズの完全導体中の電場の時間発展のシミュレーションを次のステップで行います。<br />
<br />
１．<a href="http://www.natural-science.or.jp/article/20111230191657.php">プランクの法則の解析解</a><br />
２．<a href="http://www.natural-science.or.jp/article/20111214180854.php">完全導体で囲まれた空洞における電磁波の基本モード</a><br />
３．<a href="http://www.natural-science.or.jp/article/20111230193653.php">完全導体で囲まれた空洞における各電磁波モード振幅の温度依存性</a><br />
４．<a href="http://www.natural-science.or.jp/article/20120106164405.php">任意の温度に対する完全導体中の電磁波シミュレーション</a>
<br />
本節は、出発点となるプランクの法則の解析解の概略を行います。
</p>
<p>
プランクの法則とは黒体放射において角振動数<?php WriteEquation("\omega") ?>が
<?php WriteEquation("\omega \sim \omega+d\omega") ?>にある電磁波の空間平均エネルギー密度を
<?php WriteEquation("\bar{W}_T(\omega)d\omega") ?>と表した場合、
</p>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20111216-3.gif" alt="">
</div>
<p>
で与えられるという法則です。
式(1)は<em>①各電磁波モードのエネルギーが離散的</em>
</p>
<div class="waku">
<div style="float:right">(2)</div>
<img src="http://www.natural-science.or.jp/images/20111229-1.gif" alt="">
</div>
<p>
であり、<em>②各電磁波モードの存在確率がカノニカル分布に従う</em>
</p>
<div class="waku">
<div style="float:right">(3)</div>
<img src="http://www.natural-science.or.jp/images/20111229-2.gif" alt="">
</div>
<p>
という条件から導出することができます。
下図は、式(1)の各振動数<?php WriteEquation("\omega") ?>を波長<?php WriteEquation("\lambda") ?>に変換してプロットしたものです。
ただし、<?php WriteEquation("\omega") ?>と<?php WriteEquation("\lambda") ?>の関係は、<?php WriteEquation("\omega=2\pic/\lambda") ?>です。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111216-1.gif" alt="" />
</p>
<p>
横軸に波長<?php WriteEquation("\lambda \,[\rm nm]") ?>、縦軸に空間平均エネルギー密度<?php WriteEquation("\bar{W}_T(\omega) \times10^{16}\,[\rm J\cdot s/m^3]") ?>とし、
各温度<?php WriteEquation("T=1000\sim10000\,[\rm K]") ?>に対するスペクトルを表しています。
<?php WriteEquation("\bar{W}_T(\omega)")?>の最大値を与える<?php WriteEquation("\omega_\max") ?>は式(1)から、
</p>
<div class="waku">
<div style="float:right">(4)</div>
<img src="http://www.natural-science.or.jp/images/20111216-4.gif" alt="">
</div>
<p>
となり、対応する波長<?php WriteEquation("\lambda_\max") ?>は
</p>
<div class="waku">
<div style="float:right">(5)</div>
<img src="http://www.natural-science.or.jp/images/20111216-9.gif" alt="">
</div>
<p>
となります。<?php WriteEquation("T=10000[K]") ?>では、およそ<?php WriteEquation("\lambda_\max=510\,[\rm nm]") ?>で青緑の波長の光の強度が最大となります。
ちなみに<?php WriteEquation("\bar{W}_T(\omega)")?>の最大値を与える曲線（図中の赤線）は、
</p>
<div class="waku">
<div style="float:right">(4)</div>
<img src="http://www.natural-science.or.jp/images/20111216-5.gif" alt="">
</div>
<p>
となります。歴史的には、プランクの法則が発見される前には、高温側の<em>レイリー・ジーンズの法則</em>、低温側は「<em>ウィーンの法則</em>」としてそれぞれ独立に発見されていました。
プランクの法則は、この２つの法則を包括していて、それぞれ<?php WriteEquation("k_BT\gg \hbar\omega") ?>と<?php WriteEquation("k_BT\ll \hbar\omega") ?>の条件を用いて、式(1)を展開することで得られます。
</p>

<h3>レイリー・ジーンズの法則</h3>
<div class="waku">
<div style="float:right">(6)</div>
<img src="http://www.natural-science.or.jp/images/20111216-6.gif" alt="">
</div>

<h3>ウィーンの法則</h3>
<div class="waku">
<div style="float:right">(7)</div>
<img src="http://www.natural-science.or.jp/images/20111216-7.gif" alt="">
</div>

<p>
下図は、プランクの法則、レイリー・ジーンズの法則、ウィーンの法則を<?php WriteEquation("T=1000\,[\rm K]") ?>に対してプロットしたものです。
</p>
<p style="text-align:center">
<img src="http://www.natural-science.or.jp/images/20111216-2.gif" alt="" />
</p>


<br />
<h2>言語プログラムソース</h2>
<pre class="brush: cpp;">
/*
プランクの法則の解析解
(公開：2011/12/09)
*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;complex&gt;
#if defined(_MSC_VER)
  #include &lt;direct.h&gt;   // Windowsフォルダ作成用
#elif defined(__GNUC__)
  #include &lt;sys/stat.h&gt; //  UNIX系ディレクトリ作成用
#endif
using namespace std;

const double PI = acos(-1.0);
const double e = 2.7182818284590452354;
const complex&lt;double&gt; I = complex&lt;double&gt;(0.0,1.0);
const double c = 2.99792458E+8;
const double lambda0 = 500.0E-9;
const double mu0 = 4.0*PI*1.0E-7;
const double epsilon0 = 1.0/(4.0*PI*c*c)*1.0E+7;
const double h  = 6.6260896 * 1.0E-34;
const double hbar = h/(2.0*PI);
const double me = 9.10938215 * 1.0E-31;
const double eV = 1.60217733 * 1.0E-19;
const double kB = 1.3806503  * 1.0E-23;

double lambda_max = lambda0 *20.0;

string folder = &quot;BlackBody2&quot;;//作成するフォルダ名
char str[200];
int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif

  for(double T=1000.0; T&lt;=10000.0; T+=1000.0){
    cout &lt;&lt; T &lt;&lt; endl;
    char str[200];
    string str1;
    ofstream fout_s;
    sprintf(str, &quot;/%d.data&quot;, int(T)); str1 = folder + str;
    fout_s.open(str1.c_str());

    for(int i=1; i&lt;=1000; i++){
      double lambda = lambda_max *double(i)/double(1000);
      double omega = (2.0*PI*c)/lambda;
      double W = hbar*pow(omega,3)/(pow(PI,2)*pow(c,3)) * 1.0/(exp(hbar*omega/(kB*T))-1.0);
      fout_s &lt;&lt; lambda*1.0E+9 &lt;&lt; &quot; &quot; &lt;&lt; W &lt;&lt; endl;
    }
    fout_s.close();
  }

  string str1;
  ofstream fout_s;
  sprintf(str, &quot;/peak_lambda.data&quot;); str1 = folder + str;
  fout_s.open(str1.c_str());

  for(double T=1000.0; T&lt;=11000.0; T+=10.0){
    double omega_max = 2.82144 * kB * T / hbar;
    double lambd_max = 2.0*PI*c/omega_max;
    double W_max = hbar*pow(omega_max,3)/(pow(PI,2)*pow(c,3)) * 1.0/(exp(hbar*omega_max/(kB*T))-1.0); 
    fout_s &lt;&lt; T &lt;&lt;  &quot; &quot;&lt;&lt; lambd_max*1.0E+9 &lt;&lt; &quot; &quot; &lt;&lt; W_max  &lt;&lt; endl;
  }
  fout_s.close();

  sprintf(str, &quot;/Rayleigh.data&quot;); str1 = folder + str;
  fout_s.open(str1.c_str());
  for(int i=1; i&lt;=1000; i++){
    double T=10000.0;
    double lambda = lambda_max *double(i)/double(1000);
    double omega = (2.0*PI*c)/lambda;
    double W = pow(omega,2)*kB*T/(pow(PI,2)*pow(c,3));
    fout_s &lt;&lt; lambda*1.0E+9 &lt;&lt; &quot; &quot; &lt;&lt; W &lt;&lt; endl;
  }
  fout_s.close();

  sprintf(str, &quot;/Wien.data&quot;); str1 = folder + str;
  fout_s.open(str1.c_str());
  for(int i=1; i&lt;=1000; i++){
    double T=10000.0;
    double lambda = lambda_max *double(i)/double(1000);
    double omega = (2.0*PI*c)/lambda;
    double W = hbar*pow(omega,3)/(pow(PI,2)*pow(c,3)) *exp(-hbar*omega/(kB*T)) ;
    fout_s &lt;&lt; lambda*1.0E+9 &lt;&lt; &quot; &quot; &lt;&lt; W &lt;&lt; endl;
  }
  fout_s.close();

}
</pre>

<h2>ファイル</h2>
<h3>C言語ソースファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody1.cpp" target="_blank">完全導体で囲まれた真空中における電磁波の基本モード</a><br />
</p>

<h3>gnuplotテンプレートファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody_2D.plt" target="_blank">BlackBody_2D.plt</a><br />
■<a href="http://www.natural-science.or.jp/sources/BlackBody_2D-1.plt" target="_blank">BlackBody_2D-1.plt</a><br />
■<a href="http://www.natural-science.or.jp/sources/BlackBody_2D-2.plt" target="_blank">BlackBody_2D-2.plt</a><br />
</p>

<h3>Illustratorファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody1.ai" target="_blank">完全導体で囲まれた真空中における電磁波の基本モード</a><br />
</p>

<h3>Originファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/BlackBody1.OPJ" target="_blank">BlackBody1.OPJ</a><br />
</p>


<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111216-1.gif" src="http://www.natural-science.or.jp/images/20111216-1.gif" width="569" height="405" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>google API を用いてルジャンドル陪関数を描画する</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20111228221812.php" />
    <id>tag:www.natural-science.or.jp,2011://12.12997</id>

    <published>2011-12-28T13:18:12Z</published>
    <updated>2012-02-01T08:52:34Z</updated>

    <summary> 「ルジャンドル陪関数の漸化式と規格化」で紹介した ルジャンドル陪関数の内、の場...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="google" label="google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ルジャンドル陪関数" label="ルジャンドル陪関数" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
「<a href="http://www.natural-science.or.jp/article/20111227231948.php">ルジャンドル陪関数の漸化式と規格化</a>」で紹介した
ルジャンドル陪関数<?php WriteEquation("P_l^{\,m}") ?>の内、<?php WriteEquation("m=0\, , \, l=0\sim10") ?>の場合をgoogle APIを用いて描画します。
<?php WriteEquation("m=0") ?>の場合、ルジャンドル陪関数は<?php WriteEquation("x") ?>に関する多項式となり、一般にルジャンドル多項式と呼ばれます。
</p>
<p style="font-size:x-small">
※google API の使い方は、「<a href="http://www.natural-science.or.jp/article/20111118194510.php">Google API で数式とグラフを書く（TEX + Google Chart API + Google Visualization API）</a>」をご覧ください。
</p>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>  
<script type="text/javascript">
google.load("visualization", "1", {packages:["corechart"]});
google.setOnLoadCallback(drawVisualization);

var l_max=10, m=0;

function Factorial1(n)
{
  if( n<=0 ) return (1.0);
  var F = 1.0;
  for(var i=n; i>=2; i--){
    F *= i;    
  }
  return (F);
}
function Factorial2(n)
{
  if( n<=0 ) return (1.0);
  var F = 1.0;
  for(var i=n; i>=2; i=i-2){
    F *= i;    
  }
  return (F);
}
function Legendre (m, l, x ) {
  var mm = Math.abs(m);
  if( mm>l )  return (0);
  var r0, r1, r2;
    r0 = 0.0;
    r1 = Math.pow(1.0-x*x, mm/2.0) * Factorial2(2*mm-1);
    if( mm==l && m>=0) return (r1);
    if( mm==l && m<0)  return (r1 * Math.pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm)) ;
    for(var ll = mm+1; ll<=l; ll++ ){
      r2 = ((2.0*ll-1.0)*x*r1 - (ll+mm-1.0)*r0)/(ll-mm);
      r0 = r1;
      r1 = r2;
    }
  if(m>=0) return (r2);
  else return (r2 * Math.pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm)) ;
}
function round(n, x) {
  return( Math.round(x*Math.pow(10, n))/Math.pow(10, n));
}

var keta = 3;
function drawVisualization() {
  var data = new google.visualization.DataTable();
  data.addColumn('number', 'X');
  for(var l=0; l<=l_max; l++){
    data.addColumn('number', 'm='+m+', l='+l);
  }
  var x;
  var y;
  var n_max = 1000;
  var x_min = -1;
  var x_max = 1;
  data.addRows(n_max+2);
  for (var n =0; n<=n_max ; n++){
    /*x = x_min + (x_max-x_min) * n /n_max;*/
    x = Math.cos(Math.PI*n/n_max);
    data.setValue(n, 0, round(keta, x));
    for (var l=0; l<=l_max ; l++){
      data.setValue(n, l+1, round(keta, Legendre(m,l,x)));
    }
  }
  var chart = new google.visualization.ScatterChart(document.getElementById('drow2'));
  var options = {
    title: 'ルジャンドル陪関数',
    strictFirstColumnType: true,
    width: 600, height: 600,
    pointSize: 1,
    vAxis: {title: "P",  titleTextStyle: {color: "black"}},
    hAxis: {title: "X", minValue: -1, maxValue: 1, titleTextStyle: {color: "black"}}
  };
  chart.draw(data, options);
}
</script>
<div id="drow2"></div>

<h2>Javascript ソース</h2>
<pre class="brush: js;">
google.load(&quot;visualization&quot;, &quot;1&quot;, {packages:[&quot;corechart&quot;]});
google.setOnLoadCallback(drawVisualization);

var l_max=10, m=0;

function Factorial1(n)
{
  if( n&lt;=0 ) return (1.0);
  var F = 1.0;
  for(var i=n; i&gt;=2; i--){
    F *= i;    
  }
  return (F);
}
function Factorial2(n)
{
  if( n&lt;=0 ) return (1.0);
  var F = 1.0;
  for(var i=n; i&gt;=2; i=i-2){
    F *= i;    
  }
  return (F);
}
function Legendre (m, l, x ) {
  var mm = Math.abs(m);
  if( mm&gt;l )  return (0);
  var r0, r1, r2;
    r0 = 0.0;
    r1 = Math.pow(1.0-x*x, mm/2.0) * Factorial2(2*mm-1);
    if( mm==l &amp;& m&gt;=0) return (r1);
    if( mm==l &amp;& m&lt;0)  return (r1 * Math.pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm)) ;
    for(var ll = mm+1; ll&lt;=l; ll++ ){
      r2 = ((2.0*ll-1.0)*x*r1 - (ll+mm-1.0)*r0)/(ll-mm);
      r0 = r1;
      r1 = r2;
    }
  if(m&gt;=0) return (r2);
  else return (r2 * Math.pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm)) ;
}
function round(n, x) {
  return( Math.round(x*Math.pow(10, n))/Math.pow(10, n));
}

var keta = 3;
function drawVisualization() {
  var data = new google.visualization.DataTable();
  data.addColumn('number', 'X');
  for(var l=0; l&lt;=l_max; l++){
    data.addColumn('number', 'm='+m+', l='+l);
  }
  var x;
  var y;
  var n_max = 1000;
  var x_min = -1;
  var x_max = 1;
  data.addRows(n_max+2);
  for (var n =0; n&lt;=n_max ; n++){
    /*x = x_min + (x_max-x_min) * n /n_max;*/
    x = Math.cos(Math.PI*n/n_max);
    data.setValue(n, 0, round(keta, x));
    for (var l=0; l&lt;=l_max ; l++){
      data.setValue(n, l+1, round(keta, Legendre(m,l,x)));
    }
  }
  var chart = new google.visualization.ScatterChart(document.getElementById('drow2'));
  var options = {
    title: 'ルジャンドル陪関数',
    strictFirstColumnType: true,
    width: 600, height: 600,
    pointSize: 1,
    vAxis: {title: &quot;P&quot;,  titleTextStyle: {color: &quot;black&quot;}},
    hAxis: {title: &quot;X&quot;, minValue: -1, maxValue: 1, titleTextStyle: {color: &quot;black&quot;}}
  };
  chart.draw(data, options);
}
</pre>



<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111228.gif" src="http://www.natural-science.or.jp/images/20111228.gif" width="534" height="526" class="mt-image-none" style="" /></span>
-->]]>
        
    </content>
</entry>

<entry>
    <title>ルジャンドル陪関数の漸化式と規格化</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20111227231948.php" />
    <id>tag:www.natural-science.or.jp,2011://12.12996</id>

    <published>2011-12-27T14:19:48Z</published>
    <updated>2011-12-27T14:24:02Z</updated>

    <summary> ルジャンドル陪関数は、ヘルムホルツ方程式の極座標において変数分離した際の微分方...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="TIPS 集" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ルジャンドル陪関数" label="ルジャンドル陪関数" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<div class="purpose">
ルジャンドル陪関数は、ヘルムホルツ方程式の極座標において変数分離した際の微分方程式の解として与えられます。
ルジャンドル陪関数は完全系を成すため、任意の関数型をルジャンドル陪関数の重ね合わせで表すことができます。
本稿では、任意の関数をルジャンドル陪関数を用いて展開する際の準備として、数値的に取り扱いやすい漸化式を用いたルジャンドル陪関数の描画と規格化を行います。
</div>
<p>
ルジャンドル陪関数は、
</p>
<div class="waku">
<div style="float:right">(1)</div>
<img src="http://www.natural-science.or.jp/images/20111227-1.gif" alt="" />
</div>
<p>
で定義される関数で、<?php WriteEquation("l") ?>を次数（degree）、<?php WriteEquation("m") ?>を位数（order）と呼ばれる２つの指数で指定されます。
ただし、<?php WriteEquation("l") ?>と<?php WriteEquation("m") ?>、<?php WriteEquation("x") ?>には
</p>
<div class="waku">
<div style="float:right">(2)</div>
<img src="http://www.natural-science.or.jp/images/20111227-14.gif" alt="" class="e2" /><br />
<img src="http://www.natural-science.or.jp/images/20111227-15.gif" alt="" />
</div>
<p>
の制限があります。
式(1)で与えられるルジャンドル陪関数は解析的には便利な場合が多いですが、
数値的に扱う際には非常に不便なので、<a href="http://www.natural-science.or.jp/article/20111105154236.php">エルミート多項式の場合</a>と同様に漸化式を利用します。
</p>
<br />
<h2>ルジャンドル陪関数の漸化式</h2>
<p>
位数<?php WriteEquation("m \ge 0") ?>に対して、
</p>
<div class="waku">
<div style="float:right">(3)</div>
<img src="http://www.natural-science.or.jp/images/20111227-2.gif" alt="" />
</div>
<p>
が成り立ちます。ただし、次数は<?php WriteEquation("m") ?>以上である必要があります。
数値的には、
</p>
<div class="waku">
<div style="float:right">(4)</div>
<img src="http://www.natural-science.or.jp/images/20111227-3.gif" alt="" />
</div>
<p>
と変形したほうが都合が良いです。つまり、連続する２つの次数に対する<?php WriteEquation("x") ?>依存性が得られれば、
次の次数の<?php WriteEquation("x") ?>依存性を数値的に得ることができます。
漸化式の初期値として、<?php WriteEquation("l=m-1") ?>と<?php WriteEquation("l=m") ?>における<?php WriteEquation("P_l^{m}") ?>を
</p>
<div class="waku">
<div style="float:right">(5)</div>
<img src="http://www.natural-science.or.jp/images/20111227-4.gif" alt="" class="e2" /><br />
<img src="http://www.natural-science.or.jp/images/20111227-5.gif" alt="" />
</div>
<p>
と与えることで、位数<?php WriteEquation("m \ge 0") ?>かつ<?php WriteEquation("l \ge m") ?>のルジャンドル陪関数を計算することができます。
<?php WriteEquation("m \le 0") ?>の場合には、
</p>
<div class="waku">
<div style="float:right">(6)</div>
<img src="http://www.natural-science.or.jp/images/20111227-6.gif" alt="" />
</div><p>
の関係式を用います。これで任意の<?php WriteEquation("m") ?>と<?php WriteEquation("m\le l") ?>を満たす任意の<?php WriteEquation("l") ?>に対するルジャンドル陪関数を計算することができことになります。
</p>

<br />
<h2>ルジャンドル陪関数の直交性と規格化</h2>
<p>
異なる次数<?php WriteEquation("l,\, l'") ?>のルジャンドル陪関数の内積は
</p>
<div class="waku">
<div style="float:right">(7)</div>
<img src="http://www.natural-science.or.jp/images/20111227-7.gif" alt="" />
</div>
<p>
となります。つまり、
</p>
<div class="waku">
<div style="float:right">(8)</div>
<img src="http://www.natural-science.or.jp/images/20111227-8.gif" alt="" />
</div>
<p>
と新しく定義することでルジャンドル陪関数を規格化することができます。
規格化ルジャンドル陪関数の漸化式は式(4)から
</p>
<div class="waku">
<div style="float:right">(9)</div>
<img src="http://www.natural-science.or.jp/images/20111227-9.gif" alt="" />
</div>
<p>
となり、初期値は
</p>
<div class="waku">
<div style="float:right">(10)</div>
<img src="http://www.natural-science.or.jp/images/20111227-10.gif" alt="" class="e2" /><br />
<img src="http://www.natural-science.or.jp/images/20111227-11.gif" alt="" />
</div>
<p>
となります。また、<?php WriteEquation("m\to -m") ?>の関係式(6)は
</p>
<div class="waku">
<div style="float:right">(11)</div>
<img src="http://www.natural-science.or.jp/images/20111227-12.gif" alt="" />
</div>
<p>
と変形することができます。以上で得られる規格化ルジャンドル陪関数は
</p>
<div class="waku">
<div style="float:right">(12)</div>
<img src="http://www.natural-science.or.jp/images/20111227-13.gif" alt="" />
</div>
<p>
を満たします。
</p>

<h2>計算結果</h2>
<h3>ルジャンドル陪関数の<?php WriteEquation("x") ?>依存性</h3>
<p>
<?php WriteEquation("l=0,1,2,3") ?>（<?php WriteEquation("-l\le m \le l") ?>）に対して、
<?php WriteEquation("P_l^{\,m}(x)") ?>と<?php WriteEquation("\bar{P}_l^{\,m}(x)") ?>の計算結果を示します。
</p>
<p style="text-align:center; font-size:xx-small">
<a href="http://www.natural-science.or.jp/images/20111227-0.gif" target="_blank"><img src="http://www.natural-science.or.jp/images/20111227-0.gif" alt="" style="width:600px" /></a><br />
<a href="http://www.natural-science.or.jp/images/20111227-0.gif" target="_blank">拡大する</a>
</p>

<br />
<h3>規格化ルジャンドル陪関数の直交性の確認</h3>
<p>
式(9),(10)で得られた規格化ルジャンドル陪関数の直交性を確かめます。
下記は式(12)を計算した結果です（左から順に<?php WriteEquation("m,l,l'") ?>と式(12)の計算結果）。
</p>
<pre>
0 0 0 1
0 0 1 2.23525e-017
0 0 2 2.48542e-016
0 0 3 3.15303e-017
0 1 0 2.23525e-017
0 1 1 1
0 1 2 2.28706e-016
0 1 3 1.52749e-012
0 2 0 2.48542e-016
0 2 1 2.28706e-016
0 2 2 1
0 2 3 9.9772e-017
0 3 0 3.15303e-017
0 3 1 1.52749e-012
0 3 2 9.9772e-017
0 3 3 1
1 1 1 1
1 1 2 6.55298e-017
1 1 3 -9.34794e-013
1 2 1 6.55298e-017
1 2 2 1
1 2 3 -6.85308e-017
1 3 1 -9.34794e-013
1 3 2 -6.85308e-017
1 3 3 1
2 2 2 1
2 2 3 1.58455e-017
2 3 2 1.58455e-017
2 3 3 1
3 3 3 1
</pre>
<p>
<?php WriteEquation("\delta_{ll'}") ?>が実現できていることが確認できます。
</p>
<br />
<h2 id="p1">C言語プログラムソース</h2>
<p>
数値積分にはシンプソン法（<a href="http://www.natural-science.or.jp/article/20101023165319.php">シンプソン法を利用して積分を数値計算する</a>）
を用いています。
</p>
<pre class="brush: cpp;">
/*漸化式を用いてルジャンドル陪関数と規格化ルジャンドル陪関数を描画するプログラム
＋直交性の確認
(2011.12.27 公開)*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;complex&gt;
#if defined(_OPENMP)
  #include &lt;omp.h&gt;
#endif
#if defined(_MSC_VER)
  #include &lt;direct.h&gt;   // Windowsフォルダ作成用
#elif defined(__GNUC__)
  #include &lt;sys/stat.h&gt; //  UNIX系ディレクトリ作成用
#endif
using namespace std;

double PI = acos(-1.0);
double Factorial1(int n);
double Factorial2(int n);
const int l_max = 3;
const int kizami = 2000;
double Legendre( int m, int l, double x);           //ルジャンドル陪関数
double NormalizedLegendre( int m, int l, double x); //規格化ルジャンドル陪関数
string folder = &quot;Legendre&quot;;//作成するフォルダ名
double Simpson(double a, double b, int m, int l1,  int l2);//シンプソン法
double f(double x, int m, int l1,  int l2){
  return NormalizedLegendre( m, l1 , x) * NormalizedLegendre(m, l2, x);
}

int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif
  #if defined(_OPENMP)
    omp_set_num_threads(8);
    cout &lt;&lt; &quot;OpenMPを利用します（最大スレッド数：&quot;&lt;&lt; omp_get_max_threads() &lt;&lt; &quot;）&quot; &lt;&lt;  endl;
  #endif
  double x_min = -1.0;
  double x_max =  1.0;

  for(int l=0; l&lt;=l_max; l++)
  {
    for(int m=-l; m&lt;=l; m++)
    {
      char str[200];
      string str1;
      ofstream fout_s;
      sprintf(str, &quot;/Legendre%d_%d.data&quot;, l, m); str1 = folder + str;
      fout_s.open(str1.c_str());
      for(int i=0; i&lt;=kizami; i++)
      {
        double x = x_min + (x_max-x_min)/double(kizami)*double(i);
        fout_s &lt;&lt; x &lt;&lt; &quot; &quot; &lt;&lt; Legendre(m,l, x) &lt;&lt; &quot; &quot; &lt;&lt; NormalizedLegendre(m,l, x) &lt;&lt; endl;
      }
      fout_s.close();
    }
  }

  ofstream ofs( &quot;Legendre_bisect.data&quot; );
  for(int m=0; m&lt;=l_max; m++)
  {
    for(int l1=m; l1&lt;=l_max; l1++)
    {
      for(int l2=m; l2&lt;=l_max; l2++)
      {
        ofs &lt;&lt; m &lt;&lt; &quot; &quot; &lt;&lt; l1 &lt;&lt;&quot; &quot; &lt;&lt; l2 &lt;&lt; &quot; &quot; &lt;&lt;  Simpson( x_min, x_max, m, l1, l2) &lt;&lt; endl;
      }
    }
  }
  ofs.close();
}
double Legendre( int m, int l, double x)
{
  int mm = abs(m);
  if( mm&gt;l )  return 0;
  double r0, r1, r2;
    r0 = 0.0;
    r1 = pow(1.0-x*x, double(mm)/2.0) * Factorial2(2*mm-1);
    if( mm==l &amp;& m&gt;=0) return r1;
    if( mm==l &amp;& m&lt;0)  return r1 * pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm) ;
    for(int ll = mm+1; ll&lt;=l; ll++ ){
      r2 = ((2.0*ll-1.0)*x*r1 - (ll+mm-1.0)*r0)/(ll-mm);
      r0 = r1;
      r1 = r2;
    }
  if(m&gt;=0) return r2;
  else return r2 * pow(-1.0,mm) * Factorial1(l-mm)/Factorial1(l+mm) ;
}
double NormalizedLegendre( int m, int l, double x)
{
  int mm = abs(m);
  if( mm&gt;l )  return 0;
  double r0, r1, r2;
    r0 = 0.0;
    r1 = pow(1.0-x*x, double(mm)/2.0) * sqrt( 1.0/2.0 * Factorial2(2*mm+1)/Factorial2(2*mm));
    if( mm==l &amp;& m&gt;=0) return r1;
    if( mm==l &amp;& m&lt;0)  return r1 * pow(-1.0,mm);
    for(int ll = mm+1; ll&lt;=l; ll++ ){
      r2 = sqrt((2.0*ll-1.0)*(2.0*ll+1.0)/((ll+mm)*(ll-mm))) *x*r1 - sqrt((ll+mm-1.0)*(ll-mm-1.0)/((ll+mm)*(ll-mm)) * (2.0*ll+1.0)/(2.0*ll-3.0) ) *r0;
      r0 = r1;
      r1 = r2;
    }
  if(m&gt;=0) return r2;
  else return r2 * pow(-1.0,mm) ;
}

double Factorial1(int n)
{
  if( n&lt;=0 ) return 1.0;
  double F = 1.0;
  for(int i=n; i&gt;=2; i--){
    F *= double(i);    
  }
  return F;
}
double Factorial2(int n)
{
  if( n&lt;=0 ) return 1.0;
  double F = 1.0;
  for(int i=n; i&gt;=2; i=i-2){
    F *= double(i);    
  }
  return F;
}
double Simpson(double a, double b, int m, int l1, int l2)
{
  double ss1 =0.0;
  for(int i=1; i&lt;=kizami/2-1; i++){
    double x = a + (b-a)/double(kizami) * double(2*i);
    ss1 += f(x, m, l1, l2);
  }
  double ss2 =0.0;
  for(int i=1; i&lt;=kizami/2; i++){
    double x = a + (b-a)/double(kizami) * double(2*i-1);
    ss2 += f(x, m, l1, l2);
  }
  return  (b-a)/(3.0*double(kizami)) * ( f(a, m, l1, l2) + f(b, m, l1, l2) + 2.0 * ss1 + 4.0 * ss2 );
}
</pre>



<h2>ファイル</h2>
<h3>C言語ソースファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/Legendre1.cpp" target="_blank">漸化式を用いてルジャンドル陪関数と規格化ルジャンドル陪関数を描画するプログラム</a><br />
</p>
<h3>Illustratorファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/Legendre1.ai" target="_blank">ルジャンドル陪関数.ai</a>
</p>
<h3>Originファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/Legendre1.OPJ" target="_blank">ルジャンドル陪関数.OPJ</a>
</p>
<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111227-0.gif" src="http://www.natural-science.or.jp/images/20111227-0.gif" width="1995" height="872" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

<entry>
    <title>異なる媒質の境界における電磁波と電子波【2-6】境界面における平面波電子波の時間発展</title>
    <link rel="alternate" type="text/html" href="http://www.natural-science.or.jp/article/20111221224131.php" />
    <id>tag:www.natural-science.or.jp,2011://12.12995</id>

    <published>2011-12-21T13:41:31Z</published>
    <updated>2011-12-21T14:05:02Z</updated>

    <summary> 【2-4】境界面において任意の形状の波に対して時間発展を与える一般表式で示した...</summary>
    <author>
        <name>遠藤 理平</name>
        <uri>http://www.natural-science.or.jp/members/endo_rihei.php</uri>
    </author>
    
        <category term="仮想物理実験室" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="計算物理学" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="シュレディンガー方程式" label="シュレディンガー方程式" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="境界条件" label="境界条件" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="平面波" label="平面波" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="電子波" label="電子波" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.natural-science.or.jp/">
        <![CDATA[<p>
<a href="http://www.natural-science.or.jp/article/20111221220648.php">【2-4】境界面において任意の形状の波に対して時間発展を与える一般表式</a>で示した時間発展を表す表式に、波数ベクトル<?php WriteEquation("\mathbf{k}") ?>に対して任意の関数である入射波の振幅<?php WriteEquation("\psi_{11}(\mathbf{k})") ?>を与えます。
</p>

<div class="waku">
<div style="float:right">(2-6-1)</div>
<img src="http://www.natural-science.or.jp/images/20111220-14.gif" alt="" />
</div>
<p>
とすることで、単一波数ベクトル<?php WriteEquation("\mathbf{k}_0") ?>の平面波となります。
</p>

<h2>電磁波の平面波の時間発展</h2>
<h3>外部反射</h3>
<p>
電磁波とは異なり、電子波は外部反射で全反射が起きます。
横軸と縦軸のスケールは<?php WriteEquation("[\rm pm] = 10^{-12}[\rm m]") ?>です。
</p>
<div class="ImageList">
	<div class="l2">
	<span><?php WriteEquation("\theta_1=0^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s0.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=20^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s20.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=40^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s40.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=60^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s60.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=80^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s80.gif" alt=""  /><br />
	</div>
</div>
<h4>臨界角</h4>
<div class="ImageList">
	<span><?php WriteEquation("\theta_1=\theta_{\rm Critical}") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s45.gif" alt=""  /><br />
</div>

<h3>内部反射</h3>

<div class="ImageList">
	<div class="l2">
	<span><?php WriteEquation("\theta_1=0^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s0_.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=20^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s20_.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=40^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s40_.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=60^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s60_.gif" alt=""  /><br />
	</div>
	<div class="l2">
	<span><?php WriteEquation("\theta_1=80^\circ") ?></span>
	<img src="http://www.natural-science.or.jp/images/20111221-s80_.gif" alt=""  /><br />
	</div>
</div>

<h2>プログラム</h2>
<pre class="brush: cpp;">
/*
シュレディンガー方程式における境界面による平面波
(公開：2011/12/21)
*/
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;time.h&gt;
#include &lt;fstream&gt;
#include &lt;sstream&gt;
#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;cstdio&gt;
#include &lt;iomanip&gt;
#include &lt;stdio.h&gt;
#include &lt;complex&gt;
#if defined(_OPENMP)
  #include &lt;omp.h&gt;
#endif
#if defined(_MSC_VER)
  #include &lt;direct.h&gt;   // Windowsフォルダ作成用
#elif defined(__GNUC__)
  #include &lt;sys/stat.h&gt; //  UNIX系ディレクトリ作成用
#endif
using namespace std;

const double PI = acos(-1.0);
const double e = 2.7182818284590452354;
const complex&lt;double&gt; I = complex&lt;double&gt;(0.0,1.0);
const double c = 2.99792458E+8;
const double lambda0 = 500.0E-9;
const double mu0 = 4.0*PI*1.0E-7;
const double epsilon0 = 1.0/(4.0*PI*c*c)*1.0E+7;
const double h  = 6.6260896 * 1.0E-34;
double hbar = h/(2.0*PI);
const double me = 9.10938215 * 1.0E-31;
const double eV = 1.60217733 * 1.0E-19;

const int Lx=5000, Lz=5000, Ld=10;
const double dz  = 1.0E-12; //XY平面を描画する際には dz = 1.0E-10
const int iz0 = Lz/2 , ix0 = Lx/2;

double T0 = 2.0*eV; //初期運動エネルギー
double V1 = 0.0*eV, V2 = 1.0*eV;

double k0  = sqrt(2.0*me*T0/pow(hbar,2)); 
double omega0  = hbar/(2.0*me) * pow(k0,2);

////////臨界角///////////////////
double k1 = sqrt( pow(k0,2)-(2.0*me*V1)/pow(hbar,2) );
double k2 = sqrt( pow(k0,2)-(2.0*me*V2)/pow(hbar,2) );
double theta_critical = asin(k2/k1)*180.0/PI;
/////////////////////////////////

const int ts = 1, te = 20;                   //&lt;------------ステップ数を指定
double dt= 2.0*PI/omega0/double(te-ts+1);    //&lt;------------時間間隔を指定
const double theta_s = theta_critical, theta_e  = theta_critical;  //&lt;------------角度を指定
const double theta_k =20.0;
const double V0 = 0.0;
string folder = &quot;Schrodinger_interface_plane1&quot;;//作成するフォルダ名

char str[200];
int main(){
  #if defined(_MSC_VER)
    _mkdir(folder.c_str());   // Windowsフォルダ作成
  #elif defined(__GNUC__)
    mkdir(folder.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
  #endif
  #if defined(_OPENMP)
    omp_set_num_threads(8);
    cout &lt;&lt; &quot;OpenMPを利用します（最大スレッド数：&quot;&lt;&lt; omp_get_max_threads() &lt;&lt; &quot;）&quot; &lt;&lt;  endl;
  #endif

  ////////////////////
  //角度ごとに計算
  ////////////////////
  for(double th=theta_s; th &lt;=theta_e; th+=theta_k )
  {
    double Theta= PI/180.0 * th;     //弧度法へ変換
    char str[200];
    sprintf(str, &quot;/%d&quot;, int(th));
    string folder_n = folder + str;
    #if defined(_MSC_VER)
      _mkdir(folder_n.c_str());  // Windowsフォルダ作成
    #elif defined(__GNUC__)
      mkdir(folder_n.c_str(), S_IRWXU | S_IRWXG | S_IRWXO); // UNIX系のディレクトリ作成
    #endif
    #pragma omp parallel
    {
      #pragma omp for //schedule(dynamic, 100)
      for(int tn=ts; tn&lt;=te; tn++)
      {
        double t_real = dt * double(tn);
        cout &lt;&lt; th &lt;&lt; &quot; &quot; &lt;&lt; tn &lt;&lt; endl;
        char str[200];
        string str1;
        ofstream fout_2D;
        sprintf(str, &quot;/%d/s%d.data&quot;,  int(th), tn); str1 = folder + str;
        fout_2D.open(str1.c_str());
        double cos1 = cos(Theta);
        double sin1 = sin(Theta);
        complex&lt;double&gt; k1 = sqrt( complex&lt;double&gt;( pow(k0,2)-(2.0*me*V1)/pow(hbar,2) , 0.0));
        complex&lt;double&gt; k2 = sqrt( complex&lt;double&gt;( pow(k0,2)-(2.0*me*V2)/pow(hbar,2) , 0.0));
        complex&lt;double&gt; sin2 = k1/k2 * sin1;
        complex&lt;double&gt; cos2 = sqrt(complex&lt;double&gt;(1.0,0.0) - pow(sin2,2));
        complex&lt;double&gt; r = (k1*cos1-k2*cos2)/(k1*cos1+k2*cos2);
        complex&lt;double&gt; t = (2.0*k1*cos1)    /(k1*cos1+k2*cos2);

        for(int iz=0; iz&lt;=Lz ;iz=iz+Ld)
        {
          for(int ix=0 ; ix&lt;=Lx ;ix=ix+Ld)
          {
            double z = dz * double(iz-iz0);
            double x = dz * double(ix-ix0);
            complex&lt;double&gt; Psi   = complex&lt;double&gt;(0.0,0.0);
            if(z&lt;0){
              Psi   = exp( I*((k1*cos1)*(z) + (k1*sin1)*(x) -omega0 * t_real )) + r * exp( I*(-(k1*cos1)*(z) + (k1*sin1)*(x) -omega0 * t_real ));
            }else{
              Psi   = t * exp( I*((k2*cos2)*(z) + (k2*sin2)*(x) -omega0 * t_real ));
            }
            fout_2D &lt;&lt; z/dz  &lt;&lt; &quot; &quot; &lt;&lt; x/dz &lt;&lt; &quot; &quot; &lt;&lt; Psi.real()   &lt;&lt; &quot; &quot; &lt;&lt;Psi.imag()    &lt;&lt; &quot; &quot; &lt;&lt;abs(Psi)  &lt;&lt; endl;
          }
          fout_2D &lt;&lt;&quot;&quot;&lt;&lt; endl;
        }
        fout_2D.close();
      }
    }
  }
}
</pre>

<br />
<h2>添付ファイル</h2>
<h3>C言語ソースファイル</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/Schrodinger_interface_plane1.cpp" target="_blank">シュレディンガー方程式における境界面による平面波</a>
</p>
<h3>gifアニメーション、gnuplotテンプレート</h3>
<p>
■<a href="http://www.natural-science.or.jp/sources/Schrodinger_interface_plane1.zip" target="_blank">Schrodinger_interface_plane1.zip</a>
</p>

<!--
<span class="mt-enclosure mt-enclosure-image" style="display: inline;"><img alt="20111221-s60_.gif" src="http://www.natural-science.or.jp/images/20111221-s60_.gif" width="600" height="480" class="mt-image-none" style="" /></span>
-->
]]>
        
    </content>
</entry>

</feed>

