原子動力工学特論 課題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); } } }
© Copyright 2024 ExpyDoc