teratail header banner
teratail header banner
質問するログイン新規登録
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

10764閲覧

C言語 ルンゲ・クッタ法を使っての2階微分方程式ときかた

ISARIA

総合スコア19

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/12/24 01:58

編集2015/12/24 02:31

0

0

以下の関数について,ルンゲ・クッタ法を用いて常微分方程式を解け.

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

う~ん、これは大学演習問題をそのまま丸投げしてませんか?
その解を直接回答すると、ISARIAさんのためにならないと思います。
また、たぶんルンゲ・クッタ法を理解していないと回答できない気がします。C/C++言語の使い方にまで絞り込んでから、質問されることをお勧めします。

しかし、ルンゲ・クッタ懐かしいです。今もやっているのですね。私は大学1年の頃FORTANでやりました。もうとっくの昔に忘れてしまいましたけど。

投稿2015/12/24 02:37

Chironian

総合スコア23274

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問