###前提・実現したいこと
物理学が専門の大学院生です
二変数関数f(x,y)=cを満たす(x,y)をたくさん求めるプログラムをC言語を用いて、二分法で考えました。しかし、f(x,y)の等高線を数式処理ソフトで書かせた場合と一部一致しません。
###発生している問題・エラーメッセージ
左の赤いラインが二分法によって求めたf(x,y)=1.54をみたす点(x,y)をプロットしたもの。一方で、右の青い図が数式処理ソフトによって出力された関数f(x,y)の等高線。二分法でもとめた点(x,y)の一部がかけているのはなぜでしょうか。
###該当のソースコード
C
1include <stdio.h> 2include <math.h> 3double f(double,double); 4 5void main(void){ 6 double x,xmin,xmax,xmid,y,eps; 7 int cnt,cntlimit,i,m; 8 FILE *file; 9 10 eps=0.001; 11 cntlimit=100000; 12 13 file = fopen("data.dat","w"); 14 cnt=0; 15 16 for(i=-500;i<=500;i++){ 17 18 y=2.0+i/100.0; 19 xmax=2.5; 20 xmin=0.0; 21 22 do{ 23 cnt ++; 24 xmid=(xmax+xmin)/2.0; 25 26 if( f(xmin,y)*f(xmid,y)<0.0) xmax=xmid ; 27 else xmin=xmid; 28 29 }while( fabs(xmax-xmin)>eps && cnt < cntlimit ); 30 31 if(cnt==10000) fprintf(file,"It doesnt converge \n"); 32 else if( fabs(f(xmid,y))>0.01 ) fprintf(file,"0\t0\n"); 33 else fprintf(file,"%f\t%f\n",xmid,y); 34 35 36 } 37 38 for(i=-500;i<=500;i++){ 39 40 y=2.0+i/100.0; 41 xmax=-0.0; 42 xmin=-2.5; 43 44 do{ 45 cnt ++; 46 xmid=(xmax+xmin)/2.0; 47 48 if( f(xmin,y)*f(xmid,y)<0.0) xmax=xmid ; 49 else xmin=xmid; 50 51 }while( fabs(xmax-xmin)>eps && cnt < cntlimit ); 52 53 if(cnt==10000) fprintf(file,"It doesnt converge \n"); 54 else if( fabs(f(xmid,y))>0.01 ) fprintf(file,"0\t0\n"); 55 else fprintf(file,"%f\t%f\n",xmid,y); 56 57 58 } 59 60 61 fclose(file); 62} 63 64double f(double kx,double ky){ 65 double c=1.98; 66 double w2p,w2d,eE,t,s,d,Ec,Ev; 67 68 t=-1; 69 s=0; 70 d=1; 71 eE=0.5; 72 73 w2p=3+4*cos(sqrt(3)*(kx+eE)/2.0)*cos(ky/2.0)+2*cos(ky); 74 w2d=3+4*cos(sqrt(3)*(kx-eE)/2.0)*cos(ky/2.0)+2*cos(ky); 75 76 Ec=(2*t*s*w2p+sqrt(d*d-d*d*s*s*w2p+4*t*t*w2p))/(2-2*s*s*w2p); 77 Ev=(2*t*s*w2d-sqrt(d*d-d*d*s*s*w2d+4*t*t*w2d))/(2-2*s*s*w2d); 78 79 return Ec-Ev-c ; 80 81} 82
###関数f(x,y)の具体的な形
参考までに関数f(x,y)の具体的な形を載せておきます。
ここで、t=-1,s=0,d=1,eE=0.5として上のグラフは求めましたが、より一般にこれらの値を変化させて等高線の図の変化を考察するのが目的でした。
###補足情報
二分法以外のアルゴリズムでの解法がある場合はこちらのご投稿いただけますと幸甚に存じます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/10/13 00:00
退会済みユーザー
2016/10/13 06:13
退会済みユーザー
2016/10/13 06:33
2016/10/13 10:42