C言語で円板振動子の中心軸上の音圧分布を求めるプログラムを作成できません
- 円板振動子の中心軸上の音圧分布を求めるために与えられた式をC言語で書いていますが、うまくプロットできません。
- プログラムでは、与えられた式に従い、観測点までの距離や周波数、半径などの値を計算して音圧を求めています。
- しかし、コンパイルはできても、円板振動子の中心軸上の音圧分布を正しくプロットすることができません。C言語が得意ではないため、助けが必要です。
- ベストアンサー
式を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言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。
- tropical_123
- お礼率88% (8/9)
- C・C++・C#
- 回答数2
- ありがとう数8
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
C/Fはint なので精度が出ない。 科学技術計算は(メモリが許す限り)精度をとっておくか、(きちんと理解していれば)不要な精度を落とすかどちらか l=(double)(C)/F; で問題ないと思います。
その他の回答 (1)
- magicalpass
- ベストアンサー率58% (378/648)
あまり良く分かりませんが、とりあえず > s = sin(M_PI*(sqrt (o) - m)); //sin全体を定義します。 は s = sin(M_PI*(sqrt (o) - m*m)); じゃないかと……
お礼
プロットできました!回答して頂きありがとうございました。
補足
すみません! 式はP/2ρcV = |sinπ(√(r/λ)^2 + (a/λ)^2)(√はここまで)-(r/λ))|です! 最後の二乗いりませんでした。 これでよろしくお願いします。
関連するQ&A
- 式を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言語はあまり得意ではないので困っています。 お分かりになる方、ご教授お願い致します。 ※式が間違っていたので新しく質問します。
- ベストアンサー
- C・C++・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++・C#
- 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++・C#
- 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++・C#
- 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++・C#
- 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・C++・C#
- C言語のプログラミングで質問です
C言語のプログラミングで質問です. 時間を測ろうと下記のようなプログラムをしてみましたが計測時間がoTime, nTime共に0.000になってしまいます.(winmm.libはリンクさせてます) おかしいところはどこでしょうか? #include<stdio.h> #include<time.h> #include<windows.h> #include<mmsystem.h> #include<stdlib.h> #define N 2048 #define M 32 int main(int argc, char* argv[]) { int i, j, k, l; float target = 0; float* a; float* b; float c; DWORD nTime, oTime; a = (float*)malloc(sizeof(float)*N); b = (float*)malloc(sizeof(float)*N); c = 0; for(i = 0; i < N; i++) { a[i] = 1000; b[i] = 0; } oTime = timeGetTime(); for(i = 0; i < M; i++) { for(j = 1; j < N/M; j += j) { for(k = 0; k < N/M; k++) { if(k % 2 == 0) { a[k+i*N/M] += a[k+j+i*N/M]; } } } b[i] = a[i*N/M]; printf("%f\n", a[i*N/M]); } for(i = 0; i < M; i++) { target += b[i]; } c = target; nTime = timeGetTime(); printf("%f\n%f\n%f", c, oTime, nTime); getch(); return 0; }
- ベストアンサー
- C・C++・C#
- 実フーリエ係数an,bnをC言語を使って求める問題について質問です。
実フーリエ係数an,bnをC言語を使って求める問題について質問です。 自分の考え方のどこが違うのか指摘していただけたら幸いです。 係数を求める式は、 an = 1/π ∫[0..2π]f(x)cos(nx)dx ...1式 bn = 1/π ∫[0..2π]f(x)cos(nx)dx ...2式 まず、1式のanについて考えます。 扱うデータ数をN、データとデータの間隔をΔxとし、上のanの式を離散化すると、 an = 1/π シグマ[x=0..N-1]f(x)cos(n*2π*x/N)Δx ...3式 ここで、f(x)=cosx, N=4, Δx=π/2, f(0)=1,f(1)=0,f(2)=-1,f(3)=0 を与えると3式は以下のようになる。 an = (1/π)*(π/2) シグマ[x=0..3]f(x)cos(n*2π*x/4) = 1/2 シグマ[x=0..3]f(x)cos(n*π*x/2) ...4式 同様に bn = 1/2 シグマ[x=0..3]f(x)sin(n*π*x/2) ...5式 4,5式を用いて、実フーリエ係数an,bnを求めるプログラムを作成する。 (今回は表示はanのみとする) ----------------------------------------------------------------------------- #include <stdio.h> #include <math.h> #define PI 3.1414926434897//円周率 int main(){ int i,j; int num=4;//データ数 double an[4],bn[4];//フーリエ実係数an,bn double data[4]={1,0,-1,0};//扱うデータ //初期化 for(i=0; i<num;i++){ an[i]=0; bn[i]=0; } //フーリエ変換 for(i=0; i<num; i++){ for(j=0; j<num; j++){ an[i] += data[j]*cos((2*PI*i*j)/num); bn[i] += data[j]*sin((2*PI*i*j)/num); } an[i] /= 2; bn[i] /= 2; } //実フーリエ係数anを表示 for(i=0; i<num; i++){ printf("a[%d]%lf\n",i,an[i]); } return 0; } ----------------------------------------------------------------------------- 実行結果は、以下のようにanを表示します。 a[0]0.000000 a[1]1.000000 a[2]0.000000 a[3]1.000000 フーリエ級数の考え方から、ある関数F(x)は、 F(x) = a0/2 + シグマ[n=1~∞](ancos(nx) + bnsin(nx)) ...6式 のようにcosとsinの波の合成で表すことができます。 今回は関数f(x)=cosx(データ数4)に対してフーリエ変換を行ったため、cosxの成分だけが残る。 つまりn=1のときのA1が1となり、他の成分A0,A2,A3は0になると思うのですが、実行結果のa[3]の出力も1となってしまっています。 どこに原因があるのか分からなくて困っているのでアドバイスよろしくお願いします。
- ベストアンサー
- 数学・算数
お礼
返事が遅れてしまい大変申し訳ございません。 double型も関係ありました!ありがとうございました。