1 / 12

原子動力工学特論 課題 2

原子動力工学特論 課題 2. 交通電子機械工学専攻 2003310 齋藤 泰治. 目次 ・ガウスの消去法 ・プログラム ・実行結果 ・水平投射 ・ VisualC++6.0 のプログラム開発環境 ・プログラム ・プログラムの実行. ガウスの消去法 連立一次方程式の係数と、定数項から作られる行列(拡大係数行列)に対して、 1、行の順番を並べ替える 2、ひとつの行にある数をかけて、他の行に加える 3、ひとつの行に 0 でない数をかける という操作(基本変形)を施し、繰り返してゆくことで、 0 成分の多い簡単な行列としてゆく方法。.

Download Presentation

原子動力工学特論 課題 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 原子動力工学特論 課題2 交通電子機械工学専攻 2003310 齋藤 泰治

  2. 目次 ・ガウスの消去法 ・プログラム ・実行結果 ・水平投射 ・VisualC++6.0のプログラム開発環境 ・プログラム ・プログラムの実行

  3. ガウスの消去法 連立一次方程式の係数と、定数項から作られる行列(拡大係数行列)に対して、 1、行の順番を並べ替える 2、ひとつの行にある数をかけて、他の行に加える 3、ひとつの行に0でない数をかける という操作(基本変形)を施し、繰り返してゆくことで、 0成分の多い簡単な行列としてゆく方法。

  4. ある行(1行目)を変形するときに、プログラムでは適当な数を選択することはできないので、単純に1列目の数で割る。ある行(1行目)を変形するときに、プログラムでは適当な数を選択することはできないので、単純に1列目の数で割る。 すると、1列目の数は、1となるので、他の行(2行目)の1列目の数倍してその行(2行目)から引けば、その行の1列目は確実に0となる。 1行目割る 2行目ー1行目

  5. 課題2 次の連立1次方程式を解く 拡大係数行列

  6. プログラム 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; }

  7. 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]); } }

  8. 実行結果 式の数を入力 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

  9. 課題1 水平投射       高さ2mから水平方向に2m/sで投げ出し、地面と       反発係数0.9で跳ね返るときの、ボールの軌道を描く

  10. 水平投射において、 x方向の位置は y方向の位置は y=0ではねかえり、速度が逆向きとなって、0.9倍となる。 このとき時間tが のときに跳ね返るとする。

  11. VisualC++6.0の開発環境 VisualC++6.0では、アプリケーションの制作を簡略化するために、骨組みとなるフレームがすでに用意されている。 今回は、ダイアログベースによる開発環境を利用した。 ダイアログベースでは設定したダイアログ内に、ボタンやエディットを配置しすると、それらが自動的に関数として加えられるので、それらの処理を記述するだけでよい。 VisualC++では、クラスや関数の定義に独自の記述法を持っているので、それに即した記述をする。 例;  MoveTo(x,y) //(x,y)点まで移動 LineTo(x,y) //(x,y)点まで直線を引く

  12. プログラム 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); } } }

More Related