痔になりやすい生活習慣とは?

c言語で標準正規乱数を発生させるために中心極限定理を使用することについての質問なのですが、

まず、一様乱数[0-1]を発生させる関数を混合合同法を用いて作成しました。

この一様乱数発生関数を用いて中心極限定理に基づき、標準正規乱数を発生させる関数を作成したいのですが、中心極限定理の具体的な使用方法がどうしてもわかりません。

どうかアドバイスをよろしくお願いします。

A 回答 (2件)

Wikipediaのこのページはご覧になったでしょうか?


http://ja.wikipedia.org/wiki/%E4%B9%B1%E6%95%B0# …
"12個の一様乱数(0,1]の和から6を減ずる方法もよく用いられる"と書いてあります。

また、以下のURLにも同じような情報があります。
http://econom01.cc.sophia.ac.jp/sda/normal.htm

const int N = 12;
float A[N];
for(int i=0;i<N;i++)A[i] = rand();

float B = 0;
for(int i=0;i<N;i++) B += (A[i]-0.5f)
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
wikipedia等のページは見たのですが、実際にプログラムにする際、どのように組み込めばよいのかわかりませんでした。
atushi256さんのおかげでだいぶ理解できました。

ただ、もう1つ疑問があります。
この場で質問を増やすのは本当に申し訳ないのですが、
for(int i=0;i<N;i++) B += (A[i]-0.5f)
のfとは何なのでしょうか??

お礼日時:2007/06/20 17:02

C言語については助言できませんが、C言語にある一様乱数を発生させる関数rand()を利用して正規乱数を発生させられれば良いのですよね?



[C言語 正規乱数]とか[ボックス・ミューラー法]というキーワードで検索してみましたか?

例えば、
http://www.inf.ie.kanagawa-u.ac.jp/c_learn/class …
http://www.sci.kagoshima-u.ac.jp/~nishio/ACP2006 …
など出てきますが。
    • good
    • 1
この回答へのお礼

ありがとうございます!
参考になりました。
なんとか解決しそうです。

お礼日時:2007/06/21 15:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q合同式法をつかって(CPad)

合同式法をつかって(CPad)

(1)一様乱数(平均1、分散1)
(2)正規乱数(平均1、分散4)のヒストグラムを作成したいのですが、
どのようにしてすればよいのでしょうか?

ちなみに乱数のプログラムは作成しました。

よろしくお願いいたします。

Aベストアンサー

0~1の一様乱数ができたのだから、それから計算してα~βの一様乱数に変換すればいいのです。
ヒント
・0~Aの一様乱数にするには、 A * drnd()
・B~B+1の一様乱数にするには、 B + drnd()


これでもわからないようなら、プログラムの本でも買ってきて熟読してください。
おそらくゲーム用の本には乱数のことも詳しく載ってるはずです。

Qc言語で正規乱数をヒストグラムで表す

c言語で正規乱数をヒストグラムで表す方法がわかりらないので、教えていただきたいです。できれば具体的なプログラムも教えていただければ幸いです。よろしくお願いします。

Aベストアンサー

(1)標準正規乱数を指定した数だけ出力するプログラムを作ってください。
 ヒストグラムのことは考えなくていいです。

(2)複数の数値データを読み込んで、そのデータをヒストグラムにするプログラムを作ってください。
正規乱数のことは考えなくていいです。


(1)(2)どちらも少し探せばサンプルプログラムが見つかるでしょう。

あとは、(1)の出力を(2)に入力するだけです。

Q正規分布の乱数生成

C言語で正規分布の乱数を発生させたいのですがどうすればいいのでしょうか?
自分なりにネットで検索して調べたのですが

void gaussrand()
{

static double V1, V2, S;
static int phase = 0;
double X;
if(phase == 0) {

do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;


} while(S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);


} else
X = V2 * sqrt(-2 * log(S) / S);

phase = 1 - phase;

}

こうありました。

例えば平均50の分散9の正規分布の乱数を1000個発生させて、配列seiki[1000]に代入したいときは、このプログラミングをどのようにすればいいのでしょうか?
もちろん、このソースではなく、他のもので説明していただけても全然構いません。

また、もしよろしければ、正規分布の他に、二項分布など他の分布でのデータの生成方法もお教えいただけたら幸いです。
よろしくお願いいたします。

C言語で正規分布の乱数を発生させたいのですがどうすればいいのでしょうか?
自分なりにネットで検索して調べたのですが

void gaussrand()
{

static double V1, V2, S;
static int phase = 0;
double X;
if(phase == 0) {

do {
double U1 = (double)rand() / RAND_MAX;
double U2 = (double)rand() / RAND_MAX;
V1 = 2 * U1 - 1;
V2 = 2 * U2 - 1;
S = V1 * V1 + V2 * V2;


} while(S >= 1 || S == 0);
X = V1 * sqrt(-2 * log(S) / S);


} else
X = V2 * sqrt(-2 * log(S) / S)...続きを読む

Aベストアンサー

gaussrand() で標準正規乱数 (平均0, 分散1の正規分布に従う乱数) が得られるから平均μ, 分散σ^2 (σの2乗) の正規分布に従う乱数が欲しければσを掛けてμを足す.

Q標準正規分布

gnuplotで標準正規分布を表示したい(へんな釣鐘形みたいな形)んですけど、plotコマンドでファイル読みだすんですけど、そのファイルに何をかきこめばいいか分かりません。いま、範囲「0、1」の正規乱数に標準平均、分散、すべてもとめたのですが、ファイルに何をかきこめば、釣鐘形のグラフがでてくるか分かりません。教えて下さい。ちなみに、OS環境としてRed hut Linux 8.0で、C言語でプログラムを作ってます。

Aベストアンサー

標準正規分布の確率密度関数は
f(x) = 1/sqrt(2π) exp(-x^2/2)
だから, 例えば

#include <math.h>
double f(double x)
{
return exp(-x*x/2) / sqrt(8*atan(1.0));
}

int main()
{
for (int i = -30000; i <= 30000; i++) {
printf("%f %f\n", i/10000.0, f(i/10000.0));
}
return 0;
}

でいいんじゃないかな?

この程度の長さでテストする気にはならないのですが ISO C に対応していれ
ばコンパイルできるはず.

Qアルゴリズム

この問題も分かりません。

選択整列法は安定か?挿入整列法とバブル整列法はどうか?

よろしくお願いします。

Aベストアンサー

安定な整列法:選択法、挿入法
不安定な整列法:バブル整列法

安定か不安定かは、すでに回答されている通り、同じキーのものが整列後も同じ順番に並んでいるかどうかと言うことです。ご自分で確かめてください。

Qアルファベットの出て来た回数

 自分で考えてみようと思って考えたプログラムなのですが、ポインタを用いてabc・・・・・とアルファベットをどう進めて行けばいいか分かりません。
 出来れば見本のプログラムを書いて頂ければうれしいです。
 
 それと、””と’’と{}の使い分けは何ですか?

 私が今考えているのは
 「a[100]という数列にランダムに入っているアルファベットはそれぞれ何回出て  きているかabcd・・・・・・zの順に出力する」
  プログラムです。
 
 下が考えてみたものです。


#include<stdio.h>
main(void)
{
static char a[100]=’adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh’;
static int count[100];
int I;
char *alpha,*suu;
alpha=a;
I=0;
while(*alpha!=’\0’)
{
for(*suu=’a’;*suu<=’z’;*suu+=’b’-‘a’)
{
if(*alpha==*suu) ++count[I];
++I;
}
}
for(*suu=’a’,I=0;*suu<=’z’;++I,*suu+=’b’-‘a’;) printf(“%c の出で来た回数は %d\n”,*suu,count[I]);
}

 自分で考えてみようと思って考えたプログラムなのですが、ポインタを用いてabc・・・・・とアルファベットをどう進めて行けばいいか分かりません。
 出来れば見本のプログラムを書いて頂ければうれしいです。
 
 それと、””と’’と{}の使い分けは何ですか?

 私が今考えているのは
 「a[100]という数列にランダムに入っているアルファベットはそれぞれ何回出て  きているかabcd・・・・・・zの順に出力する」
  プログラムです。
 
 下が考えてみたものです。


#include<stdio.h>
ma...続きを読む

Aベストアンサー

こんにちは。itohhといいます。

まずは、""と''の違いですが、文字列を指定したい場合""にします、''のときは、文字の値
そのものを扱う場合です。

配列(a)の中には、半角英小文字のみ設定されているという条件でサンプルを載せます。

void main(void)
{
  static char a[100]="adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh"; // (1)
  static int count[26]; // (2)
  int idx;
  char *alpha;
  int suu;
  
  memset( count, 0x00, sizeof(int)*26 ); // (3)
  
  // 文字列の最後まで出現頻度をカウントします。
  for( alpha=a; *alpha!='\0'; alpha++ ) // (4)
  {
    // 'a'を配列の0番目に'z'を25番目としてカウントします。
    idx = *alpha - 'a'; // (5)
    count[idx]++;
  }

  // 'a'から'z'までの件数を出力します。
  for(suu='a',idx=0; suu<='z' ; idx++,suu++) printf("%cの出で来た回数は%d\n",suu,count[idx]);
}

注意:各行の先頭に全角スペースを入れていますのでカット&コピーするときは気を付けてください。

説明:
(1)配列に初期設定する場合、""で囲みます。
(2)アルファベットは26文字なので...
(3)件数のカウンタをまとめてzeroクリアします。
(4)alphaの指すアドレスが0x00になるまでループします。
(5)上記でも書きましたが「''」で囲む場合は、文字の値となります、この場合、「'a'」
   ですから、0x61という値と同じです。

   配列「a」のはじめの文字は「'a'」ですから引き算すると「0」になり、idxに設定されます。
   配列「a」の2番目の文字は「'd'」ですから引き算すると「3」になり、idxに設定されます。

   これを最後まで繰り返すと「a」から「z」までの配列「count」に出現頻度がカウントされます。

如何でしょうか?
もし、判らないところがあれば、補足してください。

こんにちは。itohhといいます。

まずは、""と''の違いですが、文字列を指定したい場合""にします、''のときは、文字の値
そのものを扱う場合です。

配列(a)の中には、半角英小文字のみ設定されているという条件でサンプルを載せます。

void main(void)
{
  static char a[100]="adhfdfhhlljyerhcvcjhljeyruqqruqruietyiucvnasqasdjh"; // (1)
  static int count[26]; // (2)
  int idx;
  char *alpha;
  int suu;
  
  m...続きを読む

Q三角関数の記述の仕方

タイトルそのまんまなんですが、三角関数はC言語ではどのように記述すればいいでしょうか?
角度にラジアン表記でπ(パイ)を使いたいんですが、その表記方法もわかりません。
僕の持っている本に載ってなかったので質問させていただきました。
よろしくお願いします。

Aベストアンサー

C言語で三角関数を使うためには、math.h をインクルードする必要があります。使い方は例えば、こんな感じです。

#define M_PI 3.14159265358979 /* 円周率 */

double x, y, theta;

theta = M_PI / 4.0;
x = cos(theta); /* sin,cos,tanの引数は弧度法の角度です。*/
y = sin(theta);

πは上記の例のように自分で定義して使ってください。

Q0から1までの乱数(実数値)を発生させるのと、ある確率の時に処理をさせたい。

1 #include <stdio.h>
2 #include <time.h>
3 #include <stdlib.h>
4 #define P 0.05
5 int main(void)
6 {
7 int abc;
8 double x;
9 srand(time(NULL));
10 x = (double)rand()/RAND_MAX;
11 if(x > P){
12 abc = 1;
13 }
・・・
(1)0から1までのランダムな実数値を10行目で発生させているつもりですが、あまりきざみが良くない?とこ耳にはさんだので0から1までの最もいいと思われるランダムな実数値の発生を教えてもらえないでしょうか?

(2)11行目で約1/20000の確率でabcに1を代入したいのですが、上記のプログラムをどのように改良すればよろしいでしょうか?

どちらか片方でもアドバイス頂ければ幸いなので、お手数ですがよろしくお願いいたします。

Aベストアンサー

(1)
きざみがよくないのはintがカバーする範囲と
doubleがカバーする範囲ではdoubleの方が大きいからです。
doubleは浮動小数点8バイトintは整数値4バイト(処理系依存)ですし
※doubleは仮数部52ビット(IEEE754の場合)
当然です。ましてやVC++.net2003の場合RAND_MAXは0x7fff(2バイト以下)で
定義されているので尚更です。
しかしよほど精度を必要とする科学技術計算でもしないのなら
気にならないとおもいますが。

(2)
#define RANDOM(x) (rand()%(x))
として定義するのが一般的です。
RANDOM(10)とすると0~9までの整数が返ります。
RANDOM(20000)とすると0~19999が返ってきます。
とはいっても厳密にはRAND_MAXに影響するので1/20000ではありませんし
ANSI Cにはいっているのはrand()ぐらいしかあいません。
しかし相当な精度を必要としないのであれば普通は十分です。
自分でランダムな数値の発生させたいなら
アルゴリズムがのっている
http://www5.airnet.ne.jp/tomy/cpro/science.htm
を参考にしてください。

(1)
きざみがよくないのはintがカバーする範囲と
doubleがカバーする範囲ではdoubleの方が大きいからです。
doubleは浮動小数点8バイトintは整数値4バイト(処理系依存)ですし
※doubleは仮数部52ビット(IEEE754の場合)
当然です。ましてやVC++.net2003の場合RAND_MAXは0x7fff(2バイト以下)で
定義されているので尚更です。
しかしよほど精度を必要とする科学技術計算でもしないのなら
気にならないとおもいますが。

(2)
#define RANDOM(x) (rand()%(x))
として定義するのが一般的です。
RAND...続きを読む

Qリスト構造のソートで悩んでます。。。

リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。
読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m

○データ

Sakuragi
16
Rukawa
16
Miyagi
17
Akagi
18
Mitsui
18

○ソース
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MENBER 5

typedef struct data{
char name[BUFSIZ];
int age;
struct data *next;
}LIST;

LIST *newLIST(void);
LIST *sort(LIST *);

int main(int argc,char *argv[]){

FILE *fp;
LIST *p;
LIST *np;
LIST *npb;
LIST *head;

char namae[BUFSIZ];
int toshi,i;

if((fp=fopen(argv[1],"r"))==NULL){
printf("no file\n");
exit(1);
}

head = newLIST();
npb =head;

for(i=0;i<MENBER;i++){
np = newLIST();
fscanf(fp,"%s %d",namae,&toshi);
strcpy(np->name,namae);
np->age = toshi;

npb->next =np;
npb = np;
}

sort(head);

for(p=head->next;p != NULL;p=p->next){
printf("%s\t%d\n",p->name,p->age);
}

for(p=head->next;p != NULL;p=np){
np = p->next;
free(p);
}

fclose(fp);
return(0);
}

LIST *newLIST(){
LIST *p;
p = (LIST *)malloc(sizeof(LIST));
p->next = NULL;
return(p);
}

LIST *sort(LIST *head){
}

リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。
読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m

○データ

Sakuragi
16
Rukawa
16
Miyagi
17
Akagi
18
Mitsui
18

○ソース
#include <stdio.h>
#include <std...続きを読む

Aベストアンサー

ソートするには「リストの順を入れ替える」か「リストの順は変えずにデータを入れ替える」と言う処理が必要です。

第1案 リストの順を入れ替える

リストの順を入れ替えるには、各項目のnextメンバを入れ替えます。

例えば
A→B→C→D→E
の状態でBとDを入れ替えるには
「Bを指す、A->next」と「Dを指すC->next」を入れ替え
「Bの次を指す、B->next」と「Dの次を指す、D->next」を入れ替え
と言う2つの「入れ替え」を行わなければなりません。

「B」を参照している時に「Bを指す、A->next」を知るには「Bの前は何か?」を知る必要があります。

リストの項目が少ないならば、先頭から順にサーチしていけば良いですが、項目が増えればサーチに時間が掛かり、現実的ではありません。

また、nextメンバの入れ替えが煩雑になり、あまり適切とは言えません。

第2案 データの実体を入れ替える

入れ替えの際にnextメンバを変更せず、nameメンバの内容、ageメンバの内容を入れ替えます。

この場合、ソート後に一番末尾になる項目が先頭にある、と言う場合、データの実体の入れ替えが何回も発生します。

もし「データの実体サイズ」が大きいと、メモリアクセスが膨大に発生し、実用にならない速度になります。

第3案 リストの順、データの実体は入れ替えず、リストからデータへの参照のみ入れ替える。

データ構造体とリスト構造体を分離します。

typedef struct data_t {
char name[BUFSIZ];
int age;
} DATA;

typedef struct list_t {
DATA *data;
LIST *next;
} LIST;

void swapLIST(LIST *p1,LIST *p2)
{
DATA *tp;
tp = p1->data;
p1->data = p2->data;
p2->data = p1->tp;
}

LIST *newLIST(){
LIST *lp;
DATA *dp;
lp = (LIST *)malloc(sizeof(LIST));
if(lp==NULL) return(NULL);
dp = (DATA *)malloc(sizeof(DATA));
if(dp==NULL) {free(lp); return(NULL);}
lp->data = dp;
lp->next = NULL;
return(lp);
}

void sort(LIST *top){
LIST *p1;
LSTT *p2;
for(p1=top;p1->next!=NULL;p1=p1->next){
for(p2=p1->next;p2!=NULL;p2=p2->next){
if(strcmp(p1->data->name,p2->data->name) > 0) swapLIST(p1,p2);
}
}
}

int main(int argc,char *argv[]){

FILE *fp;
LIST *p;
LIST *np;
LIST *head;

char namae[BUFSIZ];
int toshi,i;

if((fp=fopen(argv[1],"r"))==NULL){
printf("no file\n");
exit(1);
}

head = NULL;
np = NULL;

for(i=0;i<MENBER;i++){
p = newLIST();
if(p==NULL) break;/*メモリ不足*/
if(head==NULL) head=p;/*最初の1個目*/
if(np!=NULL) np->next =p;/*1つ前があるなら、1つ前のnextをpに繋げる*/
fscanf(fp,"%s %d",namae,&toshi);
strcpy(p->data->name,namae);
p->data->age = toshi;
np=p;
}

sort(head);

for(p=head;p != NULL;p=p->next){
printf("%s\t%d\n",p->data->name,p->data->age);
}

for(p=head;p != NULL;p=np){
free(p->data);
np = p->next;
free(p);
}

スワップ・ソートを行う場合、2つのリストのdataメンバのみ入れ替えれば良いので、かなり処理が軽く、この方法が一番現実的です。

なお、最初に確保するデータが無駄になっているので改良してあります。

ソートするには「リストの順を入れ替える」か「リストの順は変えずにデータを入れ替える」と言う処理が必要です。

第1案 リストの順を入れ替える

リストの順を入れ替えるには、各項目のnextメンバを入れ替えます。

例えば
A→B→C→D→E
の状態でBとDを入れ替えるには
「Bを指す、A->next」と「Dを指すC->next」を入れ替え
「Bの次を指す、B->next」と「Dの次を指す、D->next」を入れ替え
と言う2つの「入れ替え」を行わなければなりません。

「B」を参照している時に「Bを指す...続きを読む

Q非定常の熱伝導方程式

非定常の熱伝導方程式はどのようにして考えれば良いのでしょうか?

非定常ということは、流入する熱流と流出する熱流の差が時間変化するという式を立てればいいのかなと思ったのですが、合ってるのかよく分かりません。

教えていただけると嬉しいです。

Aベストアンサー

非定常熱伝導では、微小領域に出入りする量として以下の4個を考えます。
(1) 入ってくる熱量 Qin
(2) 出て行く熱量 Qout
(3) 内部で発生する熱量 Qgen
(4) 内部に蓄えられる熱量 Qstr

まず簡単な1次元の熱伝導(細長い棒の伝熱)を考えます。
図1のように、幅 Δx の領域(□)の左側の位置を x [m] として、左側から入ってくる熱量を x の関数とみなして Qin = Q(x) [J/s=W] とします。そして、右側の位置 x + Δx から出て行く熱量を Qout = Q(x+Δx) [W] とします。関数 Q(x) の具体的な形は現時点では分かりませんが、Δx が非常に小さい場合、 Qout = Q(x+Δx) ≒ Q(x) + dQ/dx*Δx と近似できます。これで (1) と (2) が出ました。

  Q(x) Q(x+Δx)
   →□ →
     Δx

  【図1】

さて次に、領域(□)の内部に熱源があるとします。その熱源の単位体積あたりの熱量(熱密度)を x の関数として q(x) [W/m^3] とします。すると、領域(□)の内部での発熱量 Qgen [W] は Qgen = A*q(x)*Δx となります。A は熱が通る断面積 [m^2] です(今は1次元なので断面積はないのですが、一定で微小な断面積があるとします)。これで(3) が出ました。

最後の内部に蓄えられる熱量 Qstr ですが、ここに非定常熱伝導特有の現象(熱は急には伝わらない)が入ってきます。
ある体積 V [m^3] の物質に熱エネルギー E [J] (熱量でなくエネルギー)を与えたとき、その物質が何℃になるかというのは、その物質の比重(密度) ρ[kg/m^3] と比熱 cp [J/kg/K] を使って、E = ρ*cp*ΔT*V で表されます(ΔTは温度変化)。ところが、こうなるのは充分な時間 t が経過したときで、瞬間的には dE/dt = ρ*cp*∂T/∂t*V に従って変化します(これを t = 0~∞で積分したのが上の定常状態の式です)。ここで dE/dt というのはエネルギーの時間変化 [J/s] ですが、これは熱量 Q [J/s=W] に他なりません。したがって、領域(□)の内部に蓄えられる熱量 Qstr は、微小領域の体積を V = A*Δx でおきかえれば Qstr = ρ*cp*∂T/∂t*A*Δx となります。これで(1)から(4)までの量が出ました。

(1)から(4)までの熱量のバランスは、入ってくる熱量と内部で発生する熱量から外に出て行く熱量を差し引いたのが、内部に蓄えられる熱量ですから、 Qin + Qgen - Qout = Qstr です。したがって、 Qin = Q(x)、Qout = Q(x) + dQ/dx*Δx、Qgen = A*q(x)*Δx、Qstr = ρ*cp*∂T/∂t*A*Δx ですから

Q(x) + A*q(x)*Δx - { Q(x) + dQ/dx*Δx } = ρ*cp*∂T/∂t*A*Δx → -dQ/dx*Δx + A*q(x)*Δx = ρ*cp*∂T/∂t*A*Δx --- [1]

最後に、熱伝導に関するフーリエの法則を利用します。温度勾配があるとき、そこを流れる熱量は温度勾配に比例するという法則で、Q = -A*λ*dT/dx という式で表されます。Tは温度 [K] ですが、場所 x の関数なので一定ではありません。A は熱が通る断面積 [m^2] です(上でも説明しましたが、今は1次元なので断面積はないのですが、一定で微小な断面積があるとします)。λは物質の熱伝導率 [W/m/K] で、この値が大きいほど、小さい温度勾配でたくさんの熱が移動します。-符号がついているのは、例えば温度勾配 dT/dx が+のとき(x が増えるほど高温度)、熱は反対方向に移動するからです。Q > 0 というのはx軸方向に流れる熱量、Q < 0 は反対方向に流れる熱量です。多くの熱を移動(加熱や冷却)させるには、熱伝導率が大きな物質を使い、伝熱面積は大きく、温度勾配(温度差)を大きくすればいいわけです。このフーリエの法則を使うと、dQ/dx = -d(A*λ*d^2T/dx)/dx ですから、式 [1] は -d(A*λ*d^2T/dx)/dx *Δx + A*q(x)*Δx = ρ*cp*∂T/∂t*A*Δx  となりますが、Aはxによらず一定と仮定しているので偏微分の外に出せます。すると各項に共通してA*Δx が出てくるので、これを消すと

d(λ*dT/dx)/dx + q(x) = ρ*cp*∂T/∂t --- [2]

となります。これが非定常の1次元熱伝導方程式です。熱伝導率 λ を定数(場所依存なし)として、偏微分の外に出して整理すれば

d^2T/dx^2 + q(x)/λ = α*∂T/∂t --- [2']

となります。α( = ρ*cp/λ ) は温度伝導率で、これが大きいほど熱の伝わりが遅くなります。内部に熱源がない場合は、 q(x) = 0 なので

d^2T/dx^2 = α*∂T/∂t --- [3]

となります。さらに定常状態では、∂T/∂t = 0 なので、式(3)は

d^2T/dx^2 = 0 --- [4]

というラプラス方程式になります。
なお、3次元でも考えは同じで、断面積 A を Δy*Δx として、x方向以外に、y方向とz方向で Qin と Qout を考えれば良いわけです( Qgen と Qstr は方向がないので同じ値を使います)。その3次元の非定常熱電動方程式は以下のとおりです。
d(λ*dT/dx)/dx + d(λ*dT/dy)/dy + d(λ*dT/dz)/dz + q(x) = ρ*cp*∂T/∂t

非定常熱伝導では、微小領域に出入りする量として以下の4個を考えます。
(1) 入ってくる熱量 Qin
(2) 出て行く熱量 Qout
(3) 内部で発生する熱量 Qgen
(4) 内部に蓄えられる熱量 Qstr

まず簡単な1次元の熱伝導(細長い棒の伝熱)を考えます。
図1のように、幅 Δx の領域(□)の左側の位置を x [m] として、左側から入ってくる熱量を x の関数とみなして Qin = Q(x) [J/s=W] とします。そして、右側の位置 x + Δx から出て行く熱量を Qout = Q(x+Δx) [W] とします。関数 Q(x) の具体的な形は現時点...続きを読む


人気Q&Aランキング