(3-x)*exp(x)=3の数値解

はてなブログへのコードの載せ方は
www.tsubasa-note.blog
を参照した
 
今、読んでる本に
(3-x)e^x=3の数値解は...
が出てきたから、(この数値、自分で出したい!)と思って、計算機に計算させた。ニュートン法とかでビシッ!と値の近い解を出せたら格好良いだろうなぁと思いつつ...
結局、ニュートン法使わなかったけど...
C言語で計算結果をバーッと出力させた。

//reyleigh_jeans1.c
#include <stdio.h>
#include <math.h>

float f(float x);	//プロトタイプ宣言

int main(void){
	int i;
	float x=0.,y;
	for(i=0;i<500;i++){
		x=i*0.01;
		y=f(x);	//関数呼び出し
		printf("%f %f\n",x,y);
	}
	return 0;
}
float f(float x){	//関数の定義
	float y;
	y=(3-x)*exp(x)-3;
	return y;
}

Cygwinコンパイル。math.hというヘッダファイルを含んでるので、gccコマンドにオプション-lmをつけなきゃいけない。

$ gcc reyleigh_jeans1.c -lm

Cygwinで実行。

$ ./a

数字の羅列が出た。
2.82~2.83にかけて正から負に値が変化してる。
gnuplotでグラフ化したいから、Cygwin

$ ./a>"jeans.dat"

を実行。
gnuplot開いて、

gnuplot> set xrange[0:2.9] 

この後、

gnuplot> plot "jeans.dat" 

こんなグラフが出た。
f:id:zf0rest:20170930164442p:plain
マウスのポインタを合わせれば大体、2.82付近が0になるってわかるけど、もっと正確に知りたいのと、0になる点だけを表示したいなぁ...

#include <stdio.h>
#include <math.h>

float f(float x);

int main(void){
	int i;
	float x=0.,y;
	for(i=27000;i<30000;i++){	//繰り返しの開始を27000に。
		x=i*0.0001;	//0.0001ずつ増やしてく
		y=f(x);
		if(y<0.001){
			break;
		}
	}
	printf("%f %f\n",x,y);
	return 0;
}
float f(float x){
	float y;
	y=(3-x)*exp(x)-3;
	return y;
}

繰り返しを開始するところとか、増加パターンとか、脱出するタイミングとかをいろいろ試行錯誤で決めて、コンパイル、実行。

$ gcc reyleigh_jeans2.c -lm
$ ./a
2.821400 0.000544

やったー、こぎ着けた。おしまい!
ソースコードをブログ中でスクロールできるようにしたいけど、
chorusde.hatenablog.jp
これを見る限り、CSSの知識がないと無理っぽいからお手上げ。