以下の関数について,ルンゲ・クッタ法を用いて常微分方程式を解け.
x"(t) = - (c/m) x'(t) - (k/m) x(t) + u/m
ばね-マス-ダンパー系でc/m = 0.02 N s/m kg, k/m = 0.1 N/m kg, u/m =1 N/kgとする.
初期値はx'(t)= 1 m/s, x(t) = 0.05 mとして計算してみよ.数値は変えてもかまわない.
運動方程式の関数は dx/dt = f(t, x, z),dz/dt = g(t, x, z)となることに注意せよ.
という課題です。
ルンゲ・クッタ法の計算は作れたのですが、関数の中でどう値を返せばいいのか分かりました(修正)
ただ、初期値をどうやって使うのかわかりません。使わずにグラフは作ることができました、
なぜ、初期値は設定されているのでしょうか?
よろしくお願いします。
C言語
1/* 2ばね-マス-ダンパー系でc/m = 0.02 N s/m kg, k/m = 0.1 N/m kg, u/m =1 N/kgとする. 3初期値はx'(t)= 1 m/s, x(t) = 0.05 mとする 4*/ 5 6#include<stdio.h> 7#include<math.h> 8#include<stdlib.h> 9 10/* 定数定義 */ 11const float a = 0.1; //N/m kg k/m 12const float b = 0.02; //N s/m kg c/m 13const float c = 1.0; //N / kg u/m 14 15double func_1(double t, double x, double z) 16/* 17 x"(t) = -(c/m)x'(t)-(k/m)x(t)+u/m 18 ⇔ d2f/dt2 = -b*df/dt-a*df+c 19*/ 20{ 21 return z; 22} 23 24double func_2(double t, double x, double z) 25{ 26 return -b*z-a*x+c; 27} 28int main(void) 29{ 30 FILE* fp = NULL; 31 char fname[]="153R153015-13-3.csv"; 32 if((fp = fopen(fname,"w"))==NULL){ 33 printf("ファイルが開けませんでした\n"); 34 exit(1); 35 } 36 37 const double h=0.1 ; // 時間刻み 38 double t, x, z; // 変数 39 40 // 初期条件の設定.これによって解が変わる 41 t=0.0; 42 x=1.0; 43 44 double k0, k1, k2, k3, k, l0, l1, l2, l3, l; // `計算用変数 45 46 printf("t , x\n"); 47 fprintf(fp,"t , x\n"); 48 printf("%f, %f\n", t, x); // 初期状態を表示 49 fprintf(fp,"%f, %f\n", t, x); 50 51 // Runge-Kutta法による積分. 52 53 do { // たまにはdo-while文を使用 54 55 k0 = func_1(t, x, z); 56 l0 = func_2(t, x, z); 57 k1 = func_1(t+h/2, x+k0*h/2, z+l0*h/2); 58 l1 = func_2(t+h/2, x+k0*h/2, z+l0*h/2); 59 k2 = func_1(t+h/2, x+k1*h/2, z+l1*h/2); 60 l2 = func_2(t+h/2, x+k1*h/2, z+l1*h/2); 61 k3 = func_1(t+h/2, x+k2*h/2, z+l2*h/2); 62 l3 = func_2(t+h/2, x+k2*h/2, z+l2*h/2); 63 64 k = h/6.0 * (k0 + 2*k1 + 2*k2 + k3); 65 l = h/6.0 * (l0 + 2*l1 + 2*l2 + l3); 66 67 x = x + k; 68 t = t + h; 69 z = z + l; 70 71 printf("%f, %f\n", t, x); 72 fprintf(fp,"%f, %f\n", t, x); 73 74 } while(t<1000.0); 75 76 fclose(fp); 77 78 return 0; 79} 80

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。