ある振動の方程式をC言語を用いて、ルンゲクッタで解析するプログラムについての質...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
joecoal

ある振動の方程式をC言語を用いて、ルンゲクッタで解析するプログラムについての質...

#1

投稿記事 by joecoal » 9年前

ある振動の方程式をC言語を用いて、ルンゲクッタで解析するプログラムについての質問です。

式で表すと、
x"+rx'+(k^2)sinx-((a^2)sin2(x-j))/4
となる振動モデルをルンゲクッタで解析します。
xはある一定の値に落ち着きます。

たとえばk=0.001、r=0.01、 A=0.005、 j=0 という条件でプログラムを実行すると、
xは徐々に増加し1.489に落ち着きます。(出力はラジアン)

しかし、j に値を入れると出力xにマイナスの値が出力されます。
たとえば
j=10(度)のときは、xは-1.318...
j=50(度)のときは、xは-0.650...
が出力されてしまいます。
理想としては
j=10(度)のときは、xは0.190程度
j=50(度)のときは、xは0.567程度

具体的にどのように改良したらよいのでしょうか・・・^^;

プログラムの問題でしょうか??
よろしくお願いします

#include <stdio.h>
#include <math.h>

#define NDIV 10000;

static double k=0.001;
static double r=0.01;
static double A=0.005;
static double j=30;

// dx/dt = kx
double f(double x,double v){
return v;
}
// dv/dt = kv
double g(double x,double v){//@
return -((r*v)+(k*k)*sin(x)-((A*A)*sin(2*(x-(j*(3.14159/180)))))/4);
}

int main(void){
double x; // 変位
double v; // 速度
double t; // 時刻
double h; // =dt
double hh; // =dt/2
double kx1,kv1;
double kx2,kv2;
double kx3,kv3;
double kx4,kv4;
double pi;
int i,n=NDIV;

FILE *fp1,*fp2,*fp3;

pi = acos(-1.);
h = 10;
hh = h/2;
x = 0.01;
v = 0;
fp1 = fopen("test-t.txt", "w");
fp2 = fopen("test-x.txt", "w");
fp3 = fopen("test-v.txt", "w");

if(fp1 == NULL){
printf("can't open\n");
}else{
printf("open\n");
}
printf("honban\n");
printf(" # t x v f(!=0)\n"); //A=0;
for(i=0;i<=n;i++){
t = h*i;
if(i%10==0){
printf("%3d %7.4f %9.4f %9.4f",i,t,x,v);
printf("\n");
}
fprintf(fp1, "%.7f\n",t);
fprintf(fp2, "%.7f\n",x);
fprintf(fp3, "%.7f\n",v);
kx1 = f(x,v);
kv1 = g(x,v);
kx2 = f(x+hh*kx1,v+hh*kv1);
kv2 = g(x+hh*kx1,v+hh*kv1);
kx3 = f(x+hh*kx2,v+hh*kv2);
kv3 = g(x+hh*kx2,v+hh*kv2);
kx4 = f(x+h*kx3,v+h*kv3);
kv4 = g(x+h*kx3,v+h*kv3);
x = x + h/6*(kx1+2*kx2+2*kx3+kx4);
v = v + h/6*(kv1+2*kv2+2*kv3+kv4);
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
printf("honban3");
return 0;
}

アバター
パコネコ
記事: 139
登録日時: 9年前
住所: 大阪

Re: ある振動の方程式をC言語を用いて、ルンゲクッタで解析するプログラムについての質...

#2

投稿記事 by パコネコ » 9年前

私ではよくわかりませんが、fって必要ですか?
(その解析をよく知らないため)
fで渡してるvをそのまま返すだけならxに渡す必要ないですし・・・
ニャン!!\(゜ロ\)(/ロ゜)/

閉鎖

“C言語何でも質問掲示板” へ戻る