- 締切済み
JavaScriptについての質問です。
ガウスの消去法による解の求め方をプログラムしたいのですが、上手くいかなかったので質問しました。以下のプログラムから実行はできるのですが、解が求められていませんでした。 どこを変えればきちんとできるのでしょうか、回答お願いします。 var A=[[1,-1,1],[1,2,0],[2,0,3]],b=[5,1,9]; WScript.Echo("ガウスの消去法の解:\n"+Gauss(A,b)); function Gauss(A,b) { var s,x=new Array(A.length),M=new Array(A.length); for(var i=k+1;i<A.length-1;k++) { for(var i=k+1;i<A.length;i++) { M[i]=new Array(A.length); M[i][k]=(A[i][k])/(A[k][k]); for(var j=k+1;j<A.length ;j++) A[i][j]=A[i][j]-(M[i][k]*A[k][j]); b[i]=b[i]-(M[i][k]*b[k]); } } for(var i=A.lengh-1;i>=0;i--) { s=0; for(var k=i+1;k<A.length;k++) s+=A[i][k]*x[k]; x[i]=(1/A[i][i])*(b[i]-s); } return x; }
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
> 「htm」ファイルにコピペして下さい。 拡張子が「htm」、「html」のファイルの事です。 例えば「Gauss.htm」など。
- amanojaku1
- ベストアンサー率54% (265/488)
> for( t = MA.length-1; 0<=t; t--){ 無駄がありました、下記のように変更して下さい。 for( t = MA.length-1; 1<=t; t--){
- amanojaku1
- ベストアンサー率54% (265/488)
> (ガウスの消去法にしろ、ガウス・ジョルダン法にしろ)向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロの場合は計算不能 向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロにならないように行を交換する手法があるようです。
- amanojaku1
- ベストアンサー率54% (265/488)
> GJ = GaussJordan(MA,MB); > document.write('GaussJordan(MA,MB);<br>'); > function GaussJordan(MA,MB){ 「GaussJordan」を「Gauss」に変更して下さい。
- amanojaku1
- ベストアンサー率54% (265/488)
これはガウス(Gauss)の消去法です(^_^;こちらの方が簡単でしたね) (ガウスの消去法にしろ、ガウス・ジョルダン法にしろ)向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロの場合は計算不能となり、ゼロでないにしても非常に小さい値の場合、誤差が大きくなってしまうと言う問題があるようです。 「htm」ファイルにコピペして下さい。 <html> <head> <meta http-equiv="Content-Type" content="Text/HTML; charset=Shift_JIS"> <title>test</title> </head> <body bgcolor="#8f9fff" text="#000000" link="#2f2fff" vlink="#d700d7" alink="#00ffff" > <script type="text/javascript"> <!-- var MA=[[1,-1,1],[1,2,0],[2,0,3]]; var MB=[5,1,9]; GJ = GaussJordan(MA,MB); document.write('GaussJordan(MA,MB);<br>'); document.write( '★(10):'+ ''); document.write('<br>'); for( i = 0; i<GJ.length; i++){ document.write( 'GJ['+i+']='+GJ[i]+'; '+ ''); } document.write('<br>'); function GaussJordan(MA,MB){ var i,j,t,tg; document.write( '★(2):'+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); for( t = 0; t<MA.length; t++){ for( i = t; i<MA.length; i++){ tg = MA[i][t]; MB[i] = MB[i]/tg; document.write( '★(3):'+ 't='+t+'; '+ 'tg='+tg+'; '+ ''); document.write('<br>'); for( j = 0; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]/tg; document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } for( i = t+1; i<MA.length; i++){ MB[i] = MB[i]-MB[t]; for( j = t; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]-MA[t][j]; } } document.write( '★(6):'+ 't='+t+'; '+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); } for( t = MA.length-1; 0<=t; t--){ for( i = t-1; 0<=i; i--){ MB[i] = MB[i]-MA[i][t]*MB[t]; MA[i][t] = 0; } document.write( '★(8):'+ 't='+t+'; '+ ''); document.write('<br>'); for( i = MA.length-1; 0<=i; i--){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); } document.write( '★(9):'+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); return MB; } --> </script> <br> </body> </html>
- amanojaku1
- ベストアンサー率54% (265/488)
> function GaussJordan(MA,MB){ の次に下記を追加して下さい。 var i,j,t,tg;
- amanojaku1
- ベストアンサー率54% (265/488)
これはガウス・ジョルダン(Gauss-Jordan)法です。 (ガウスの消去法にしろ、ガウス・ジョルダン法にしろ)向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロの場合は計算不能となり、ゼロでないにしても非常に小さい値の場合、誤差が大きくなってしまうと言う問題があるようです。 「htm」ファイルにコピペして下さい。 <html> <head> <meta http-equiv="Content-Type" content="Text/HTML; charset=Shift_JIS"> <title>test</title> </head> <body bgcolor="#8f9fff" text="#000000" link="#2f2fff" vlink="#d700d7" alink="#00ffff" > <script type="text/javascript"> <!-- var MA=[[1,-1,1],[1,2,0],[2,0,3]]; var MB=[5,1,9]; GJ = GaussJordan(MA,MB); document.write('GaussJordan(MA,MB);<br>'); document.write( '★(10):'+ ''); document.write('<br>'); for( i = 0; i<GJ.length; i++){ document.write( 'GJ['+i+']='+GJ[i]+'; '+ ''); } document.write('<br>'); function GaussJordan(MA,MB){ document.write( '★(2):'+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); for( t = 0; t<MA.length; t++){ for( i = t; i<MA.length; i++){ tg = MA[i][t]; MB[i] = MB[i]/tg; document.write( '★(3):'+ 't='+t+'; '+ 'tg='+tg+'; '+ ''); document.write('<br>'); for( j = 0; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]/tg; document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } for( i = t+1; i<MA.length; i++){ MB[i] = MB[i]-MB[t]; for( j = t; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]-MA[t][j]; } } document.write( '★(6):'+ 't='+t+'; '+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); } for( t = MA.length-1; 0<=t; t--){ for( i = t; 0<=i; i--){ tg = MA[i][t]; MB[i] = MB[i]/tg; document.write( '★(7):'+ 't='+t+'; '+ 'tg='+tg+'; '+ ''); document.write('<br>'); for( j = 0; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]/tg; document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } for( i = t-1; 0<=i; i--){ MB[i] = MB[i]-MB[t]; for( j = t; j<MA[i].length; j++ ){ MA[i][j] = MA[i][j]-MA[t][j]; } } document.write( '★(8):'+ 't='+t+'; '+ ''); document.write('<br>'); for( i = MA.length-1; 0<=i; i--){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); } document.write( '★(9):'+ ''); document.write('<br>'); for( i = 0; i<MA.length; i++){ for( j = 0; j<MA[i].length; j++){ document.write( 'MA['+i+']['+j+']='+MA[i][j]+'; '+ ''); } document.write( 'MB['+i+']='+MB[i]+'; '+ ''); document.write('<br>'); } document.write('<br>'); return MB; } --> </script> <br> </body> </html>