• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語;関数をfor文に入れる(物理のシミュレーション))

C言語で関数をfor文に入れる方法(物理のシミュレーション)

このQ&Aのポイント
  • C言語で複数の質点の動きを考える場合、ルンゲクッタ法を使って解くことができます。具体的な書き方は、i番目の質点をルンゲクッタ法で計算する関数f1(t, x[i], v[i])を定義し、for文を使って全質点に対して計算する方法です。
  • 質問者は関数f1の定義をmain()の外に書きましたが、その書き方が問題かもしれません。具体的な問題点は質問文章中にはありませんが、関数の定義について再検討する必要があるかもしれません。
  • 関数f1の定義には引数と返り値があります。引数は計算に必要な値を指定し、返り値は計算結果を返します。関数の定義方法や引数の使い方など、C言語の基礎的な知識が必要です。詳細な解説は外部サイトを参考にすると良いでしょう。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

えーと、関数は書き換える必要ありません。 書き換える必要があるのは呼び出す側だけです。

RAM46
質問者

お礼

お早いお返事どうもありがとうございます。 関数というものをどうも勘違いしていたようです。 もう一度考え直したら出来ました☆ 本当にありがとうございました!!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

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

>私が書いたものではどうもうまくいかず・・・ 何を書いたときにどううまくいかないのか、具体的に書いてください。 質問が具体的であれば、回答も具体的になり得ます。

RAM46
質問者

お礼

親切なお言葉ありがとうございます。 長々と書いたら失礼かと思ったのですが、返ってわかりづらいですよね。。。 また何かありましたらよろしくお願いします♪

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • c言語で、繰り返し文の中で、0.01づつ増やすには?

    c言語で、繰り返し文の中で、0.01づつ増やすには? c言語で、繰り返し文の中で、0.01づつ増やすにはどうすればよいのでしょうか? 関数F(x)=x3+2x-1 の値でx=0から5まで0.01刻みで増やし、出力させる プログラムを作成せよ。という問題です。 #include <stdio.h> int main() { double i; for(i=0;i<=5;i+=0.01){ printf("%lf",i*i*i+2*i-1); putchar('\n'); } return(0); } で、はじめにi=0なので、はじめは-1のはずですが、なぜか初めの値が11.28…と表示されます。これを0.1刻みで i+=0.1 とすると正常に作動するのですがどうでしょうか? お願いします。

  • Xcodeでのc言語のプログクムについて。

    Xcodeでのc言語のプログクムについて。 ルンゲークッタ法のプログラムを書いているのですがビルドエラーになってしまい、原因が分かりません。  ビルド結果は、 "_func",referenced from: _main in main.o "_dvector",referenced from: _main in main.o _rk4 in main.o symbol(s) not found collect2: ld returned 1 exit status  プログラムは、 #include <stdio.h> #include <stdlib.h> double *dvector(long i, long j); /* ベクトル量領域の確保*/ void free_dvector(double *a, long i); /* 領域の解放*/ double func(double x, double y); /* 関数の定義 */ /* ルンゲークッタ法 */ double *rk4( double y0, double a, double b, int n, double (*f)()); int main (void) { double *y, h, a=0.0, b=1.0, y0=1.0 ; int i, n; printf("分割式を入力してください-->"); scanf("%d",&n); y = dvector( 0, n ); /*領域の確保*/ y = rk4( y0, a, b, n, func ); /*ルンゲクッタ法*/ /* 結果の表示 */ h = (b-a)/n ; /* 刻み幅 */ for (i = 0 ; i <= n ; i++) { printf("x=%f \t y=%f \n", a+i*h, y[i] ); } return 0; } /* ルンゲクッタ法 */ double *rk4( double y0, double a, double b, int n, double (*f)() ) { double k1, k2, k3, k4, h, *y, x; int i; y = dvector( 0, n ); /* y[0,1,....,n]の確保 */ h = (b-a)/n ; /* 初期値の設定 */ y[0] = y0; x = a; /* ルンゲクッタ法 */ for ( i = 0 ; i < n ; i++) { k1 = f(x,y[i]); k2 = f(x+h/2.0, y[i]+h*k1/2.0); k3 = f(x+h/2.0, y[i]+h*k2/2.0); k4 = f(x+h, y[i]+h*k3); y[i+1] = y[i] + h/6.0 * ( k1 + 2.0*k2 + 2.0*k3 + k4 ); x += y[i]; } return y; free_dvector(y, 0); /* 領域の解放 */ }

  • ルンゲクッタ法で数値解析(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#のfor文

    質問内容に合う丁度いいカテゴリが見つからなかったのでここに投稿 しました。相応しくなければご勘弁ください。 C#を勉強中です。 http://ufcpp.net/study/csharp/sp_namespace.html を読んでいたのですが、理解できないところがあったので質問します。 「エイリアス」の「サンプル」のところのコードについてです。 ----------------------------------------------------- public static double Sin(double x) { double xx = -x*x; double fact = 1; double sin = x; for(int i=0; i<100; ++i) { fact *= i; ++i; fact *= i; ++i; x *= xx; sin += x / fact; } return sin; }//Sin ----------------------------------------------------- for文の1回めのループの最終行ではfactの値が0になってランタイム エラーになると思うのですが、実際は6になるのでしょうか? (プログラムを動かして確認する方法を学ぼうとしている途中なので こういう聞き方になっています) 0になると考えた理由は以下。 ----------------------------------------------------- fact *= i; ++i; fact *= i; ++i; ----------------------------------------------------- の最初の「;」の前ではiの値が0なので1*0=0がfactの値になり、 2番めの「;」の前ではiの値が1になり、 3番目の「;」の前では0*1=0がfactの値になり、 4番目の「;」の前ではiが2になるのではないのでしょうか? for文の1回目のループが終わった直後に ----------------------------------------------------- for(int i=0; i<100; ++i) ----------------------------------------------------- での「++i」によってiは3になるのですよね? factが6になっているには、 ----------------------------------------------------- fact *= i; ++i; fact *= i; ++i; ----------------------------------------------------- の最初のfactの代入文でiの値が2、次のfactの代入文でiの値が3 になっていなければいけないように思うのですが、上の考えと合わ ないためこれ以上読み進めることができなくなりました。 たぶん、初心者ゆえの頓珍漢な質問かと思いますが、ご指導よろしく お願いします。

  • C言語 多重配列に関して

    以下のプログラムについての質問です。 10行目 for i = 0 の時、13行目 for j = 0 で scanf("%lf", &a[0][0])に10と代入します。 この時のドス画面は input 1-th line element:10 です。ここまではいいのですが、この次がよくわかりません。私の考えでは、10行目 i = 0 の時 13行目 j = 1 となって j がNMAXまでやったら、10行目のiが1になってまた同じように動いて、10行目の i がNMAXになったら、for文が終わると考えたのですが、このプログラムの実行結果(一番下にあります)を見てみると自分の考えが間違っていることに気がつきました。 3行3列のプログラムなので、a[0][0] a[0][1] a[0][2] a[1][0].......となると考え、scanfでドス画面に9回数字を打ち込むかと思ったのですが実際は3回でした。このプログラムはどのように読んだら良いのでしょうか?? 回答宜しくお願い致します。 1  #include <stdio.h> 2  #define NMAX 3 3 4  main() 5  { 6   double a[NMAX] [NMAX], b[NMAX] [NMAX], c[NMAX] [NMAX]; 7   int i,j,k; 8 9   printf("matrix 1:\n"); 10   for(i=0; i< NMAX; i++) 11   { 12   printf("input %d-th line element:", i+1); 13   for(j=0; j< NMAX; j++); 14   { 15   scanf("%lf", &a[i][j]); 16   } 17   } 18   printf("matrix 2:\n"); 19   for(i=0; i<NMAX; i++) 20   { 21   printf("input %d-th line element:", i+1); 22   for(j=0; j< NMAX; j++); 23   { 24   scanf("%lf", &b[i] [j]); 25   } 26   } 27  for(i=0; i<NMAX; i++) 28   { 29   for(j=0; j<NMAX; j++) 30   { 31   c[i][j] = 0; 32   for(k=0; k <NMAX; k++) 33   { 34   c[i][j] += a[i][k] * b[k][j]; 35   } 36   } 37   } 38 39  printf("matrix 1 * matrix2 = :\n"); 40  for(i=0; i<NMAX; i++) 41   { 42   printf("["); 43   for(j=0;j<NMAX; j++) 44   { 45   printf("%f", c[i][j]); 46   } 47   printf("]\n"); 48   } 49  }

  • C言語の高階関数についてです。

    C言語の高階関数についてです。 double f ( (*g)(double) ){...} とすると「関数を引数にする関数」が作れますが、 「関数を引数にする関数」を引数にする関数って作れますか??? その場合は、引数のところどうやって書けばいいでしょうか??

  • C言語のプログラムを作るのに困っています。

    C言語で、4次のルンゲクッタ法を用いて微分方程式を解くプログラムを作成したいのですが、始めたばかりの初心者で分からないところだらけなので教えてください。 わからないなりに、下のプログラムを作ってみましたがエラーになります。どうすればうまくいくのでしょうか。本当に始めたばかりなので、文?の組立もよくわかりません。できればわかりやすくお願いします。 このプログラムでは微分方程式dy/dx=x^3+4xy+y+2の解を求めようとしています(自分で適当に作った方程式なので、あるのかどうかわかりません)。 そのほかにもy'=2x^2+3xy-1や、y'=sinxcosy, y'=e^xなどいろいろな微分方程式でできるようにしたいのですが、どうやるのでしょうか。 #include <stdio.h> double f(double x,double y); int main() { double x,y,dx,xmax; double k1,k2,k3,k4; FILE *fp; if ((fp=fopen("result.txt","w"))==NULL) { printf("Cannot open result.txt \n"); return 0; } dx=0.1; //刻み幅 xmax=100.0; //繰り返し最大 x=1.0; //xの初期値 y=1.0; //yの初期値 f(x,y)=x^3+4xy+y+2;; //関数f(x,y)の定義 for(x=1.0;x<xmax;x+=0.1) { k1=dx*f(x,y); k2=dx*f(x+dx/2.0,y+k1/2.0); k3=dx*f(x+dx/2.0,y+k2/2.0); k4=dx*f(x+dx,y+k3); y=y+(k1+2.0*k2+2.0*k3+k4)/6.0; printf(" %f %lf \n",x,y); fprintf(fp," %f %lf \n",x ,y); } return 0; }

  • C言語(引数)

    はじめまして。 C言語を習い始めたものです。 関数を定義するとき、よく耳にする、仮引数や実引数があると思います。 仮引数は関数の定義内で値をうけとる変数のことであり 実引数は関数を呼び出す際に渡す値を実引数というらしいのですが どこからどこまでを仮引数と呼ぶのかわかりません。 例えば、 fの関数の定義内で ↓があるとします。 (関数にする意味はないのですが、確認のためあしからず・・・) double f(double x) {     x=5;     return(x); } この場合、仮引数とよばれるものは double f(double x)の xが仮引数であって x=5;のxは仮引数と呼ばないのでしょうか?? もしそうならば void f(double x) { printf("%f",x); } のprintf("%f",x);内のxは仮引数とよぶのでしょうか? 質問の内容が意味不明かもしれませんが よろしくお願いします。

  • C言語で内積、、、わかりません。

    C言語で内積、、、わかりません。 /* double配列 vecter1 のデータと double配列 vecter2 のデータ、 および、 vecter1,vecter2 の「要素数」を関数 naiseki_f に 引数として渡す。 関数 naiseki_f 内では、 vecter1 と vecter2 とによる 「double型の内積値」を計算し、その結果を戻り値とするものである。 main関数内では、関数naiseki_fで計算した「内積値」を printf表示させるプログラムを作成せよ。 */ /* 配列の合計を求める */ #include<stdio.h> double naiseki_f(const int vecter1[],const int vecter2[]); int main(void) { int i,kosuu=10; double vecter1[10]={0.5,0.48,0.54,0.32,0.32,0.46,0.88,0.45,0.90,0.23}; double vecter2[10]={0.24,0.34,0.26,0.78,0.43,0.67,0.88,0.95,0.45,0.75}; double a; a=naiseki_f(vecter1,vecter2); /* ベクトルの内積計算 */ for(i=0; i<kosuu; i++) printf("%5.3f %5.3f\n",vecter1[i],vecter2[i]); printf("内積=%8.3f\n",a); return (0); } /* 内積を計算 */ double naiseki_f(const int vecter1[],const int vecter2[]) { int i; double ###; ############; for(i=0 ; i<10 ; i++) ################# ; return (######); } かれこれ2時間くらい悩んでいるんですが 内積をどうやって計算するのか資料をみてもわかりません、、。 main関数内は自分が入力した部分もあるので多少間違ってるかもしれません。 よろしくお願いします。

  • C言語の関数(if文やfor文を含む関数)の定義の仕方

    C言語の関数(if文やfor文を含む関数)の定義の仕方 int WINAPI WinMain(HINSTANCE hI,HINSTANCE hP,LPSTR lpC,int nC){ ●● } ↑上記のような形式のウィンドウアプリケーションの場合、 関数の定義はint WINAPI~の前にしておくべきなのでしょうか? 関数の中にif文やfor文を入れようとすると「関数定義のようですが、パラメータ リストがありません。外見上の本体をスキップします。」というエラーが出てしまいます。 int WINAPIの中で定義しようとするとそれはそれで「ローカル関数の定義が正しくありません」というエラーが出てしまいます。 詳しい方がいたらアドバイス願います。 ※関数を使わずにプログラムを組んだことはあるのですが、関数の定義に初挑戦しようとしたところ見事にわけが分からなくなってしまいました。

SH-4dとLogicのトラックミュート
このQ&Aのポイント
  • Logic pro XでSH-4dを外部音源+オーディオインターフェースとして使用時、Logicのトラックで[M]ボタンを押してもSH-4dの音がミュートされません。
  • 外部音源はミュートされてもSH-4d本体はミュートされず音が出ている様です。
  • 外部音源+オーディオインターフェースを使用する際の仕様や設定方法に関する知識をお持ちの方、回答をお待ちしています。
回答を見る

専門家に質問してみよう