So-net無料ブログ作成
前の10件 | -

100万元の連立1次方程式(^^) [ひとこと言わねば]

100万元の連立1次方程式を解くことなんて、まず、ないと思うだろう。
しかし、例えば、3次元の計算を行う場合、100万元の連立方程式なんてすぐに出てくるにゃ。
例えば、1辺の長さが1mの立方体のものに力を掛けて、その応力と歪を差分法を用いて数値計算で求めようとする。x、y、z軸方向にそれぞれ100分割したら、計算点は100³=100万になってしまう。したがって、1mの立方体の応力と歪を1cm間隔で計算しようとしたら、少なくとも、100万元の連立方程式を解かなければならない!!
――ddt³さんが現在執筆している境界要素法ならば、3次元ではなく2次元の境界面(2次元の計算ならば、境界線の1次元)の計算でよいので、計算する点を大きく減らすことができる!! 境界要素法の最大の利点は、この計算量を減らせるというところにある。そのかわり、偏微分方程式を連立方程式に置き換える数学的な操作を離散化というけれど、境界要素法の離散化は有限要素法などよりも複雑になり、計算も複雑になるが、それでも十分すぎるほどのメリットがある。――
この問題を解くためには、応力と歪の連立方程式になるので、200万元の連立1次方程式になるのかな(^^)

1mの立方体ならばこんなものだけれども、数百メートルの超高層ビルの場合、どうなるにゃ。
50m×50m×200mの超高層ビルの場合、1m間隔で分割した場合、計算点は、50×50×200=50万で、応力と歪の2つの連立方程式になるので100万元の連立1次方程式になってしまう。しかも、分解能は1mしかないにゃ。分解能を10cmにしようとしたら、5000万元の連立1次方程式を解かなければならない。
10cmの分解能じゃ〜、この超高層ビルのどこでヒビが入るかわからないにゃ。せめて、1cmくらいの分解能は欲しいということになったら、・・・。

ちなみに、気象庁が行っている最も高精度の数値天気予報の分解能は10km!! ゲリラ豪雨の予想は、この分解能ではおそらく無理。
ゲリラ豪雨の予想ができるように、この分解能を縦、横、高さで10倍にしたら、計算点は1000倍になり、この連立方程式を掃き出し法で解こうとしたら、1000³=10億倍の計算量になってしまう。
10億倍は大げさだけれども、1km四方の予報をしようとしたら、少なくとも今のスパコンより10万倍くらい速いスパコンじゃないと無理なんじゃないかな。


なぜ、今よりもキメの細かい数値計算による天気予報が行えないか、その理由がわかってもらえたんじゃないかな。今のスパコン程度の計算速度では、これを行うために必要な連立1次方程式を解くのに時間がかかりすぎるためだったんだにゃ。そして、スパコンの開発の歴史は、如何に早く連立1次方程式を解くけるようにするか、という一面があるんだにゃ。

INPACK ベンチマークは LINPACK に基づいたベンチマークプログラムで、システムの浮動小数点演算性能を評価する。ジャック・ドンガラが考案したもので、理学・工学で一般的な n×n の線型方程式系 Ax = b を解く速度を測定する。このベンチマークの最新版はTOP500で世界の高速なコンピュータの性能値としてランキングに使用されている。
https://goo.gl/Lm2JJ8



nice!(1)  コメント(0) 

掃き出し法のC言語のプログラム [数値解析]

C言語のコンパイラは持っているけれど、Fortranのコンパイラなんて持っていないというヒトもいるかもしれないので、C言語による掃き出し法のプログラムを紹介するにゃ。

#include <stdio.h>
#define N 20 //20元連立1次方程式まで解ける

void Hakidashi(double a[][N+1],int n) { // 掃き出し法
    double piv, t;
    int i, j, k;
   
    for (k=0; k < n; k++) {
        piv = a[k][k];
        for (j=k; j<n+1;j++) {
            a[k][j]=a[k][j]/piv;
        }
        for (i = 0; i < n; i++) {
            if (i != k) {
                t=a[i][k];
                for (j=k; j < n+1; j++) {
                    a[i][j]=a[i][j]-t*a[k][j];
                }
            }
        }
    }
}

main() {
    double a[N][N+1];
    int i, n;
   
    a[0][0]=2; a[0][1]=3; a[0][2]=1; a[0][3]=4;
    a[1][0]=4; a[1][1]=1; a[1][2]=-3 ; a[1][3]=-2;
    a[2][0]=-1; a[2][1]=2; a[2][2]=2; a[2][3]=2;

    n=3;

    Hakidashi(a,n);
   
    for (i=0; i < n; i++) {
        printf("x[%d] = %f\n",i,a[i][n]);
    }
}

1次元の配列ならば、C言語で数値計算のプログラムを書いてもいいのだけれど、C言語は、そもそもUNIXというOS開発用のために作られたアセンブラ的な言語なので、配列の始まりが1ではなく0からとか、2次元以上の配列の場合、配列の大きさをあらかじめ他のプログラムに知らせないといけないなど、多次元配列を用いた数値計算には向いていないように思うんだよね。この他にデータの入出力もC言語は面倒。やっぱ、本格的な数値計算をする場合、科学技術用の数値計算をするためだけに開発されたFortranにまさるプログラミング言語は存在しないんだにゃ。

Fortranが一番だけれど、コンソール画面からのデータの入力は面倒というデメリットはあるけれど、数値計算をするならば、CよりはJavaの方がいいと思うにゃ。
Fortranから十進BASICなどのBASICへのプログラムの書き換えは楽なので、BASICのプログラムはここでは示さないケロ。十進BASICには、掃き出し法のサンプルプログラムがあったような気もするし・・・。


nice!(0)  コメント(0) 

連立方程式の解法1 掃き出し法 [数値解析]

連立方程式の解法1 掃き出し法

 

次の連立3元方程式を例に、数値計算で用いられる、連立方程式を解くための掃き出し法――中学で習う連立方程式の解法の一つである、加減法とほとんど同じもの――について説明する。

  ren1-001.png

まず、係数だけを取り出し、次のような表(行列)を作る。

  ren1-002.png

①に1/2を掛けて、xの係数を1にする。

  ren1-003.png

次に、②、③のxの係数を0にするために、②−5×①’、③−3×①’を計算する。

  ren1-004.png

②の係数を1にするために、②’に−2/11を掛ける。

  ren1-005.png

①’と③’のyの係数を0にするために、

①’−3/2×②’’、③’−1/2×②’’を計算する。

  ren1-006.png

③’’のzの係数を1にするために、
③’’×11/94
を計算する。

  ren1-007.png

①’’と②’’のzの係数を0にするために、

①’’−7/11×③’’’、②’’+1/11×③’’’を計算する。

  ren1-008.png

①’’’、②’’’、③’’’を連立方程式の形に書き換えると、

  

だから、この連立方程式の解は(x,y,z)=(1,1,0)である。

 

要するに、連立方程式

  

の係数行列を

  

を単位行列

  

に変形することによって連立方程式の解(x,y,z)を求める方法を掃き出し法という。

 

連立3元方程式だと書くのが大変なので、次の連立2元方程式を掃き出し法で、もう一度、解くことにする。

  

係数だけを取り出すと次のようになる。

  

×1/2

  

②−3×①’

  

(-2/25)×②’

  

①’−7/2×②’’

  

よって求める解は

  

 

この作業をコンピュータにさせるためにプログラムを書くことは大変そうだけど、実は、簡単に書けてしまう。

Fortranによるサンプルプログラムを以下に示す。

 

! 掃き出し法で連立方程式を解く

real a(50,51)

 

! sample data

a(1,1)=2; a(1,2)=3; a(1,3)=1; a(1,4)=4

a(2,1)=4; a(2,2)=1; a(2,3)=-3; a(2,4)=-2

a(3,1)=-1; a(3,2)=2; a(3,3)=2; a(3,4)=2

 

n=3 ! 3元連立方程式だからn=3

 

call hakidashi(a,n) ! 掃き出し法を呼び出す

 

do i=1, n

  write(6,100) 'x(',i,')=', a(i,n+1)

end do

100 format(a,i2, a,f10.6)

end

 

! 掃き出し法

subroutine hakidashi(a,n)

real a(50,51)

 

do k =1, n

   p= a(k,k)

   do j=k+1, n+1

     a(k,j)= a(k,j)/p

   end do

   do i=1, n

      if (i.ne.k) then

        do j=k+1, n+1

          a(i,j)=a(i,j)-a(i,k)*a(k,j)

        end do

      end if

    end do

end do

 

end

 

解いているのは、次の連立方程式。

  

上のプログラムは、より一般の

  

すなわち、

  

も解けるようになっている。

 

プログラム使用上の注意は、に格納し、サブルーティンhakidashiを呼び出し後には、解に格納されていること。

これは、連立方程式(1)を

  ren1-009.png

という行列に置き換え、この行列の操作によって連立方程式の解を求めているためで、この行列のn+1列目を

  

としているためである。

 

上のプログラムを見るとわかると思うけれど、n元連立1次方程式を解くための反復計算の回数は、3重(do)ループになっているので、およそ、n³/2回。

したがって、nが10倍になると、反復回数は10³、すなわち1000倍になり、この計算に要する時間もおよそ1000倍になる。

nが100倍になると、なんと、100³=100万倍!!

このため、単純計算を超高速で行えるコンピュータといえども、多元連立1次方程式を解くということは大変な手間のかかる作業なのであった。

 


nice!(1)  コメント(0) 

今日のアニソン、「新造人間キャシャーン」から『たたかえ!キャシャーン』 [今日のアニソン]

今日のアニソンは、アニメ「新造人間キャシャーン」から『たたかえ!キャシャーン』です。


軍歌調の歌詞はともかく、クラシック的な技法が取り入れられていて、なかなか、聴き応えのある曲のようだにゃ。


音質はよくないけれど、YouTubeにFull ver.も存在するようなので、紹介するにゃ。




nice!(0)  コメント(0) 
共通テーマ:音楽

[境界要素法プログラムを設計する(アウトライン)] [境界要素法]

[境界要素法プログラムを設計する(アウトライン)]

 

 

1.開発範囲の決定

 これは業務アプリの開発で言えば、顧客がどこまでの成果品を望むか?です。顧客の要求は常にドンダケ~なんですが、開発側としては出来るだけ簡単なものにしたい訳です(仕事したくないから(^^;))。今回の顧客は我々です。つまり開発者です。なので今回は、開発側の事情最優先です(^^)

 

 境界要素法プログラムの目的は、離散化された境界方程式、

  

を作る事にほぼ尽きます。しかし(1)はそのままでは解けないのでした。以下の条件を考慮する必要がありました。

[1]境界条件

 これは、未知ベクトルψqの一部に値を与える補助方程式として実装するのが簡単でした。

[2]角点の処理

 これは角点を表す節点jqjが、qj(1)qj(2)2つになり、qの成分数が増える事を意味します。それに伴い補助条件の追加も必要でした。しかも追加の仕方は、境界条件の与えられ方により変化しました。

 

 最初から[2]を扱うと面倒そうです。例えば(1)[1]だけなら、組み立てる連立方程式の形は、
  

になります。(D1 D2)ブロックは、境界条件で値を与えられる節点番号の列成分が1で、他は全て0の行列です。(d1 d2)tブロックは与える値のベクトルです。

 ψqの成分は、節点jψjqjを表しますが、z(ψ q)tと一つの未知ベクトルとしてまとめると、qjjz上での成分番号が、既にこの時点でずれます。幸いψqの成分数は同じなので、それをnとして、

  節点j→ψj→z(j),節点j→qj→z(nj)   (3)

ではあります。z(j)などは、配列zj成分の意味で使ってます。

 これに[2]が加わると、qの成分数が角点が現れるたびに増え、(3)程度の対応ではすまなくなります。当然HD2の列数も増え、どう増えるかなどを制御しなければなりません。さらにここに新たに補助方程式が加わりますが、加え方は一定ではないのでした。

 

 やっぱり最初は(1)[1]ですよね?。(1)[1]のプログラムをテストして動作確認し、自信を持って複雑そうな[2]に進むのが妥当です。(1)[1]の基本が出来れば、[2]への対処のポイントも絞れるはずです。要するに適切な実践に勝る教師なし!です。

 もう一つ考慮すべきは、テストの容易さです。作ったプログラムは必ずテストしなければなりません。例えば全部作ってから動かなかったら、バグの特定にも難儀します。その時に「(1)[1]まではOKよ」という事実があると、格段に楽になります。

 

 業務アプリの開発でも、開発サイクルを出来るだけ短く区切って頻繁にテストし、より複雑な段階へ進む事が推奨されアジャイル開発と言います。その際、個々の開発サイクルでの成果は一つの製品であり、次の段階はその拡張仕様という見方をします。

 

2.大枠決め

 「実践に勝る教師なし!」なんて言うものだから、すぐにプログラムをボトムアップで作成しようします。気持ちはわかります。ボトムアップ方式なら具体的な数式なんかを、どんどん書いて行けるので。でも「適切な」実践ですからね。開発の基本は常にトップダウンです。

 

 プログラムの目的から始まって、何をやりたいか?何をやるべきか?のアウトラインをトップダウンで決めます。それを詳細化して行くと、局所的なボトムアップ作業へと自然につながります。こうすると常に全体を見渡しながら局所的な具体化作業に集中できます。こうすると「後で考えれば明らかだったよなぁ~」みたいな不用意で不必要なバグは激減します。

 もう一つ大事なのは、トップダウン中の方針決定には、必ず明確な理由がある事。プログラム作成は、何をやろうと一長一短。すると局所的な便利さ不便さから、大域的な方針まで変更したくなります。その時、変更するのか我慢すべきか判断が必要です。全体系の整合性を保つ判断根拠になるのが、明確な決定理由です。

bem9-fig-003.png 自分は一時期アプリ開発で飯を食ってたので、プロの言葉は信じて良いですよぉ~(←ほんとか?(^^;))。

 

 まず実用的なプログラムの全体構成は一個しかありません。図-3です。これ以外ないですよね?。ここで問題になるのは[メモ欄]だと思いますが、これは必須です。ここにプログラムの仕様を書いて行きます。[メモ欄]を読めば、全体を見渡せるように書きます。これを怠ると、たいてい後でこっぴどい目に合います。

 

 トップダウン思考でキーになるのが、「実行者をさがせ!」です。特定された実行者が、プログラムを動かすと考えて下さい。このプログラムの目的である式(2)を見てみます。

 (D1 D2)(d1 d2)tの部分は、どうやら値を並べるだけなのでどうとでもなりそうです。対して(B H)(w)tの部分は、今までやってきた積分式を使うべきところです。

 

 BHは境界積分の項です。境界積分は個々の境界要素の境界節点を特定し、主に節点情報に基づいて積分値を得た後、それを全ての要素について足すのでした。その足し算を、行列という省略記法で書いたものがBHです。

 wは領域積分項です。同様に、領域要素の節点を特定し節点情報に基づいて積分値を得た後、それを全ての要素について足します。

 

 自分は、このプログラムの実行者は「要素」だと思います。

 境界要素や領域要素は具体的には節点で定義されます。しかし図-12に示すように、同じ節点が隣の要素(一つとは限らない)に共有されたりします。従って要素-節点対応表が必要です。こんな具合です。

 

※ 領域要素の番号付けは、具体的な要素発生が不明なので例です。

 

 ここでB_Countは境界要素数,BN_Countは境界節点数。R_Countは領域要素数,RN_Countは領域節点数。これらは[入力部]で具体的に要素データと節点データが与えられた時に、セットされるべきものです。表中のjの下の121234は、境界要素では1:始端,2終端を表し、領域要素ではこの順番で左回りに節点を順序付ける事を意味します。

 

 要素-節点対応表はもちろん配列で定義しますが、十進BASICでは可変長配列が使えないので、最初に配列寸法の上限を決めておく必要があります。ここでは、配列寸法上限:1000、としておきます。

 

 境界要素に対する要素-節点対応表は、EN_B(k2)の形にします。

 kが境界要素番号,2の並びが先の12に対応します。EN_B(k2)の内容は、(k1)(k2)で指定される境界要素kが持つ節点番号です。

 同様に領域要素ではEN_R(k4)の形にします。

 kが領域要素番号,4の並びが先の14に対応し、(kj)j14で指定される領域要素kが持つ節点番号を格納します。

 

 節点の具体的情報が必要です。節点データは当然、座標データで入力されます。これも配列で定義すべきです。境界節点座標はBN(j2),領域節点座標はRN(j2)とします。jが節点番号,2の並びがx座標,y座標です。

 

 次に未知ベクトルψqです。式(2)の計算方針では、ψqを一つの未知ベクトルz(ψ q)tとして扱います。それが連立方程式の組み方として、最も単純だったからです。

 理想的には節点jにおいてψjqjですが、(ψ q)tとまとめた時点でもうその扱いはできません。ψの成分数は明らかに境界節点数BN_Countと同じです。j→ψj→z(j)です。従ってj→qj→z(BN_Count+j)です。確かにこの規則があれば、各未知数のzの中での位置の特定は簡単です。しかしいずれ[2]を考慮するのでした。その時には、もっと複雑な対応付けに迫られます。節点-未知数対応表も用意しておきましょう。後で手を加えたとしても、基本の形だけは、ここで整えます。

 

 節点-未知数対応表はBN_Z(j2)とします。

 jが節点番号で,(j1)ψjに対応するz上の成分番号,(j2)qjに対応するz上の成分番号です。

 

 式(1)(D1 D2)(d1 d2)tブロックは、境界条件が与えられる場所と、その値を示すものでした。これらの情報も[入力部]でセットされるべきものです。境界条件が与えられる場所の情報は、BN_BP(j2)とします。

 jは節点番号で、(j1)にはψjが与えられる/与えられないで1または0をセットします。(j2)にはqjが与えられる/与えられないで1または0をセットします。(D1 D2)ブロックで境界条件を与えるべき列番号は、節点番号jからBN_Z(j1または2)の値でわかります。(D1 D2)の成分に与える値は1です。

 

 境界条件の値の情報は、BN_BV(j2)とします。BN_BP(j2)と同様です。BN_BP(j2)の指定に対応する形で、具体的な境界条件の値を格納します。(d1 d2)tブロックで境界条件の境界値を与えるべき行番号は、jに従って、zの中で(ψ q)tの後に順番に並べるだけです。

 

 とりあえず最外殻のアウトライン決定作業としては、こんなものです。しかしここまででも、かなり沢山の事を決定し、わかった事もあります。だから[メモ欄]に決めた事を書いておくんですよ。平たく言えば、変数定義の説明です。また宣言部では必要とわかった変数(配列)を、この時点でちゃんと宣言します。後で勝手に変なものを作らせないためにです。[入力部][出力部]にも、わかった事を出来るだけ具体的に書いておきます。特に実行者が「要素」である事を明確にします。

 ※後で勝手に変なものを作るのは、じつは本人だったりするんですよね(^^;)

 

3.プログラミング言語の選択

 本当は、1.と2.を勘案しながら、システムを記述する言語を選択すべきなんですが、途中でちょろっと漏らしたように、まぁ~十進BASICで行けると思います。アマチュアにとって「無料」は大事です(^^)

 

 

 

REM [メモ欄]

REM B_Count:境界要素数

REM EN_B(k2):境界要素-節点対応表,k=1B_Count

REM (k1):要素kの始端の節点No.(k2):終端の節点No.

REM R_Count:領域要素数,Region Elements Countの略

REM EN_R(k4):領域要素-節点対応表,k=1R_Count

REM (kj)j=14jに従って要素kの要素節点No.を左回りに格納

REM BN_Count:境界節点数

REM BN(j2):境界節点座標,j=1BN_Count(j1):節点jx座標,(j2)y座標

REM RN_Count:領域節点数

REM RN(j2):領域節点座標,j=1RN_Count(j1):節点jx座標,(j2)y座標

REM BN_BP(j2):節点の境界条件の有無,j=1BN_Count

REM (j1):節点jψjが既知なら1、そうでないなら0

REM (j2):節点jqjが既知なら1、そうでないなら0

REM BN_BV(j2):境界条件の値,j=1BN_Count

REM (j1):節点jψjに与える値

REM (j2):節点jqjに与える値

REM z(i):未知ベクトル,i=12*BN_Count

REM BN_Z(j2):節点-未知数対応表,j=1BN_Count

REM (j1)ψjzの中の位置,(j2)qjzの中の位置

REM 節点j→ψj→z(j),節点j→qj→z(BN_Count+j)

 

 

REM [宣言部]

REM 配列寸法の上限は1000

REM B_Count:境界要素数

REM R_Count:領域要素数

Dim EN_B(10002) REM 境界要素-節点対応表,k=1B_Count

Dim EN_R(10004) REM 領域要素-節点対応表,k=1R_Count

REM BN_Count:境界節点数

REM RN_Count:領域節点数

Dim BN(10002) REM 境界節点座標,j=1BN_Count

Dim RN(10002) REM 領域節点座標,j=1RN_Count

Dim BN_BP(10002) REM 節点の境界条件の有無,j=1BN_Count

Dim BN_BV(10002) REM 境界条件の値,j=1BN_Count

Dim BN_Z(10002) REM 節点-未知数対応表,j=1BN_Count

Dim z(1000) REM 未知ベクトル,i=12*BN_Count

 

REM [入力部]

REM境界要素数B_Countと領域要素数R_Countは、事前に与えられると仮定する。

REM 境界要素と領域要素データは、要素ごとに節点番号が与えられると仮定する。

REM 与えられる節点番号は、左回りに順序付けられたものが与えられると仮定する。

REM 境界要素を要素番号kで読み込むLoop

REM  Loop内で要素ごとの節点番号を読み、境界要素-節点対応表EN_B(k2)をセット

REM 領域要素を要素番号kで読み込むLoop

REM  Loop内で要素ごとの節点番号を読み、領域要素-節点対応表EN_R(k4)をセット

REM境界節点数BN_Countと領域節点数RN_Countは、事前に与えられると仮定する。

REM 境界節点を節点番号jで読み込むLoop

REM   Loop内で境界節点座標を読み、BN(j2)をセット

REM 領域節点を節点番号jで読み込むLoop

REM   Loop内で領域節点座標を読み、RN(j2)をセット

REM 境界条件の場所を節点番号jで読み込むLoop

REM  Loop内で節点jの境界条件の有無を読み、BN_BP(j2)をセット

REM 境界条件の値を節点番号jで読み込むLoop

REM  Loop内で節点jの境界条件の値を読み、BN_BV(j2)をセット

REM 節点番号jLoopで、節点-未知数対応表BN_Z(j2)をセット

REM (j1)ψjzの中の位置,(j2)qjzの中の位置

REM 対応は、節点j→ψj→z(j),節点j→qj→z(BN_Count+j)

 

 

REM [計算部]

REM 境界要素番号kで境界積分を行うLoop

REM  要素番号kからEN_B(k2)に従い節点を特定し、要素ごとに境界積分を実行

REM  上記結果に基づき、係数マトリックスBHを作成

REM 領域要素番号kで領域積分を行うLoop

REM  要素番号kからEN_R(k4)に従い節点を特定し、要素ごとに領域積分を実行

REM  上記結果に基づき、既知ベクトルwを作成

REM 境界節点番号jで境界条件位置を指定するLoop

REM  節点番号jからBN_BP(j2)BN_Z(j2) に従い、(D1 D2)ブロックを作成

REM  節点番号jに従いBN_BV(j2)の値をwブロックの後に並べ、(d1 d2)ブロックを作成

REM 全体係数行列が出来たので、Gaussの掃き出し法にかけ、未知ベクトルzを求める

 

 

REM [出力部]

REM BN_Z(j2) に従いz(j)から値を読み出し、出力

 

(執筆 ddt³さん) 


nice!(0)  コメント(0) 

今日のアニソン、「パーマン」から『僕らのパーマン』 [今日のアニソン]

今日のアニソンは、アニメ「パーマン」から『僕らのパーマン』です。


新作のほうの主題歌はコチラ↓


旧作と新作では、主題歌が

nice!(2)  コメント(0) 

トップダウンかボトムアップか [ひとこと言わねば]

明日から、3日間連続で、コンピュータ・プログラミングの話が出るので、ちょっと用語の説明をするにゃ。
コンピュータのプログラムのテストには、次の2つの方法があるにゃ。
1 トップダウン(テスト)
2 ボトムアップ(テスト)

トップダウンテストとは、次のようなテストの手法。

トップダウンテストとは、複数のモジュールを結合させたプログラムを、上位モジュールから順に結合しながら検証していくテスト方法。
https://goo.gl/XTtRZ6

トップダウンテストをするとき、エライ、上のモジュールは出来ているけれど、下位モジュール(上位モジュールが「これを計算せよ」、「この絵をかけ」と命令をくだす、下位のモジュール、プログラムのこと)はまだできていない。だから、テストをするためには、下っ端である下位モジュールの代わりになるプログラムが必要になる。この下っ端プログラムの代役をする、とりあえずのプログラムをスタブと呼ぶにゃ。
プログラムを上流、上から下へ作ってゆく場合、使われるテスト方法だにゃ。

一方、ボトムアップテストとは、次のようなもの。

ボトムアップテストとは、複数のモジュールを結合させたプログラムを、下位モジュールから順に結合しながら検証していくテスト方法。
https://goo.gl/dcyeGp

ボトムアップテストは、部品である下位のブログラムから順に作ってゆくプログラムの作り方をする時に、行われるプログラムのテスト方法だにゃ。
この場合、部品である下位のプログラムは作ってあるけれど、このプログラムを動かすプログラムはまだできていない。だから、この部品プログラムがちゃんと機能するかどうかをテストするためには、このプログラムを制御し、動かすためのプログラムが必要になるケロ。この部品プログラムをとりあえず動かすためのプログラムのことを(テスト)ドライバと呼ぶにゃ。

トップダウン、ボトムアップテストの他に、ビッグバンテストと呼ばれるものがある。

ビッグバンテストとは、複数のモジュールを結合させたプログラムを、全てのモジュールを組み合わせてから一気に動作検証するテスト方法。
https://goo.gl/V6J3sF

チンタラチンタラと、テストなんてやってられないにゃ。全プログラムを一気に書き上げ、ちゃんと動くかどうかわからないけれど、「出たとこ勝負!!えいや〜」とプログラムを実行させてみるテスト法だにゃ。
なのですが、ボトムアップテストやトップダウンテストを行った後に、全プログラムを組み合わせて、ビッグバンテストを行うのが一般的。
こうしたテストを一切せず、いきなり、全プログラムを結合し、ビッグバンテストを行うと、エラーメッセージが山のように出てきて、このバグ取りが大変なことになってしまうにゃ。


ネムネコは素人だし、作るプログラムもそれほど長くないから、「たぶん、こうすればいいにゃ」という漠然とした青写真をもとに、部品の方からプログラムを作り、その部品プログラムがちゃんと動くことを確認した後、新たな部品プログラムを作り、ある程度部品が出来上がったら、それを組み合わせて、とりあえず完成版のプログラム(プロトタイプ)を作るにゃ。
そして、何か追加の機能が欲しかったら、部品を作り、プロトタイプに追加するといった手法で、プログラムを作ってゆくにゃ。
こういったプログラムの作り方をスパイラル・モデルと言うにゃ。

スパイラルモデル(Spiral Model)とは、トップダウン設計とボトムアップ設計の長所を生かしたソフトウェア開発工程のモデルであり、設計とプロトタイピングを繰り返して開発していく手法である。
https://goo.gl/kqus7R

スパイラル・モデルは、言ってみればツギハギだらけだから、システムはどこまでも肥大化し、最終的に、冗漫で無駄の多いプログラムになってしまうにゃ。



nice!(3)  コメント(0) 
共通テーマ:音楽

今日のアニソン、「ロウきゅーぶ!」から『SHOOT!』 [今日のアニソン]

今日のアニソンは、アニメ「ロウきゅーぶ!」から『SHOOT!』です。


さらに、第1期のED曲も♪



nice!(0)  コメント(0) 

第19回 ひずみテンソルと応力テンソルの関係 [テンソル入門]

第19回 ひずみテンソルと応力テンソルの関係

 

§1 ひずみテンソルと応力テンソルの関係

 

弾性体が変形し、その相対的な変位がvであるとする。このとき、ひずみテンソルΦの成分は

  ten19-001.png

となる。

等方的な弾性体では、応力テンソルΨとひずみテンソルΦの主軸は同じと考えられるので、ΦΨの共通な主軸の方向の長さ1のベクトルをabcとする。ひずみテンソルの主値と応力テンソルの主値をそれぞれε₁ε₂ε₃σ₁σ₂σ₃としたとき、

  

という関係が成り立つものとする。

等方的なので、

  

と考えられので、(1)式を

  

と変形することができる。

ここで、

  

とすれば、(2)式は

  

また、

  

は不変量で、体積膨張率である。

したがって、

  

である。

同様に、

  

つまり、

  

である。

このλμLamé(ラメ)の定数と呼ぶ。

また、応力テンソルΨ

  

これに(3)式を代入すると、

  

単位テンソルをIとすると、

  

また、

  

だから、

  

ひずみテンソルの成分を、応力テンソルの成分をとすると

  

となる。

 

テンソル積と単位テンソルを行列で表すと、

   ten19-002.png

だから、

  

また、

  ten19-003.png

 

 

§2 弾性体の釣り合い

 

弾性体内の各点の密度ρに比例した力ρKが単位体積あたりに働いているとする。さらに、弾性体の変形にともなう応力テンソルをΨとする。

弾性体内の任意の領域をVとし、その表面をSSの外法線ベクトルをnとする。

このとき、力の釣り合いは

  ten19-004.png

(テンソルの)ガウスの発散定理から

  ten19-005.png

Vは任意に選べるので、

  

となる。

これが弾性体の釣り合いの方程式である。

Kの成分をΨの成分をとすると、

  

 

特に、K=0のとき、

  

つまり、

  ten19-006.png

である。

弾性体が等方的であるとき、

  

となるので、よって、(6)式は

  

となる。


nice!(0)  コメント(0) 

今日のお休みソング、「南十字星恋歌」から『君に出逢って恋をして』 [今日のアニソン]

今日のお休みソングは、「南十字星恋歌」から『君に出逢って恋をして』です。


さらに、この曲を♪



nice!(1)  コメント(0) 
共通テーマ:音楽
前の10件 | -