• 締切済み

c言語を用いた電流フィードバック回路

c言語プログラムについての質問です。画像のハーフブリッジインバータ回路で正弦波と三角波を用いたPWM制御で、抵抗の値関係なく目標電流値を出力するプログラムが作りたいのですがどうすればいいのでしょうか。 #include <math.h> #include <stdio.h> __declspec(dllexport) void simuser (t, delt, in, out) double t, delt; double *in, *out; { static double f1=10000,f2=60,v=0,n=0,h=0,c=0,x1=0,x2=0,s=0,im=0; double vout=0,k1,k2,vs,vtri,vt,pai=3.14,rad,vsin,i,j,k3,k4,va,vs1=0,vs2=0,iout,ts=0.0000025; 三角波 vtri=2; k1=1/delt; k2=(k1/f1)/2; vs=vtri/k2; h=h+1; if(h<=k2){ v=v+vs; }else if(h>=k2){ v=v-vs; }else{ v=v; } if(h>=(k2*2)){ h=0; } vt=v-(vtri/2); 正弦波 j=90; k3=1/delt; k4=(k3/f2)/4; i=j/k4; n=n+i; rad=(pai*n)/180; vsin=sin(rad); スイッチ制御1 if(vsin<vt){ x1=x1+delt; if(x1>=ts){ vs1=1; }else if(x1<ts){ vs1=0; }else{ x1=x1; } }else if(vsin>vt){ vs1=0; x1=0; }else{ vs1=vs1; } スイッチ制御2 if(vsin<vt){ vs2=0; x2=0; }else if(vsin>vt){ x2=x2+delt; if(x2>=ts){ vs2=1; }else if(x2<ts){ vs2=0; }else{ x2=x2; } }else{ vs2=vs2; } ここからが上手くいきません。 電流フィードバック iout=in[0]; im=1.5; if(im<iout){ vsin=vsin*0.09; }else if(im>iout){ vsin=vsin*1.01; }else if(im=iout){ vsin=vsin; } 出力 out[0]=vs1; out[1]=vs2; out[2]=vt; out[3]=vsin; } プログラムはこのようにしています。vsinの値を増減することで、出力電流は制御できます。プログラムとしては、出力電流値ioutをフィードバックし、目標値imと比べ、vsinの大きさを変えて、目標値に近づける、というものが作りたいです。自分で作ったものでは上手く動作しません。 c言語については初心者なので、どなたか教えていただけるとありがたいです。

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

ソースは全然詳しく見ていませんが、 ざっと見て気づいた点だけ。 > vsin=vsin*0.09; vsin*0.99では?

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

関連するQ&A

  • (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言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } 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言語 間違ったところを見つけてください。

    /* 自動検索装置        */ /* 2012年9月4日  MICR0904  */ /* AT90S2323/2343       */ #include <avr\io.h> int main (void) /*   汎用レジスターの指定     */ { long ka; long ke; long ke1; long k10; int kk; int pa; long tm1; long tm2; long tm3; DDRB = 0xfe; /* 11111110 PB0;入力 PB1;出力 */ if (!(PINB && BV(PB0)) tm2=0; tm1++; pa=tm1/100; if (pa>=10) { ka =12345; /* カルテNO ka=1~99999 */ ke = 0; /* 検索アドレス */ ke1 = 0; /* 桁検索アドレス */ k10 = 1; /* 桁x10 */ kk = 0; /* 桁カウンタ   */ pa = 0; /* 信号カウンタ */ tm1 = 0; /* 信号ONタイマ */ tm2 = 0; /* 信号OFFタイマ */ tm3 = 0; /* LED,ON-OFFタイマ */ } return 0; else ( (PINB && BV (PB0)) tm1=0; tm2++; if {(tm2!=100) return 0;} else if (tm2==100) if {(kk>5) return 0; } else if (kk<=4) ke1 = pa*k10; ke = ke+ke1; k10 = k10*10; kk ++; pa = 0; ke1 =0; tm2 = 0; if (kk!=5) return 0; else if (kk==5) if( !(PINB & BV (PB0)) return 0; else if ((PINB && BV (PB0)) if (ka !=ke) return 0; else if (ka==ke) do{ tm3=800; do{ tm3--; if (tm3>400) POBTB 0xff; else if (tm3<400) PORTB 0xfe; } while (tm3 !=0); } while (tm3 ==0); /* end of file */ }

  • C言語 ゲーム

    このプログラムに関数を一つ増やしたいのですが、うまくできません。どこを、どうすればいいでしょう? 迷路の内容は未完成です。 #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■", /*01*/"■ ■                                    ■", /*02*/"■ ■■■■ ■                               ■", /*03*/"■ ■■   ■                               ■", /*04*/"■  ■ ■■■                               ■", /*05*/"■■ ■ ■                                 ■", /*06*/"■  ■ ■                                 ■", /*07*/"■ ■■ ■                                 ■", /*08*/"■    ■ ■                               ■", /*09*/"■                                      ■", /*10*/"■                                      ■", /*11*/"■                                      ■", /*12*/"■                                      ■", /*13*/"■                                      ■", /*14*/"■                                      ■", /*15*/"■                                      ■", /*16*/"■                                      ■", /*17*/"■                                      ■", /*18*/"■                                      ■", /*19*/"■                                      ■", /*20*/"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

  • C言語 ゲーム

    今回が質問初めてです。見にくかったらすいません。下のプログラムですが、これに構造体を使わなくてはいけないのですが、まったくわかりません。みなさんはどう書き換えますか? #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <string.h> int KEY(int *Kn,int *Y,int *X); int main(void) { //数値格納 int kn; //入力キー int sty,stx; //座標 int fy,fx; //マップ範囲 int jm[25][40]; //移動可不判定 char mapc[3]={0};//複写されたマップ構成情報 //カウント int y,x; //判定生成、座標生成・描写用 //マップチップ char mc[2][3]={ /*mc[0] 移動可能*/" ", /*mc[1] 移動不可*/"■"}; //マップ構成 (最大値 25行x40列) char map[][81]={ /*00*/"■■■■■■■■■■", /*01*/"■ ■      ■", /*02*/"■ ■■■■ ■ ■", /*03*/"■ ■■   ■ ■", /*04*/"■  ■ ■■■ ■", /*05*/"■■ ■ ■   ■", /*06*/"■  ■ ■ ■■■", /*07*/"■ ■■ ■   ■", /*08*/"■    ■ ■ ■", /*09*/"■■■■■■■■■■"}; //マップ範囲算出 fy=sizeof(map)/81; //行 fx=strlen(map[0])/2; //列 //キャラクター初期座標指定 sty=8,stx=8; /* 判定生成 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2 ); if(strncmp(mc[1],mapc,2)==0){jm[y][x]=1;} //移動不可判定 else if(strncmp(mc[0],mapc,2)==0){jm[y][x]=0;} //移動可能判定 } } /* 画面出力 */ while(1){ system("cls"); //画面消去 /* 座標生成、描写 */ for(y=0;y<fy;y++){ for(x=0;x<fx;x++){ strncpy(mapc ,&map[y][(x)*2] ,2); if(jm[y][x]==0){ if(y==sty&&x==stx) {printf("%s","○");} //キャラ表示 else if(strncmp(mc[0],mapc,2)==0) {printf("%s",mapc );} //移動可能表示 } else if (strncmp(mc[1],mapc,2)==0) {printf("%s",mapc );} //移動不可表示 } if(fx<40){printf("\n");} //fxが40未満の場合、改行 } if(sty==1&&stx==1){ printf("ゴールしました\n"); } /* 入力キー、移動座標出力 */ KEY(&kn,&sty,&stx); /* 壁、マップ外への侵入防止 */ for(y=0;y<sty+1;y++){ for(x=0;x<fx;x++){ if((y==sty&&x==stx&&jm[y][x]==1)||(fy<=sty||fx<=stx)){ if(kn==0x4b){stx++;} else if(kn==0x4d){stx--;} else if(kn==0x48){sty++;} else if(kn==0x50){sty--;} break; } } } /* 終了操作 */ if(kn==0x1b){printf("▼終了します。\n") ;break;} } } /* 入力キー、移動座標出力 */ int KEY(int *Kn,int *Y,int *X){ while(1){ *Kn=getch( ); //1:通常キー if (*Kn==0){ *Kn=getch( ); //2:特殊キー if (*Kn==0x4b){(*X)--;}// ← else if (*Kn==0x4d){(*X)++;}// → else if (*Kn==0x48){(*Y)--;}// ↑ else if (*Kn==0x50){(*Y)++;}// ↓ else if (*Kn==0x80){ }//特殊キー追加場所 else {continue;} break; } else if (*Kn==0x1b){}// Esc //else if (*Kn== ){} 通常キー追加場所 else {continue;} break; } return 0; }

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

    プログラミング初心者です if関数を使用して二次方程式の解を解くプログムを作成したのですが、この作成した関数をユーザー定義関数を使用しmain 関数の中でユーザー定義関数を呼び出すことにより、 2次方程式の解を求めるプログラムへ変更したいのですが、どのように行えばいいのか分かりません… 私が作成したプログラムはこのようなものになっています #include<stdio.h> #include<stdlib.h> #include<math.h> int main(void) { double a, b, c; /*二次方程式の定数*/ double D, x1, x2, r1, r2; printf("ax^2 + bx + c = 0 の係数 a, b, c を入力してください---> \n"); scanf_s("%lf %lf %lf", &a, &b, &c); printf("2次方程式を解いた結果は次の通りとなる。\n"); if (a == 0.0) { if (b == 0.0) { printf("係数がおかしい\n"); exit(-1); } { x1 = -c / b; printf("解は%f です。\n", x1); exit(0); } } else { D = b * b - 4 * a * c; if (D >= 0) { x1 = (-b + sqrt(D)) / (2.0 * a); x2 = (-b - sqrt(D)) / (2.0 * a); if (D == 0.0) { printf("解は %f です。\n", x1); } else { printf("解は %f と %f です。¥n", x1, x2); } } else { r1 = -b / (2 * a); r2 = sqrt(-D) / (2 * a); printf("解は%.2f+%.2fi と%.2f-%.2fi \n", r1, r2, r1, r2); } } return 0; } よろしくお願いいたします

  • C言語 間違ったところを見つけてください

    /* 自動検索装置        */ /* 2012年9月4日  MICR0904  */ /* AT90S2323/2343       */ #include <avr\io.h> int main (void) /*   汎用レジスターの指定     */ { long ka; long ke; long ke1; long k10; int kk; int pa; long tm1; long tm2; long tm3; DDRB = 0xfe; /* 11111110 PB0;入力 PB1;出力 */ if (!(PINB && BV(PB0)) tm2=0; tm1++; pa=tm1/100; if (pa>=10) { ka =12345; /* カルテNO ka=1~99999 */ ke = 0; /* 検索アドレス */ ke1 = 0; /* 桁検索アドレス */ k10 = 1; /* 桁x10 */ kk = 0; /* 桁カウンタ   */ pa = 0; /* 信号カウンタ */ tm1 = 0; /* 信号ONタイマ */ tm2 = 0; /* 信号OFFタイマ */ tm3 = 0; /* LED,ON-OFFタイマ */ } return 0; else ( (PINB && BV (PB0)) tm1=0; tm2++; if {(tm2!=100) return 0;} else if (tm2==100) if {(kk>5) return 0; } else if (kk<=4) ke1 = pa*k10; ke = ke+ke1; k10 = k10*10; kk ++; pa = 0; ke1 =0; tm2 = 0; if (kk!=5) return 0; else if (kk==5) if( !(PINB & BV (PB0)) return 0; else if ((PINB && BV (PB0)) if (ka !=ke) return 0; else if (ka==ke) do{ tm3=800; do{ tm3--; if (tm3>400) POBTB 0xff; else if (tm3<400) PORTB 0xfe; } while (tm3 !=0); } while (tm3 ==0); /* end of file */ } 流れ図は/* 自動検索装置        */ /* 2012年9月4日  MICR0904  */ /* AT90S2323/2343       */ #include <avr\io.h> int main (void) /*   汎用レジスターの指定     */ { long ka; long ke; long ke1; long k10; int kk; int pa; long tm1; long tm2; long tm3; DDRB = 0xfe; /* 11111110 PB0;入力 PB1;出力 */ if (!(PINB && BV(PB0)) tm2=0; tm1++; pa=tm1/100; if (pa>=10) { ka =12345; /* カルテNO ka=1~99999 */ ke = 0; /* 検索アドレス */ ke1 = 0; /* 桁検索アドレス */ k10 = 1; /* 桁x10 */ kk = 0; /* 桁カウンタ   */ pa = 0; /* 信号カウンタ */ tm1 = 0; /* 信号ONタイマ */ tm2 = 0; /* 信号OFFタイマ */ tm3 = 0; /* LED,ON-OFFタイマ */ } return 0; else ( (PINB && BV (PB0)) tm1=0; tm2++; if {(tm2!=100) return 0;} else if (tm2==100) if {(kk>5) return 0; } else if (kk<=4) ke1 = pa*k10; ke = ke+ke1; k10 = k10*10; kk ++; pa = 0; ke1 =0; tm2 = 0; if (kk!=5) return 0; else if (kk==5) if( !(PINB & BV (PB0)) return 0; else if ((PINB && BV (PB0)) if (ka !=ke) return 0; else if (ka==ke) do{ tm3=800; do{ tm3--; if (tm3>400) POBTB 0xff; else if (tm3<400) PORTB 0xfe; } while (tm3 !=0); } while (tm3 ==0); /* end of file */ } マイクロチップの型式は/* AT90S2323/2343        ネットに書いてあるAVRISP mkllとAVR Studio 4で始めるAVRマイコン開発でAVR Studio 4をインストールして打ち込んだものです。 AVRISP mkllとAVR Studio 4で始めるAVRマイコン開発にかいてあることが間違っている場合は どの本を買えばいいんですか

  • C言語でのじゃんけん

    こんちには。 C言語の乱数を用いてじゃんけんプログラムを作ろうと思っているのですが、 エラーメッセージが出てしまいうまくいきません。 どこがおかしいのでしょうか? #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { int i,j,k; printf("じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)¥n"); for(k=k; k<=10; k++) { srand(time(NULL)); j=rand()%3+1; scanf("%d",&i); if(i==1&&j==1) printf("私はグーなので、あいこです¥n"); else if(i==1&&j==2) printf("私はチョキなので、あなたの勝ちです¥n"); else if(i==1&&j==3) printf("私はパーなので、あなたの負けです¥n"); else if(i==2&&j==1) printf("私はグーなので、あなたの負けです¥n"); else if(i=2&&j==2) printf("私はチョキなので、あいこです¥n"); else if(i==2&&j==3) printf("私はパーなので、あなたの勝ちです¥n"); else if(i==3&&j==1) printf("私はグーなので、あなたの勝ちです¥n"); else if(i==3&&j==2) printf("私はチョキなので、あなたの負けです¥n"); else if(i==3&&j==3) printf("私はパーなので、あいこです¥n"); else printf("1か2か3を入力してください¥n"); } } OS mountain lionで利用中ですが、 「じゃんけんをしましょう(ぐー:1、ちょき:2、ぱー:3)」 と表示されたまま、うまく動作しません。 教えてください。

    • ベストアンサー
    • Mac
  • 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; }