原子動力工学特論 課題2 交通電子機械工学専攻 2003310 齋藤 泰治
目次 ・ガウスの消去法 ・プログラム ・実行結果 ・水平投射 ・VisualC++6.0のプログラム開発環境 ・プログラムの実行
ガウスの消去法 連立一次方程式の係数と、定数項から作られる行列(拡大係数行列)に対して、 1、行の順番を並べ替える 2、ひとつの行にある数をかけて、他の行に加える 3、ひとつの行に0でない数をかける という操作(基本変形)を施し、繰り返してゆくことで、 0成分の多い簡単な行列としてゆく方法。
ある行(1行目)を変形するときに、プログラムでは適当な数を選択することはできないので、単純に1列目の数で割る。 すると、1列目の数は、1となるので、他の行(2行目)の1列目の数倍してその行(2行目)から引けば、その行の1列目は確実に0となる。 1行目割る 2行目ー1行目
課題2 次の連立1次方程式を解く 拡大係数行列
プログラム int i,j,k,n; float a[nn][nn]; //係数の行列を作る float b[nn]; //右辺の定数項 main() { int i,j,k,n; float a[nn][nn]; //係数の行列を作る float b[nn]; //右辺の定数項 float x[nn]; //解を入れる行列 float p,q,s,data; printf("式の数を入力 n="); scanf("%d",&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(j=k+1;j<=n;++j){ a[k][j]/=p; } b[k]/=p; for(i=k+1;i<=n;++i){ 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]; 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; 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 Answer x(1)= 3.000000 x(2)= 2.000000 x(3)= 1.000000
課題1 水平投射 高さ2mから水平方向に2m/sで投げ出し、地面と 反発係数0.9で跳ね返るときの、ボールの軌道を描く
水平投射において、 x方向の位置は y方向の位置は y=0ではねかえり、速度が逆向きとなって、0.9倍となる。 このとき時間tが のときに跳ね返るとする。
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);