ページ 11

オイラー、フーリェに関する問題です

Posted: 2009年11月17日(火) 10:48
by kuroka
見ていただきありがとうございます。
問題は、物理系の問題をC言語を用いて解くことなのですが
未熟なもので、プログラムを少し読むことは出来ても、作り上げる能力がほぼ皆無です。
ですので、ここで質問しようと思い、書き込みました



質量1の3つの質点(1,2,3)が3つのバネ(A,B,C)によって接合されている。自然長の状態でのそれぞれの座標を
r1=(0,0) r2=(0,10) r3=(10,5) (←ベクトルです)
である。それぞれのバネのバネ係数は、全てk=1である。

問一
質点をr1=(0.01,1)にして、速度0でそっと放した。その後の運動をオイラー法で調べよ。

問二
固有振動をフーリェ変換で調べよ


です。
よろしければ、プログラムを書いていただいたり、ヒントを頂けたら
ありがたいです。どうかよろしくおねがいします

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月17日(火) 10:55
by kuroka
申し訳ありません
訂正です

問一
質点をr1=(0.01,1)

質点をr1=(0.01,0)

です。よろしくおねがいします

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月17日(火) 11:12
by softya
まず、規約と注意事項を良く読んで従っていただきたいです。

>課題の丸投げ(問題文だけ書く事)は禁止です。
>自分でどこまでやったのか、今どこが解らないのかを明確にして下さい。
>さっぱり解らず、手も足も出ない時は、その事を明記の上、
>勉強方法からアドバイスを受けましょう。

C言語の書き方はともかく、それぞれの問題を解くための公式や考え方は理解されていると思いますので、それを示していただきたいですね。

下記のような段階を踏んでプログラムは完成します。

1.処理の方法を考える(設計する)
 ↓
2.プログラミング言語でコーディングする。
 ↓
3.デバッグする。

なので、まず1の段階をクリアしてください。

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月18日(水) 16:32
by kuroka
プログラムをある程度はつくりましたが
コンパイルエラーが出てしまいます
よければ原因などよろしくお願いします

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

int Fx(double x1,x2,y1,y2,l){

	double l0,Dl,fx;	
	l0 = sqrt((x2-x1)^2+(y2-y1)^2);
	
	Dl = l0 - l;//変位
	
	fx = (-Dl*(x1-x2)/l0);
	return(fx);
}

int Fy(double x1,y1,x2,y2,l){

	double l0,Dl,fy;	
	l0 = sqrt((x2-x1)^2+(y2-y1)^2);
	
	Dl = l0 - l;//変位
	
	fy = (-Dl*(y1-y2)/l0);
	return(fy);
}

int main(void){

	double l10,l20,l30,fx1,fx2,fx3,fy1,fy2,fy3;	

	l10 = 10.0;
	l20 = 11.18033989; 
	l30 = 11.18033989;
	

	double Dt,t,vx1,vy1,vx2,vy2,vx3,vy3;
	Dt = 0.0001;
	int i;
		x1 = 0.01;
		y1 = 0.00;
		x2 = 0.00;
		y2 = 10.00;
		x3 = 10.00;
		y3 = 5.00;

		vx1 = 0.0;
		vy1 = 0.0;
		vx2 = 0.0;
		vy2 = 0.0;
		vx3 = 0.0;
		vy3 = 0.0;
	
		fx1 = Fx(x1,x2,y1,y2,l10)+Fx(x3,x1,y3,y1,l30);
		fy1 = Fy(x1,x2,y1,y2,l10)+Fy(x3,x1,y3,y1,l30);
		fx2 = Fx(x2,x1,y2,y1,l10)+Fx(x3,x2,y3,y2,l20);
		fy2 = Fy(x2,x1,y2,y1,l10)+Fy(x3,x2,y3,y2,l20);
		fx3 = Fx(x1,x3,y1,y3,l30)+Fx(x2,x3,y2,y3,l20);
		fy3 = Fy(x1,x3,y1,y3,l30)+Fy(x2,x3,y2,y3,l20);
		
		

	for(i=0;i<100;i++){
	
		

		vx1 = vx1+fx1*Dt;
		vy1 = vy1+fy1*Dt;
		vx2 = vx2+fx2*Dt;
		vy2 = vy2+fy2*Dt;
		vx3 = vx3+fx3*Dt;
		vy3 = vx3+fy3*Dt;

		x1 = x1+vx1*Dt;
		y1 = y1+vy1*Dt;
		x2 = x2+vx2*Dt;
		y2 = y2+vy2*Dt;
		x3 = x3+vx3*Dt;
		y3 = x3+vy3*Dt;
	
		printf("x1=%lf y1=%lf x2=%lf y2=%lf x3=%lf y3=%lf \n",x1,y1,x2,y2,x3,y3);
	
		fx1 = Fx(x1,x2,y1,y2,l10)+Fx(x3,x1,y3,y1,l30);
		fy1 = Fy(x1,x2,y1,y2,l10)+Fy(x3,x1,y3,y1,l30);
		fx2 = Fx(x2,x1,y2,y1,l10)+Fx(x3,x2,y3,y2,l20);
		fy2 = Fy(x2,x1,y2,y1,l10)+Fy(x3,x2,y3,y2,l20);
		fx3 = Fx(x1,x3,y1,y3,l30)+Fx(x2,x3,y2,y3,l20);
		fy3 = Fy(x1,x3,y1,y3,l30)+Fy(x2,x3,y2,y3,l20);

	}





return;
}

で、出るコンパイルエラーが

pbl-A.c:4: error: expected declaration specifiers or ‘...’ before ‘y1’
pbl-A.c:4: error: expected declaration specifiers or ‘...’ before ‘y2’
pbl-A.c:4: error: expected declaration specifiers or ‘...’ before ‘l’
pbl-A.c: In function ‘Fx’:
pbl-A.c:7: error: ‘x2’ undeclared (first use in this function)
pbl-A.c:7: error: (Each undeclared identifier is reported only once
pbl-A.c:7: error: for each function it appears in.)
pbl-A.c:7: error: ‘y2’ undeclared (first use in this function)
pbl-A.c:9: error: ‘l’ undeclared (first use in this function)
pbl-A.c: At top level:
pbl-A.c:15: error: expected declaration specifiers or ‘...’ before ‘y1’
pbl-A.c:15: error: expected declaration specifiers or ‘...’ before ‘x2’
pbl-A.c:15: error: expected declaration specifiers or ‘...’ before ‘y2’
pbl-A.c:15: error: expected declaration specifiers or ‘...’ before ‘l’
pbl-A.c: In function ‘Fy’:
pbl-A.c:18: error: ‘x2’ undeclared (first use in this function)
pbl-A.c:18: error: ‘y2’ undeclared (first use in this function)
pbl-A.c:20: error: ‘l’ undeclared (first use in this function)
pbl-A.c: In function ‘main’:
pbl-A.c:38: error: ‘x1’ undeclared (first use in this function)
pbl-A.c:39: error: lvalue required as left operand of assignment
pbl-A.c:40: error: ‘x2’ undeclared (first use in this function)
pbl-A.c:41: error: ‘y2’ undeclared (first use in this function)
pbl-A.c:42: error: ‘x3’ undeclared (first use in this function)
pbl-A.c:43: error: ‘y3’ undeclared (first use in this function)
pbl-A.c:52: error: too many arguments to function ‘Fx’
pbl-A.c:52: error: too many arguments to function ‘Fx’
pbl-A.c:53: error: too many arguments to function ‘Fy’
pbl-A.c:53: error: too many arguments to function ‘Fy’
pbl-A.c:54: error: too many arguments to function ‘Fx’
pbl-A.c:54: error: too many arguments to function ‘Fx’
pbl-A.c:55: error: too many arguments to function ‘Fy’
pbl-A.c:55: error: too many arguments to function ‘Fy’
pbl-A.c:56: error: too many arguments to function ‘Fx’
pbl-A.c:56: error: too many arguments to function ‘Fx’
pbl-A.c:57: error: too many arguments to function ‘Fy’
pbl-A.c:57: error: too many arguments to function ‘Fy’
pbl-A.c:73: error: invalid operands to binary + (have ‘double (*)(double)’ and ‘ double’)
pbl-A.c:81: error: too many arguments to function ‘Fx’
pbl-A.c:81: error: too many arguments to function ‘Fx’
pbl-A.c:82: error: too many arguments to function ‘Fy’
pbl-A.c:82: error: too many arguments to function ‘Fy’
pbl-A.c:83: error: too many arguments to function ‘Fx’
pbl-A.c:83: error: too many arguments to function ‘Fx’
pbl-A.c:84: error: too many arguments to function ‘Fy’
pbl-A.c:84: error: too many arguments to function ‘Fy’
pbl-A.c:85: error: too many arguments to function ‘Fx’
pbl-A.c:85: error: too many arguments to function ‘Fx’
pbl-A.c:86: error: too many arguments to function ‘Fy’
pbl-A.c:86: error: too many arguments to function ‘Fy’


本当に困っています
よろしくお願いします

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月18日(水) 17:11
by softya
間違いを修正しました。
修正点は以下の通り
1.引数にdouble x1,x2と言う書き方は出来ません。double x1,double x2と書き換えました。
2.C言語はべき乗の演算子がありませんので、POW関数に置き換えました。
3.double x1,x2,x3,y1,y2,y3;の定義忘れを追加。
4.reutrnの戻り値が抜けていたので追加。
オイラーは記憶の彼方なので、ご自分で結果は検証してみてください。
#include<stdio.h>
#include<math.h>

int Fx(double x1,double x2,double y1,double y2,double l){
	double l0,Dl,fx;	

	l0 = sqrt(pow((x2-x1),2)+pow((y2-y1),2));
	Dl = l0 - l;//変位
	fx = (-Dl*(x1-x2)/l0);
	return(fx);
}

int Fy(double x1,double y1,double x2,double y2,double l){
	double l0,Dl,fy;	

	l0 = sqrt(pow((x2-x1),2)+pow((y2-y1),2));
	Dl = l0 - l;//変位
	fy = (-Dl*(y1-y2)/l0);
	return(fy);
}

int main(void){
	double l10,l20,l30,fx1,fx2,fx3,fy1,fy2,fy3;	

	l10 = 10.0;
	l20 = 11.18033989; 
	l30 = 11.18033989;

	double x1,x2,x3,y1,y2,y3;	
	double Dt,t,vx1,vy1,vx2,vy2,vx3,vy3;

	Dt = 0.0001;

	int i;

	x1 = 0.01;
	y1 = 0.00;
	x2 = 0.00;
	y2 = 10.00;
	x3 = 10.00;
	y3 = 5.00;

	vx1 = 0.0;
	vy1 = 0.0;
	vx2 = 0.0;
	vy2 = 0.0;
	vx3 = 0.0;
	vy3 = 0.0;

	fx1 = Fx(x1,x2,y1,y2,l10)+Fx(x3,x1,y3,y1,l30);
	fy1 = Fy(x1,x2,y1,y2,l10)+Fy(x3,x1,y3,y1,l30);
	fx2 = Fx(x2,x1,y2,y1,l10)+Fx(x3,x2,y3,y2,l20);
	fy2 = Fy(x2,x1,y2,y1,l10)+Fy(x3,x2,y3,y2,l20);
	fx3 = Fx(x1,x3,y1,y3,l30)+Fx(x2,x3,y2,y3,l20);
	fy3 = Fy(x1,x3,y1,y3,l30)+Fy(x2,x3,y2,y3,l20);

	for(i=0;i<100;i++){

		vx1 = vx1+fx1*Dt;
		vy1 = vy1+fy1*Dt;
		vx2 = vx2+fx2*Dt;
		vy2 = vy2+fy2*Dt;
		vx3 = vx3+fx3*Dt;
		vy3 = vx3+fy3*Dt;

		x1 = x1+vx1*Dt;
		y1 = y1+vy1*Dt;
		x2 = x2+vx2*Dt;
		y2 = y2+vy2*Dt;
		x3 = x3+vx3*Dt;
		y3 = x3+vy3*Dt;

		printf("x1=%lf y1=%lf x2=%lf y2=%lf x3=%lf y3=%lf \n",x1,y1,x2,y2,x3,y3);

		fx1 = Fx(x1,x2,y1,y2,l10)+Fx(x3,x1,y3,y1,l30);
		fy1 = Fy(x1,x2,y1,y2,l10)+Fy(x3,x1,y3,y1,l30);
		fx2 = Fx(x2,x1,y2,y1,l10)+Fx(x3,x2,y3,y2,l20);
		fy2 = Fy(x2,x1,y2,y1,l10)+Fy(x3,x2,y3,y2,l20);
		fx3 = Fx(x1,x3,y1,y3,l30)+Fx(x2,x3,y2,y3,l20);
		fy3 = Fy(x1,x3,y1,y3,l30)+Fy(x2,x3,y2,y3,l20);
	}
	return 0;
}

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月18日(水) 18:30
by kuroka
ありがとうございます
無事コンパイルできました

しかし、オイラーかなにかの数式がどうも違うようでした
ばね運動なので本来なら増加と減衰をくりかえすはずなんですが
たとえばx1は減衰しっぱなしになってしまいます

どなたか、わかる方は
ご指導などをよろしくお願いします

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月18日(水) 18:57
by softya
まず自分で出来ることしましょう。
もう一度、オイラーについて調べて正しいバネの動きを机上で計算できる知識を得てください。
ここをちゃんとしてないとプログラムを貰ってもプログラムが合っている事が確認できません。
それに、考え方や式をちゃんと書いてもらえばプログラム化を手伝ってくれる人も現れやすくなります。
(しかし、バネ運動の式はすっかり忘れてます。時間が無いので0から勉強しなおすのは勘弁!)

Re:オイラー、フーリェに関する問題です

Posted: 2009年11月19日(木) 21:54
by kuroka
アドバイスありがとうございます
自分の考えがまとまり、かつそれを記述しないと
確かに失礼ですよね、申し訳ありませんでした

とりあえず、これを改良することに全力を尽くそうと思います
助言をしてくださった方、ありがとうございました
C言語の習得をがんばっていきます!