• 締切済み

2自由度減衰振動のルンゲクッタ法

2自由度の減衰振動をルンゲクッタ法で計算したいと思い、プログラムを組んでみました。 ただし、実行結果がどうも正しいものになっていないようです。 どなたか詳しい方、教えて下さらないでしょうか? 以下が組んでみたプログラムです。 #include <stdio.h> #include <math.h> #define NDIV 500; static double m1=1.0; static double m2=1.0; static double k1=1.0; static double k2=1.0; static double c1=0.00; static double c2=0.00; // dx/dt = kx double f(double x1,double v1){ return v1; } // dv/dt = kv double g(double x1,double v1,double x2, double v2){ return -((c1+c2)*v1-c2*v2+(k1+k2)*x1-k2*x2)/m1; } double j(double x2, double v2){ return v2; } double p(double x1, double v1, double x2, double v2){ return (c2*v1-c2*v2+k2*x1-k2*x2)/m2; } int main(void){ double x1; // 変位 double x2; double v1; // 速度 double v2; double c1; double c2; // 減衰 double t; // 時刻 double h; // =dt double hh; // =dt/2 double kx11,kv11,kx21,kv21; double kx12,kv12,kx22,kv22; double kx13,kv13,kx23,kv23; double kx14,kv14,kx24,kv24; int i,n=NDIV; char a[20],*pa; FILE *fp1,*fp2,*fp3,*fp4,*fp5; h = 0.1; hh = h/2; x1 = 1; v1 = 0; x2 = 0; v2 = 0; fp1 = fopen("ju-t.txt","w"); fp2 = fopen("ju-x1.txt","w"); fp3 = fopen("ju-v1.txt","w"); fp4 = fopen("ju-x2.txt","w"); fp5 = fopen("ju-v2.txt","w"); if(fp1 == NULL){ printf("can't open/n"); } else{ printf("open/n"); } printf(" # t x1 v1 x2 v2\n"); for(i=0;i<=n;i++){ t = h*i; printf("i,t,x1,v1,x2,v2"); fprintf(fp1, "%.4f\n",t); fprintf(fp2, "%.4f\n",x1); fprintf(fp3, "%.4f\n",v1); fprintf(fp4, "%.4f\n",x2); fprintf(fp5, "%.4f\n",v2); kx11 = f(x1,v1); kv11 = g(x1,v1,x2,v2); kx21 = j(x2,v2); kv21 = p(x1,v1,x2,v2); kx12 = f(x1+hh*kx11,v1+hh*kv11); kv12 = g(x1+hh*kx11,v1+hh*kv11,x2+hh*kx21,v2+hh*kv21); kx22 = j(x2+hh*kx21,v2+hh*kv21); kv22 = p(x1+hh*kx11,v1+hh*kv11,x2+hh*kx21,v2+hh*kv21); kx13 = f(x1+hh*kx12,v1+hh*kv12); kv13 = g(x1+hh*kx12,v1+hh*kv12,x2+hh*kx22,v2+hh*kv22); kx23 = j(x2+hh*kx22,v2+hh*kv22); kv23 = p(x1+hh*kx12,v1+hh*kv12,x2+hh*kx22,v2+hh*kv22); kx14 = f(x1+h*kx13,v1+h*kv13); kv14 = g(x1+h*kx13,v1+h*kv13,x2+h*kx23,v2+h*kv23); kx24 = j(x2+h*kx23,v2+h*kv23); kv24 = p(x1+h*kx13,v1+h*kv13,x2+h*kx23,v2+h*kv23); x1 = x1 + h*(kx11+2*kx12+2*kx13+kx14)/6; v1 = v1 + h*(kv11+2*kv12+2*kv13+kv14)/6; x2 = x2 + h*(kx21+2*kx22+2*kx23+kx24)/6; v2 = v2 + h*(kv21+2*kv22+2*kv23+kv24)/6; } fclose(fp1); fclose(fp2); fclose(fp3); fclose(fp4); fclose(fp5); return 0; }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「過去類似の研究を行っていた先輩が残してくれた実行結果と異なっていた」としても, パラメータが違っていたら当然違う形になりえるわけだからそれが直接「実行結果が間違っている」ことにはつながらないのでは? で http://okwave.jp/qa/q8642263.html は放置ですか?

basa50fev0raer
質問者

お礼

パラメータは同じでしたが、先輩のとは前提条件が若干異なっていました。 今は、解決できました、回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

どういう微分方程式を解こうとしているのですか? 「実行結果がどうも正しいものになっていないようです」の根拠は?

basa50fev0raer
質問者

補足

解こうとしている微分方程式は m1*x1" = -(c1+c2)x1'+c2*x2'-(k1+k2)*x1+k2*x2 m2*x2" = c2*x1'-c2*x2'+k2*x1-k2*x2 の連立微分方程式です。 'は一階時間微分、"は二階時間微分のつもりです。 また、kはバネ係数、cは減衰係数です。 自分は大学生の研究室所属なのですが、過去類似の研究を行っていた先輩が 残してくれた実行結果と異なっていたので、正しくないのではと判断しました。

関連するQ&A

  • n自由度の振動のルンゲクッタ法

    n自由度の振動をルンゲクッタ法で計算したいと思い、プログラムの練習をしています。 現在2自由度まで計算するプログラムは組めているのですが、 nを入力し、そのnに対応した計算を行うルンゲクッタのプログラムが分かりません。 どなたか詳しい方に教えて頂きたいです。 以下に2自由度のプログラムを表示します。 #include <stdio.h> #include <math.h> #define NDIV 500; static double m1=1.0; static double m2=1.00; static double k1=1.0; static double k2=1.0; static double c1=0.30; static double c2=0.30; // dx/dt = kx double f(double x1,double v1){ return v1; } // dv/dt = kv double g(double x1,double v1,double x2, double v2){ return -((c1+c2)*v1-c2*v2+(k1+k2)*x1-k2*x2)/m1; } double j(double x2, double v2){ return v2; } double p(double x1, double v1, double x2, double v2){ return (c2*v1-c2*v2+k2*x1-k2*x2)/m2; } int main(void){ double x1; // 変位 double x2; double v1; // 速度 double v2; double c1; double c2; // 減衰 double t; // 時刻 double h; // =dt double hh; // =dt/2 double kx11,kv11,kx21,kv21; double kx12,kv12,kx22,kv22; double kx13,kv13,kx23,kv23; double kx14,kv14,kx24,kv24; int i,n=NDIV; char a[20],*pa; FILE *fp1,*fp2,*fp3,*fp4,*fp5; h = 0.1; hh = h/2; x1 = 1; v1 = 0; x2 = 0; v2 = 0; fp1 = fopen("ju-t.txt","w"); fp2 = fopen("ju-x1.txt","w"); fp3 = fopen("ju-v1.txt","w"); fp4 = fopen("ju-x2.txt","w"); fp5 = fopen("ju-v2.txt","w"); if(fp1 == NULL){ printf("can't open/n"); } else{ printf("open/n"); } printf(" # t x1 v1 x2 v2\n"); for(i=0;i<=n;i++){ t = h*i; printf("i,t,x1,v1,x2,v2"); fprintf(fp1, "%.4f\n",t); fprintf(fp2, "%.4f\n",x1); fprintf(fp3, "%.4f\n",v1); fprintf(fp4, "%.4f\n",x2); fprintf(fp5, "%.4f\n",v2); kx11 = f(x1,v1); kv11 = g(x1,v1,x2,v2); kx21 = j(x2,v2); kv21 = p(x1,v1,x2,v2); kx12 = f(x1+hh*kx11,v1+hh*kv11); kv12 = g(x1+hh*kx11,v1+hh*kv11,x2+hh*kx21,v2+hh*kv21); kx22 = j(x2+hh*kx21,v2+hh*kv21); kv22 = p(x1+hh*kx11,v1+hh*kv11,x2+hh*kx21,v2+hh*kv21); kx13 = f(x1+hh*kx12,v1+hh*kv12); kv13 = g(x1+hh*kx12,v1+hh*kv12,x2+hh*kx22,v2+hh*kv22); kx23 = j(x2+hh*kx22,v2+hh*kv22); kv23 = p(x1+hh*kx12,v1+hh*kv12,x2+hh*kx22,v2+hh*kv22); kx14 = f(x1+h*kx13,v1+h*kv13); kv14 = g(x1+h*kx13,v1+h*kv13,x2+h*kx23,v2+h*kv23); kx24 = j(x2+h*kx23,v2+h*kv23); kv24 = p(x1+h*kx13,v1+h*kv13,x2+h*kx23,v2+h*kv23); x1 = x1 + h*(kx11+2*kx12+2*kx13+kx14)/6; v1 = v1 + h*(kv11+2*kv12+2*kv13+kv14)/6; x2 = x2 + h*(kx21+2*kx22+2*kx23+kx24)/6; v2 = v2 + h*(kv21+2*kv22+2*kv23+kv24)/6; } fclose(fp1); fclose(fp2); fclose(fp3); fclose(fp4); fclose(fp5); return 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プログラミングの質問なのですが,

    Cプログラミングの質問なのですが, 以下のプログラムで正規乱数を発生させたいのですが,どこがおかしいのでしょうか? fp1のransuuはきちんとtxtで作成されています。 至急お助けください。 #include <stdio.h> #include<stdlib.h> #include<math.h> #define PI 3.141592653589793238 int main (void) { FILE *fp1,*fp2; int i,n; unsigned int x1,x2; double y1,y2; fp1=fopen("ransu.txt","r"); fp2=fopen("seikiransu.txt","w"); for(i=0;i<n;i++) { fscanf(fp1,"%lf",&x1); fscanf(fp1,"%lf",&x2); y1=sqrt(2)*sqrt(-2*log(x1))*cos(2*PI*x2); fprintf(fp2,"%lf\n",y1); } fclose(fp1); fclose(fp2); return 0; }

  • 微分方程式を解くアルゴリズムである ルンゲクッタ法

    微分方程式を解くアルゴリズムである ルンゲクッタ法の課題が出されました。 入力が周期1秒,最大値Eの矩形パルスということで 0.5秒周期でe(初期値10)を0⇒10⇒0⇒10⇒1とクロックさせたいのですが ファイルに出力してみるとずっと10のままで,0にクロックしていません・・・ 何処が原因か教えていただきたいです;; ほかにも問題があればご指摘していただきたいです>< ![イメージ説明](7309564d21bbda3453db49c0ec6147d9.jpeg) #include <stdio.h> #include <stdlib.h> #include <math.h> double clock(double E){ if(E==10) return 0; else return 10; } double dxdt(double x,int E){ double c = 0.001; double r = 50000; return (E-x)/(r*c); } // ルンゲクッタ法(初期条件x0, 区間[t0, tn]) double runge(double x0, double t0, double tn, int n) { FILE *output; FILE *output1;FILE *output2; output=fopen("output.txt","w"); output1=fopen("output1.txt","w"); output2=fopen("output2.txt","w"); double i; double x, t, h, d1, d2, d3, d4,cnt,e; x = x0; t = t0; e = 10; cnt=0; h = 0.01; // 漸化式を計算 for ( i=1; i <= n ; i++){ if(cnt==0.500000){e=clock(e); cnt=0;} t = t0 + i*h; d1 = dxdt(x,e); d2 = dxdt(x + d1*h*0.5,e); d3 = dxdt(x + d2*h*0.5,e); d4 = dxdt(x + d3*h,e); cnt= cnt + h; x += (d1 + 2 * d2 + 2 * d3 + d4)*(h/6.0); fprintf(output,"%f\n",t); fprintf(output1,"%f\n",x); fprintf(output2,"%f\n",e); } return x; } int main(void) { runge(0, 0, 1000, 50000); return 0; } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  • (C言語)プログラムが動きません。

    下のC言語のプログラムを書いたのですが、動きません。上手く作動していれば画面に「結果をrunge1.csvに書き込みました」と表示されてテキストファイルが作成されるはずですが、プログラムを実行しても何のメッセージも表示されずファイルも作成されません。ですが、bcpadのエラーメッセージの欄には何も表示されず、どこを直せばいいのか分かりません。アドバイスを下さい。お願いします。 /*ルンゲ・クッタ法による微分方程式y'+y*y=xの解*/ #include<stdio.h> #include<math.h> #define N 100 int main(void) { char *file="runge1.csv"; double x0=0.0,x1=5.0,y0=0.0,x,y,h,k1,k2,k3,k4; int i; FILE *fp; h=(x0-x1)/N; x=x0; y=y0; fp=fopen(file,"w"); fprintf(fp,"x,Runge-y\n"); fprintf(fp,"%3.2f,%3.5f\n",x,y); for(i=1;i<=N;i++){ x+=h; k1=(x-y*y)*h; k2=(x-y*y+k1/2.0)*h; k3=(x-y*y+k2/2.0)*h; k4=(x-y*y+k3)*h; y=(x-y*y)+(k1+2*k2+2*k3+k4)/6.0; fprintf(fp,"%3.2f,%3.5f\n",x,y); } fclose(fp); printf("結果を%sに書き込みました。\n",file); return(0); }

  • フーリエ変換のC言語プログラムについて

    正弦波(およびガウス性雑音)をフーリエ変換(離散)→逆フーリエ変換するというプログラムを組みました。正弦波をフーリエ変換すると実部は2回ピークがくるはずなのですが、すべて「0.000000」または「-0.000000」と表示されてしまいます。虚部は正常なようで実装の仕方もさほど違わないので、何が問題なのかわからずにいます。念のためコードはすべて載せますが、該当箇所は関数Fourierの fp = fopen("reX.txt", "w"); //書き込む あたりです。問題点を教えていただけないでしょうか。お願いします。 //gauss.txt, sin.txt:発生させたガウス性雑音&正弦波 //reX, imX:フーリエ変換の実部と虚部 //re-1, im-1:逆フーリエ変換の実部と虚部 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h> #define PI 3.14159265358979323846 #define N 256 //n:長さ, w:角周波数, p:位相(phase), a:振幅 void SinCurve(int n, double w, double p, double a) { FILE *fp; double x; int t; fp = fopen("sin.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x = a * sin( w*(double)t + p ); fprintf(fp, "%f\n", x); } } fclose(fp); } //n:長さ, s:分散, m:平均 void Gauss(int n, double s, double m) { FILE *fp; double x, x1, x2, y1; int t; srand((unsigned) time(NULL)); fp = fopen("gauss.txt", "w"); //書き込むので"w" if(fp == NULL) { printf("file open error\n"); } else { for(t = 0; t < n; t++) { x1 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); x2 = ( (double)rand() + 1.0 ) / ( (double)RAND_MAX + 2.0); y1 = pow(-2.0*log(x1), 0.5) * cos(2.0*PI*x2); y1 = s * y1 + m; fprintf(fp, "%f\n", y1); } } fclose(fp); } //ファイル名sのデータをフーリエ変換し、実部と虚部をreX, imXに保存 void Fourier(int num, char *s) { FILE *fp; int k, n; double largeX, x[N+100], t; fp = fopen(s, "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { // printf("%s\n", s); for(k = 0; k < num; k++) { fscanf(fp, "%lf", &x[k]); printf("x[%d]=%f\n", k, x[k]); } } fp = fopen("reX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*(double)k / (double)N; for(n = 0; n < num; n++) { largeX += x[n] * cos((double)n*t); // printf("%f\n", largeX); } fprintf(fp, "%f\n", largeX); printf("reX[%d]=%f\n", k, largeX); } } fp = fopen("imX.txt", "w"); //書き込む if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { largeX = 0.0; t = 2.0*PI*k / (double)N; for(n = 0; n < num; n++) { largeX -= x[n] * sin(n*t); } fprintf(fp, "%f\n", largeX); } } fclose(fp); } void InverseFourier(int num) { FILE *fp; int k, n; double a[N+100], b[N+100], x, t; //a:reX, b:imX fp = fopen("reX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &a[k]); // printf("a[%d]=%f\n", k, a[k]); } } fp = fopen("imX.txt", "r"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(k = 0; k < num; k++) { fscanf(fp, "%lf", &b[k]); // printf("b[%d]=%f\n", k, b[k]); } } fp = fopen("re-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; t = 2.0*PI*(double)n / (double)N; for(k = 0; k < num; k++) { x +=a[k] *cos(k*t) - b[k] *sin(k*t); } x /= (double)N; fprintf(fp, "%f\n", x); // printf("x[%d]=%f\n", n, x); } } /* fp = fopen("im-1.txt", "w"); //読み込み if(fp == NULL) { printf("file open error\n"); } else { for(n = 0; n < num; n++) { x = 0.0; for(k = 0; k < num; k++) { t = 2.0*PI*(double)k / (double)N; x = x + a[k] *sin(n*t) + b[k] *cos(n*t); } x /= (double)N; fprintf(fp, "%f\n", x); } } */ fclose(fp); } int main(void) { SinCurve(N, PI/8.0, 0.0, 1.0); // Gauss(N, 1.0, 0.0); Fourier(N, "sin.txt"); // Fourier(N, "gauss.txt"); InverseFourier(N); return 0; }

  • 離散フーリエ変換(DFT)のプログラム

    タイトルの通りのレポートを出されたのですが、その問題に似たサンプルソースすら何をいっているのかわからない状態です。ひとまず、サンプルソースが何をいっているのか理解したいので、いくつか教えてください。 ソースです。質問はその後に書かせてもらいました。 #include<stdio.h> #include<math.h> #define N 10 #define F 0.1 #define PI 3.14151692 #define SQR(x) ((x)*(x)) void func() { int n; FILE *fp; fp=fopen("temporal.data","w"); for(n=0;n<N;n++) fprintf(fp,"%lf\n",cos(2.0*PI*F*(double)n)); fclose(fp); } void get_data(double x[]) { int n; FILE *fp; fp=fopen("temporal.data","r"); for(n=0;n<N;n++) fscanf(fp,"%lf",&x[n]); fclose(fp); } void dft(double x[],double X_r[],double X_i[]) { int k,n; for(k=0;k<N;k++){ X_r[k]=X_i[k]=0.0; for(n=0;n<N;n++){ X_r[k]+=x[n]*cos(2.0*PI*(double)n*(double)k/(double)N); X_i[k]-=x[n]*sin(2.0*PI*(double)n*(double)k/(double)N); } } for(k=0;k<N;k++) printf("X[%d]=%lf+j%lf\n",k,X_r[k],X_i[k]); } void amplitude(double X_r[],double X_i[]) { int k; FILE *fp; double amp; fp=fopen("amp.data","w"); for(k=0;k<N;k++){ amp=sqrt(SQR(X_r[k])+SQR(X_i[k])); fprintf(fp,"%lf\n",amp); } fclose(fp); } main() { double x[N],X_r[N],X_i[N]; func(); get_data(x); dft(x,X_r,X_i); amplitude(X_r,X_i); } 文字数の制限があるみたいなので、質問を別にさせてもらいます。

  • C言語 ニュートン法

    何をすればいいかよくわからなくて躓きました わかる方どうかお願いします 問 以下に示すプログラムで、x1 = x0 - f (x0) / f '(x0)を用いて、方程式の左辺関数 f (x) (= x 2 - a ) およびその導関数 f '(x) を独立させろ。 入力変数 a はグローバル変数としてよい。 導関数 f '(x)はプログラム内ではdfと表記することとする。 また、適切なコメントも追加すること。 /* newton.c: ニュートン法 */ #include <stdio.h> // printf, fprintf, fgets, sscanf #include <math.h> // fabs double newton(double x, double (*f)(double), double (*df)(double), double eps) {   int n;   double a = 0, x, x0, err, eps = 1.0e-10;   printf("# n, x, err\n");   printf("%4d, % .15e\n", n, x);   do {     n++;     x0 = x;     x = (x0 + a/x0) / 2;     err = fabs(x-x0);     printf("%4d, % .8e, % .8e\n", n, x, err);   } while (err > eps);     return x; } int main(void) {    double a = 0, x, x0, err, eps = 1.0e-10;    char s[128];   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   while (a <= 0.0) {    fprintf(stderr, "'a' には正の数を入れてください。\n");   fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);   }   x = (a + 1.0) / 2.0;   printf("\n# sqrt(%e) = % .15e\n", a, x);    return 0; }

  • ルンゲクッタのプロクラム実行できません

    プログラムの実行ができません。 どこを直したらよいのか教えて下さい。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> #include <math.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); 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 +=h; } return y; free_dvector(y,0); }

  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

専門家に質問してみよう