• ベストアンサー

exp()が計算されなくて困ってます。

#include <stdio.h> #include <math.h> #define C_B 13.5e-12 #define C_D 5.5e-12 #define R 100 #define Vb 3e3 /* Breakdown voltage [V]*/ #define Vpp 8e3 #define f 50e3 void main(void){ double C,t=0.0; double dt,tmax,i=0,v=0,bv=0,vc1=0,vc2=0,q1=0,q2=0,w=0,CR; FILE *fp; fp=fopen("test4.txt","w"); C=(C_B*C_D)/(C_B+C_D); tmax=(1/f)*2; dt=tmax/1000; w=2*3.14*f; CR=-1/(R*C_B); while(1){  if(fabs(v-vc2)>=Vb/2){   while(1){    v=(Vpp/2)*sin(w*t);    if(fabs(v-vc2)>=0.1*(Vb/2)){     i=(Vpp/2)*(C_B*w/(pow(R,2)*pow(C_B,2)*pow(w,2)-1))*(R*C_B*w*sin(w*t)-exp(CR*t)+cos(w*t)); この式で使われているexpです。↑ q1=q1+i*dt; q2=q2+i*dt; vc1=i/R; vc2=q2/C_B; } else{break;} fprintf(fp,"%1.10f %1.10f %1.10f %1.10f % 1.10f\n",t,v,i,vc2,q2); t=t+dt; if(t>=tmax)break; } } else{ while(1){ v=(Vpp/2)*sin(w*t); i=C*(v-bv)/dt; q2=q2+i*dt; q1=q1+i*dt; vc1=q1/C_D; vc2=q2/C_B; fprintf(fp,"%1.10f %1.10f %1.10f %1.10f\n",t,v,i,vc2,q2); bv=v; t=t+dt; if(fabs(v-vc2)>=Vb/2)break; if(t>=tmax)break; } } if(t>=tmax)break; } fclose( fp ); } この問題を解決できる人がいたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

計算はされてると思いますよ ただCR*tが-20000位の数になってるのでexp(CR*t)は0なります

blackdog10
質問者

お礼

確かにそうですね。。。 そんな単純なことに気が付きませんでした。 指摘していただき、ありがとうございました。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

実行結果の"test4.txt"の内容を見る限り、 どうなっているからexp()を計算してくれないと 判断されているかがよくわかりません。 判断された理由を教えていただけますか?

blackdog10
質問者

補足

text4.txtを使って、sma4というソフトでグラフ化したときに予想では減衰する波形になるとおもっていたのに、正弦波形になったので、exp()が計算されていないものだと勘違いしていました。

関連するQ&A

  • JavaScriptの配列について

    var old_array = Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); var new_array = Array('b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '<', '#', '/', '>', '%', '.', '*', '0', '!', '?', ':', '=', '|'); のような配列があり、 abcと入力するとbcd DEFと入力するとEFG 012と入力すると!23 というようなものを作りたいのですがどうすればいいでしょうか。

  • ルンゲクッタ法で数値解析(C言語)

    コンピュータ(プログラミング)のカテゴリに投稿しようかとも考えましたが、物理学に関する数値計算ということなので、物理学のカテゴリに投稿しました。 単振動や減衰振動、そして強制振動などを数値解析したいと思い、ルンゲクッタ法を使いシミュレートしてみようとしています。ルンゲクッタ法という方法を全く知らなかったので、インターネットや図書館で調べたのですが、どうしても分からないことろがあるので質問することにしました。 書籍やネットの情報を参考にしながら、単振動の場合を数値解析してみました(C言語を使って)。この単振動はうまくできたのですが、どうしても、その先の、減衰振動の数値解析がうまくいかないので、困っています。 ---- #include <stdio.h> double f1(double t,double x,double v); double f2(double t,double x,double v); int main() { double t,x,v,dt,tmax; double k1[2],k2[2],k3[2],k4[2]; x=1.0; //位置の初期値 v=0.0; //速度の初期値 dt=0.01; //刻み幅 tmax=500.0; //繰り返し最大回数 FILE *output; output=fopen("output.dat","w"); for(t=0;t<tmax;t+=dt) { k1[0]=dt*f1(t,x,v); k1[1]=dt*f2(t,x,v); k2[0]=dt*f1(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0); k2[1]=dt*f2(t+dt/2.0,x+k1[0]/2.0,v+k1[1]/2.0); k3[0]=dt*f1(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0); k3[1]=dt*f2(t+dt/2.0,x+k2[0]/2.0,v+k2[1]/2.0); k4[0]=dt*f1(t+dt,x+k3[0],v+k3[1]); k4[1]=dt*f2(t+dt,x+k3[0],v+k3[1]); x=x+(k1[0]+2.0*k2[0]+2.0*k3[0]+k4[0])/6.0; v=v+(k1[1]+2.0*k2[1]+2.0*k3[1]+k4[1])/6.0; fprintf(output,"%f %f %f\n",t,x,v); } fclose(output); return 0; } double f1(double t,double x,double v) { return v; } double f2(double t,double x,double v) { return (-x); } ---- このソースは単振動のもので、減衰振動のときは、最後の方の ---- double f1(double t,double x,double v) { return v; } double f2(double t,double x,double v) { return (-x); ---- の部分が変わるのだと思うのですが、よく分かりません。 減衰振動は、mx"=-kx-rx'で表されるので、この式を変形(?)したものが、入るのかな、という予想程度にしか分かりません。 ソースをどのように変えれば減衰振動を解析できるのでしょうか。 どなたか詳しい方、教えてください。お願いします。

  • [問]∫_C exp(-2πz)dzの値を求めよ

    曲線Cを図の通りとする。 積分路変形の原理 「複素関数f(z)が単連結領域Dで正則ならば,D内の任意の2点α,βを結ぶ曲線Cに沿った ∫_C f(z)dzは積分路Cの採り方によらず,常に一定の値を採る」 [問]∫_C exp(-2πz)dz, where C is the contour. という積分を求める問題です。 Cよりも簡単な直線C_1:z_1(t):=πt-it+i (但し,0≦t≦1)とするとdz_1(t)/dt=π-iなので ∫_C exp(-2πz)dz=∫_C exp(-2πz_1)dz_1 (∵複素平面は単連結で複素平面上の任意の点zに於いて関数exp(-2πz)は正則。 よって,積分路変形の原理が使える) =∫_0^1 exp(-2πz_1(t))dz_1(t)/dt・dt =∫_0^1 exp(-2πz_1(t))(π-i)dt =∫_0^1 πexp((-2π^2+2πi)t-2πi)-iexp((-2π^2+2πi)t-2πi))dt =π/(-2π^2+2πi)[exp(-2π^2+2πi)t-2πi)]_0^1-i/(-2π^2+2πi)[exp(-2π^2+2πi)t-2πi)]_0^1 =(π-i)/(-2π^2+2πi) ・exp(-2π^2)-exp(-2πi) となったのですがこれで正しいでしょうか?

  • exp(-π(t^2))のフーリエ変換の積分計算で

    f(t)=exp(-π(t^2))のフーリエ変換の積分計算でつまずいています。 ∫(-∞->∞)f(t)*exp(-iωt)dt で、exp(-iωt)をオイラーの公式でcosとsinの式に直し、偶関数、奇関数の性質からsinの項が消え、 2∫(0->∞)exp(-π(t^2))*cos(ωt)dtとなりました。 しかし、eの指数部分のt^2が厄介で積分ができません。 積分方法、または別解がありましたらご教授いただけると幸いです。

  • 行列の積を計算するプログラムがうまくいきません

    どこが間違っているのかわかる方お願いします ・行列A,Bはファイルから読み込む ・行列A,Bの積Cの計算には関数を用いる #include<stdio.h> #define ROW 10 #define COL 10 void MatrixProduct(int a[][COL],int b[][ROW],int c[][ROW],int n,int m ) { int i,j,k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ c[i][j]=0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ for(k=0;k<m;k++){ c[i][j]=c[i][j]+a[i][k]*b[k][j]; } } } } int main(void) { FILE *fp1,*fp2; char fname1[64],fname2[64]; int a[ROW][COL],b[ROW][COL],c[ROW][COL],n,m; int i,j,k; printf("Input file name ?"); scanf("%s",fname1); printf("Output file name ?"); scanf("%s",fname2); fp1=fopen(fname1,"r"); fp2=fopen(fname2,"w"); fscanf(fp1,"%d %d",&n,&m); MatrixProduct(a,b,c,n,m); for(i=0;i<n;i++){ for(j=0;j<n;j++){ fprintf(fp2,"%3d",c[i][j]); } fprintf(fp2,"\n"); } fclose(fp1); fclose(fp2); return(0); } fp1 3 4 1 2 3 4 2 3 4 5 3 4 5 6 1 2 3 2 3 4 3 4 5 4 5 6

  • 配列を用いたC言語プログラミングについて

    以下のルンゲクッタ法を用いたプログラムに配列などを使いさらに短くしたいのですが どのような方法が有りますか? #include <stdio.h> #include <math.h> double f1(double t1,double w,double x,double y,double z); double f2(double t1,double w,double x,double y,double z); double f3(double t1,double w,double x,double y,double z); double f4(double t1,double w,double x,double y,double z); //箱Aの関数 double g1(double t1,double a,double b,double c,double d); double g2(double t1,double a,double b,double c,double d); double g3(double t1,double a,double b,double c,double d); double g4(double t1,double a,double b,double c,double d); //箱Bの関数 int main(void) { double t1,w,x,y,z,a,b,c,d,dt,t1max,t2max,lam,gam,lat,dw,dx,dy,dz,da,db,dc,dd ; double k1[4],k2[4],k3[4],k4[4],l1[4],l2[4],l3[4],l4[4] ; ///宣言 t1 = 0.0; dt = 0.3; t1max = 40.0; //時間初期値 w = 200.0; x = 40.0; y = 30.0; z = 30.0; ///箱A初期値(w:感受性人口、x:潜伏人口、y:感染人口、z:隔離人口) a = 20.0; b = 8.0; c = 12.0; d = 10.0; ///箱B初期値(a:感受性人口、b:潜伏人口、c:感染人口,d:隔離人口) for(t1=0.0;t1<=t1max;t1+=dt) { k1[0]=dt*f1(t1,w,x,y,z); k1[1]=dt*f2(t1,w,x,y,z); k1[2]=dt*f3(t1,w,x,y,z); k1[3]=dt*f4(t1,w,x,y,z); k2[0]=dt*f1(t1+dt/2.0,w+k1[0]/2.0,x+k1[1]/2.0,y+k1[2]/2.0,z+k1[3]/2.0); k2[1]=dt*f2(t1+dt/2.0,w+k1[0]/2.0,x+k1[1]/2.0,y+k1[2]/2.0,z+k1[3]/2.0); k2[2]=dt*f3(t1+dt/2.0,w+k1[0]/2.0,x+k1[1]/2.0,y+k1[2]/2.0,z+k1[3]/2.0); k2[3]=dt*f4(t1+dt/2.0,w+k1[0]/2.0,x+k1[1]/2.0,y+k1[2]/2.0,z+k1[3]/2.0); k3[0]=dt*f1(t1+dt/2.0,w+k2[0]/2.0,x+k2[1]/2.0,y+k2[2]/2.0,z+k2[3]/2.0); k3[1]=dt*f2(t1+dt/2.0,w+k2[0]/2.0,x+k2[1]/2.0,y+k2[2]/2.0,z+k2[3]/2.0); k3[2]=dt*f3(t1+dt/2.0,w+k2[0]/2.0,x+k2[1]/2.0,y+k2[2]/2.0,z+k2[3]/2.0); k3[3]=dt*f4(t1+dt/2.0,w+k2[0]/2.0,x+k2[1]/2.0,y+k2[2]/2.0,z+k2[3]/2.0); k4[0]=dt*f1(t1+dt,w+k3[0],x+k3[1],y+k3[2],z+k3[3]); k4[1]=dt*f2(t1+dt,w+k3[0],x+k3[1],y+k3[2],z+k3[3]); k4[2]=dt*f3(t1+dt,w+k3[0],x+k3[1],y+k3[2],z+k3[3]); k4[3]=dt*f4(t1+dt,w+k3[0],x+k3[1],y+k3[2],z+k3[3]); ///箱Aルンゲクッタ l1[0]=dt*g1(t1,a,b,c,d); l1[1]=dt*g2(t1,a,b,c,d); l1[2]=dt*g3(t1,a,b,c,d); l1[3]=dt*g4(t1,a,b,c,d); l2[0]=dt*g1(t1+dt/2.0,a+l1[0]/2.0,b+l1[1]/2.0,c+l1[2]/2.0,d+l1[3]/2.0); l2[1]=dt*g2(t1+dt/2.0,a+l1[0]/2.0,b+l1[1]/2.0,c+l1[2]/2.0,d+l1[3]/2.0); l2[2]=dt*g3(t1+dt/2.0,a+l1[0]/2.0,b+l1[1]/2.0,c+l1[2]/2.0,d+l1[3]/2.0); l2[3]=dt*g4(t1+dt/2.0,a+l1[0]/2.0,b+l1[1]/2.0,c+l1[2]/2.0,d+l1[3]/2.0); l3[0]=dt*g1(t1+dt/2.0,a+l2[0]/2.0,b+l2[1]/2.0,c+l2[2]/2.0,d+l2[3]/2.0); l3[1]=dt*g2(t1+dt/2.0,a+l2[0]/2.0,b+l2[1]/2.0,c+l2[2]/2.0,d+l2[3]/2.0); l3[2]=dt*g3(t1+dt/2.0,a+l2[0]/2.0,b+l2[1]/2.0,c+l2[2]/2.0,d+l2[3]/2.0); l3[3]=dt*g4(t1+dt/2.0,a+l2[0]/2.0,b+l2[1]/2.0,c+l2[2]/2.0,d+l2[3]/2.0); l4[0]=dt*g1(t1+dt,a+l3[0],b+l3[1],c+l3[2],d+l3[3]); l4[1]=dt*g2(t1+dt,a+l3[0],b+l3[1],c+l3[2],d+l3[3]); l4[2]=dt*g3(t1+dt,a+l3[0],b+l3[1],c+l3[2],d+l3[3]); l4[3]=dt*g4(t1+dt,a+l3[0],b+l3[1],c+l3[2],d+l3[3]); ///箱Bルンゲクッタ w=w+((k1[0]+2.0*k2[0]+2.0*k3[0]+k4[0])/6.0); x=x+((k1[1]+2.0*k2[1]+2.0*k3[1]+k4[1])/6.0); y=y+((k1[2]+2.0*k2[2]+2.0*k3[2]+k4[2])/6.0); z=z+((k1[3]+2.0*k2[3]+2.0*k3[3]+k4[3])/6.0); a=a+((l1[0]+2.0*l2[0]+2.0*l3[0]+l4[0])/6.0); b=b+((l1[1]+2.0*l2[1]+2.0*l3[1]+l4[1])/6.0); c=c+((l1[2]+2.0*l2[2]+2.0*l3[2]+l4[2])/6.0); d=d+((l1[3]+2.0*l2[3]+2.0*l3[3]+l4[3])/6.0); } return 0; }

  • 変換テーブルを使った、文字列置換[JavaScript]

    以下のような、変換テーブルがあるとします。 var ascii = [' ', '!', '"', '#', '$', '%', '&', "'", '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F','G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~']; var htmlChar = [' ', '!', '"', '#', '$', '%', '&', ''', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\', ']', '^', '_', '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '{', '|', '}', '~']; ブラウザの「ソースを見る」で、ソースを見るとHTMLのフォームのテキスト入力フィールドのvalueに特殊文字コード「'」と表示されているとします。 例;ブラウザの「ソースを見る」で、ソースを見た場合: <input type="text" value="'" /> これを変換テーブルを使って、ブラウザの「ソースを見る」で、ソースを見たときに、特殊文字(' なら '(シングルクォート)に表示させたいのですが、可能でしょうか? 変更後の例;ブラウザの「ソースを見る」で、ソースを見た場合: <input type="text" value="'" />

  • 線形代数学の問題です。

    線形代数学の問題です。 u=(a,b,c),v=(d,e,f),w=(g,h,i)とするとき, pv+qu+rw=(0,0,0)を満たすp,q,rがp=q=r=0しかないとき | a b c | | d e f | ≠0 . | g h i | となることを示してください。 お願いします。

  • 電気回路 過渡現象

    下図の回路について、時刻t=0においてスイッチの位置をNから1に切り替え、さらに時間が十分に経過した後(t=Tとする)、1から2へ切り替えた。ただしv(0)=0とする。自分の解答ものせているのですがあっているのかがわかりません。ご確認おねがいします。 (1)スイッチの位置を1から2へ切り替える直前のコンデンサCの電圧はいくらか。 V=E (2)スイッチの位置が1にあるとき(0<t<T)、コンデンサCの電圧V(t)に関する回路の方程式(微分方程式)を求めなさい。 Rに流れる電流をiとする。 E=Ri+v (a) i=dq/dt (b) q=Cv (c) (b)(c)式より i=Cdv/dt (d) (d)を(a)に代入して E=RC*dv/dt+v (f) (f)式か問2の解答かなぁっと思っています・ (3)スイッチの位置が1にあるとき(0<t<T)、コンデンサCの電圧V(t)を求めなさい。 上式(f)の微分方程式を解くと v(t)=E{1-e^(-t/(RC))} (4)スイッチの位置が2にあるとき(t>T)、コイルLの電流i(t)に関する回路の方程式(微分方程式)を求めなさい。 L*di/dt+Ri=V (1) V=q/C (2) (2)を(1)式に代入する L*di/dt+Ri=q/C (3) (3)式の両辺を微分する L*d^2i/dt^2+R*di/dt=Cdq/dt (4) -i=dq/dt (5) (4)(5)式より L*d^2i/dt^2+R*di/dt=-Ci → L*d^2i/dt^2+R*di/dt+Ci=0 (6) (6)式が問4の解答となりました。 (5)スイッチの位置が2にあるとき(t>T)、コイルの電流i(t)を求めなさい (6)式の初期条件をどのようにいれたらいいのかがわからず,とけません。

  • この写像がユニタリである事の証明は?

    [Q] Let V be a finite dimensional space over R, with a positive definite scalar product,and let {v_1,v_2,…,v_n}=B and {w_1,w_2,…,w_n}=B' be orthnormaml bases of V. Show that the matrix M_B_B'(id) is real unitary.[Hint:Use <w_i,w_j>=1 and <w_i,w_j>=0 if i≠j,as well as the expression w_i=Σ[i=1..n]a_ij_vj,for some a_ij≠R.] (b) Let F:V→V be such that F(v_i)=w_i for all i. Show that M_B_B'(F) is unitary. の(b)について問題についてです。M_B_B'(f)は基底Bと基底B'に関してのfの表現行列を意味してます。 (b)についての質問なのですが <F(v),F(v)>=<v,v>を示さなければならないようなのです。 <F(v),F(V)>=<F(Σ[i=1..n]a_iv_i),F(Σ[i=1..n]a_iv_i)> =Σ[i=1..n]a_iv_iΣ[j=1..n]a_jv_j<F(v_i),F(v_j)> (∵Fは線形写像?) =<w_i,w_j> の形になると思います。 これからどうすれば =<v,v>に持っていけますでしょうか?

専門家に質問してみよう