PowerPoint プレゼンテーション

原子動力工学特論
課題2
交通電子機械工学専攻
2003310 齋藤 泰治
目次
・ガウスの消去法
・プログラム
・実行結果
・水平投射
・VisualC++6.0のプログラム開発環境
・プログラム
・プログラムの実行
ガウスの消去法
連立一次方程式の係数と、定数項から作られる行列(拡大係数
行列)に対して、
1、行の順番を並べ替える
2、ひとつの行にある数をかけて、他の行に加える
3、ひとつの行に0でない数をかける
という操作(基本変形)を施し、繰り返してゆくことで、
0成分の多い簡単な行列としてゆく方法。
ある行(1行目)を変形するときに、プログラムでは適当な数を選
択することはできないので、単純に1列目の数で割る。
すると、1列目の数は、1となるので、他の行(2行目)の1列目の
数倍してその行(2行目)から引けば、その行の1列目は確実に0
となる。
 a11 a12 a13 


 a21 a22 a23 
a a a 
32
33 
 31
1 a12 / a11 a13 / a11 


 a21 a22 a23 
 a a a 
32
33 
 31
1行目割る
1 a12 / a11 a13 / a11 


 0 a22  a21a12 / a11 a23  a21a13 / a11 
 a a a

32
33
 31

2行目ー1行目 a21
a11
課題2 次の連立1次方程式を解く
3a  2b  c  12

5a  3b  2c  11
 2a  5b  3c  7

3 4  1 12 
 

5  3 2 11
   2 5 3 7 


拡大係数行列
プログラム
main()
{
int i,j,k,n;
float a[nn][nn]; //係数の行列を作る
float b[nn]; //右辺の定数項
float x[nn]; //解を入れる行列
float p,q,s,data;
printf("式の数を入力
scanf("%d",&n);
n=");
for(i=1;i<=n;++i){
//行列式の入力
for(j=1;j<=n;++j){
printf("a(%d,%d)=",i,j);
scanf("%f",&data);
a[i][j]=data;
}
printf("b(%d)=",i);
scanf( "%f", &data);
b[i]=data;
}
for(k=1;k<n;++k){
//消去法の計算
p=a[k][k];
for(j=k+1;j<=n;++j){
a[k][j]/=p;
}
b[k]/=p;
for(i=k+1;i<=n;++i){
q=a[i][k];
for(j=k+1;j<=n;++j){
a[i][j]-=q*a[k][j];
}
b[i]-=q*b[k];
}
}
x[n]=b[n]/a[n][n];
for(k=n-1;k>=1;--k){
s=0.0;
for(j=k+1;j<=n;++j){
s+=a[k][j]*x[j];
}
x[k]=b[k]-s;
}
printf("\n Answer\n");
for(i=1;i<=n;++i){
printf("x(%d)= %f\n",i,x[i]);
}
}
実行結果
式の数を入力 n=3
a(1,1)=3
a(1,2)=2
a(1,3)=-1
b(1)=12
a(2,1)=5
a(2,2)=-3
a(2,3)=2
b(2)=11
a(3,1)=-2
a(3,2)=5
a(3,3)=3
b(3)=7
Answer
x(1)=
3.000000
x(2)=
2.000000
x(3)=
1.000000
課題1 水平投射
高さ2mから水平方向に2m/sで投げ出し、地面と
反発係数0.9で跳ね返るときの、ボールの軌道を描く
水平投射において、
x方向の位置は
y方向の位置は
x  u0 t
y   1 gt 2  v0t  h
2
y=0ではねかえり、速度が逆向きとなって、0.9倍となる。
このとき時間tが
v0  v  2 gh
t
g
2
0
のときに跳ね返るとする。
VisualC++6.0の開発環境
VisualC++6.0では、アプリケーションの制作を簡略化する
ために、骨組みとなるフレームがすでに用意されている。
今回は、ダイアログベースによる開発環境を利用した。
ダイアログベースでは設定したダイアログ内に、ボタンやエ
ディットを配置しすると、それらが自動的に関数として加えら
れるので、それらの処理を記述するだけでよい。
VisualC++では、クラスや関数の定義に独自の記述法を
持っているので、それに即した記述をする。
例;
MoveTo(x,y)
// (x,y)点まで移動
LineTo(x,y)
// (x,y)点まで直線を引く
プログラム
for(i=0;i<=10;i+=1){
for(t=0;t<=30;t+=0.01){
x=u0*t+x0;
y=-1.0/2*g*t*t+v0*t+h;
X=x*50-245;
Y=-100*y+yw;
v=-g*t+v0;
if((v0+pow((v0*v0+2*g*h),(1.0/2)))/g-t<=0.001){
h=0;
x0=x;
v0=v*(-e);
break;
}
if(x>=xw-5){ break;}
dc.LineTo((int)(50*x-245),(int)(-100*y+yw));
dc.Ellipse(50*x-245-3,-100*y+yw-3,50*x-245+3,-100*y+yw+3);
for(k=0;k<=100000;k+=1){
z=sin(k);
}
}
}