式をC言語で立てる方法

このQ&Aのポイント
  • C言語で円板振動子の中心軸上の音圧分布を求める式をプロットするためのプログラムを作成したが、うまくいかない
  • 与えられた式はP/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ))|
  • 先生からはx軸のプログラムだけいじればy軸も出てくるとヒントをもらっているが、上手くいかない
回答を見る
  • ベストアンサー

式をC言語で立てれません

式をC言語で立てれません 式をC 言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ))| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。 ※式が間違っていたので新しく質問します。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

>m = x/l; //x軸です。 x=r/λの時のグラフを書くのに、この式は必要でしょうか? P/2ρcV = |sin(π(√((r/λ)^2 + (a/λ)^2))-(r/λ))| にx=r/λを代入すれば P/2ρcV = |sin(π(√(x^2 + (a/λ)^2))-x)| ですよね? さらに a/λ=2.5 とわかっているのですから P/2ρcV = |sin(π(√(x^2 + 2.5^2))-x)| になります。λもなくなりましたね。 C言語で書けば double al2,x,p; al2 = 2.5 * 2.5; // (a/λ)^2 for (i=0; i<100; i++) { x= (double) i; p = fabs( sin( M_PI * ( sqrt (x*x + al2) - x) ) );  printf("%9.2f %11.9f\n", x, p); } です。 以下、余談にはなりますが。 >#define F 120 //周波数(Hz) >#define C 1500 //音速(m/s) #defineは「マクロ」を定義するもので、コンパイルの前段階として、プログラム中の文字列を書き換えるものです。 これ自体に、変数型といった情報はありません。 それを踏まえると > l = C/F; //λをlとして音速÷周波数で定義できます。 これは l = 1500 / 120 ; と書いたのと同じ意味になります。 数字だけで値を書いた場合、「整数」として扱われます。 そして、整数÷整数は整数(小数点以下切り捨て)になります。 つまり l=12です。 #define F 120.0 //周波数(Hz) #define C 1500.0 //音速(m/s) と小数点付きで書けば、double型として使用されますので、 l=12.5 になります。 > printf("%9.9f %9.9f\n", m, p); 詳しくは、printfのマニュアルをよく確認してほしいのですが。 %9.9fだと、 小数点以下9桁+小数点+整数部で最低11桁必要です。最初の9で指定した桁におさまりません。 また、科学技術の分野なら、%eを使った指数表示形式の方がふさわしいでしょう。

tropical_123
質問者

お礼

返事が遅れてしまい大変申し訳ございません。 詳しい解説ありがとうございます!無事にプロットできました。

その他の回答 (1)

回答No.2

添付グラフでは、x>0 のときは衰退特性を示します。よって、あなたのプログラムは正解であると思います。 どうしても添付グラフを得たいならば for (i=0; i<100; i++) を double i; for (i=-10.0; i<10.0; i+=0.1) としなければ描画できません。

tropical_123
質問者

お礼

返事が遅れてしまい大変申し訳ございません。 画像まで貼っていただきありがとうございます!無事にプロットできました。

関連するQ&A

  • 式をC言語で立てれません

    式をC言語で立てれません こんにちは。私は今実験で円板振動子の中心軸上の音圧分布を求めています。 そこで写真のような図をプロットするために与えられた式をC言語で書いています。 式の詳細は P/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ)^2)| です。 しかしうまくプロットできません。 プログラムは ------------------------------------- #include <stdio.h> #include <math.h> #define F 120 //周波数(Hz) #define C 1500 //音速(m/s) #define A 0.2 // 半径(m) int main() { double x, m, s, p, o, w, l; int i; for (i=0; i<100; i++) { x= (double)i; //観測点までの距離を表しました。距離が変化することで音圧が変わるためです。 l = C/F; //λをlとして音速÷周波数で定義できます。 m = x/l; //x軸です。 o = m*m + (A/l)*(A/l); //式のsinの中身です。 s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 w = fabs(s); //sin全体を絶対値に置き換えます。 p = w; //新しい変数に入れます。 printf("%9.9f %9.9f\n", m, p); } return 0; } ------------------------------ といった感じです。先生からはx軸のプログラムだけいじれば勝手に y軸も出てくるとヒントを頂いているのでx軸についてのプログラムを 書いています。コンパイルはできても写真のようにいきません。 半径やλや周波数はa/λ=2.5と書いてあったので値は推測です。 C言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。

  • c言語です。

    c言語です。 実行結果 式 3 X1 + 2 X2 + 1 X3 = &g 2 X1 + 5 X2 + 2 X3 = &g 1 X1 + 4 X2 + 1 X3 = &g 解 X1 = 1 X2 = 2 X3 = 3 を 式 3 X1 + 2 X2 + 1 X3 = 10 2 X1 + 5 X2 + 2 X3 = 18 1 X1 + 4 X2 + 1 X3 = 12 解 X1 = 1 X2 = 2 X3 = 3 に直したいのですが&gの所をどのようにしたら10.18.12になりますか? #include <stdio.h> #include <float.h> #define N 3 double A[N][N] = {{3,2,1}, {2,5,2}, {1,4,1}}; double b[N] = { 10, 18, 12 }; void Gauss_J( int, double*, double* ); void main(void) { int i; printf( "%d式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g X1 + %g X2 + %g X3 = &g \n", A[i][0], A[i][1], A[i][2], b[i] ); } printf("解\n"); Gauss_J(N, (double *)A, (double *)b ); printf("X1 = %g \n", b[0]); printf("X2 = %g \n", b[1]); printf("X3 = %g \n", b[2]); } void Gauss_J(int n, double *a, double *b) { int p, i, j,I ; double pivot, c ; for ( p = 0 ; p < n ; p++ ) { pivot = a[ p*n + p ]; for ( i = p ; i < n ; i++ ) { a[ p*n + i ] /= pivot; } b[ p ] /= pivot; for ( I = 0 ; I < n ; I++) { if (I != p) { c = a[ I*n + p]; for ( j = p ; j < n; j++ ) { a[ I*n + j] -= c * a[ p*n + j ]; } b[ I ] -= c * b[ p ]; } } } return ; }

  • C言語イプシロン値

    現在使用中の開発環境(C言語使用)標準ヘッダfloat.hに単精度浮動小数点数イプシロン値が下記のように定義されています。 #define  FLT_EPSILON   0x8p-26F 「0x8p-26F」なる表現を初めて見たのですが、これはどういう意味で、具体的にどんな数字になるのでしょう? ご存じの方、教えてくださいませ。 よろしくお願いします。

  • C言語で質問です。

    C言語で質問です。 F1=2*((4*sqrt(2)*cos(y)/sin(x+y))-4) F2=1*((4*sqrt(2)*cos(x)/sin(x+y))-4) という式を、 double f1(double x,double y) {return F1*sin(x)-F2*sin(y);} という部分のF1,F2に代入したいのですが、何を使えばいいのでしょうか。 いろいろ試したのですがエラーが出てしまいます。教えてください。

  • c言語について

    このプログラムであと2行削れるとこがあるそうです。 どこがけずれますか? #include <stdio.h> #include <math.h> #define f(x) ((x)+(log(x))) #define EPS 1e-8 main( ) { double a, b, c, fa, fb, fc; int i=1; printf("input a and b: "); /*区間[a,b]の入力, a<b とする*/ scanf("%lf%lf", &a, &b); fa = f(a); fb = f(b); do { c = (a+b) / 2; /*cの値の更新*/ fc = f(c); printf(" %2d : a = %f, b = %f, c = %f, fc = %f\n", i, a, b, c, fc); if (fb*fc < 0){ a = c; fa = fc; } if (fa*fc < 0) { b = c; fb = fc; } if(fabs(fc) < EPS ) break; }while(++i<100); /*iが100以上になったら繰り返し終了*/ }

  • C言語 配列の確保

    はじめまして。C言語の勉強を最近始めたのですが、 以下のプログラムで教えていただきたい点があります。 #include <stdio.h> #include <math.h> #define x 10000 #define y 200000 #define z 1.0E-12 #define k 1.38 #define kE 1.0E-23 #define h 6.63 #define hE 1.0E-34 #define c 3.00 #define cE 1.0E+08 void main(void){ int i; double A[x+1]; double B[x+1]; for(i=0;i<=x;i++) { A[i]=(i+y)*z; B[i] = exp(-(h*hE*c*cE)/(A[i]*k*kE*1000)); printf("%e %e\n",A[i],B[i]); }} このプログラムで、xを100000にするとプログラムが動かなくなってしまいます。OSはWindowsXP、ソフトはVisual C++ 6.0を使っています。 解決方法を教えていただけないでしょうか。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語について質問です

    C言語について質問です #include <stdio.h> int main(){ int i,j; double a[8][8],p[8][8],x[8]; for(i=0;i<8;i++){ for(j=0;j<8;j++){ a[i][j]=0.0; } } x[8]={0.182289,0.063801,0.125440,0.097210,0.128485,0.080488,0.189581,0.132706}; p[8][8]={{0,25,24,14,19,5,25,10}, {24,0,50,52,15,40,20,11}, {59,18,0,35,37,24,45,12}, {34,3,28,0,22,51,43,3}, {29,31,21,33,0,22,30,15}, {37,7,75,24,38,0,28,31}, {40,8,32,15,16,21,0,21}, {26,28,28,25,24,18,36,0}}; for(i=0;i<8;i++){ for(j=0;j<8;j++){ a[i][j]=1-(x[i]/(x[i]+x[j]))/(p[i][j]/(p[i][j]+p[j][i])); printf("%f\n",a[i][j]); } } } がコンパイル出来ません。コンパイラはvisual stadio2008です。 ご指摘お願いします。

  • C言語の二項分布

    こんにちは。C言語はほとんど初心者です。 P(X=i) = nCi p^i (1-p)^n-i これは二項分布の式ですが、この二項分布をC言語で表記したいのですが、解りません。Javaのプログラムなら、ホームページを参考にできそうなのですが.....。もし、ホームページ上にあるならば、そのサイトもおしえていただけないでしょうか?

  • C言語の演算式

    C言語のプログラミングで、4×(1-1/3+1/5-1/7+・・・・・)の式を100000項まで合計した式を作りたいです。答えは3.141591になります。 自分で作成してみたのですが、なかなか上手くいきません。 どうすればよいでしょうか?以下自分の作成したプログラムを「」内に載せます。 答えは0になってしまいます。 「 #include <stdio.h> int main(void) { int i=0,a=1,b; do{ i++; if(i%2) { a+=(-1)/(2*(i-1)+1); } else{ a+=1/(2*(i-1)+1); } }while(i<100000); b=4*a; printf("π=%f\n",b-1); putchar('\n'); return (0); } 」

専門家に質問してみよう