• 締切済み

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; }

みんなの回答

回答No.7

> 「htm」ファイルにコピペして下さい。 拡張子が「htm」、「html」のファイルの事です。 例えば「Gauss.htm」など。

回答No.6

> for( t = MA.length-1; 0<=t; t--){ 無駄がありました、下記のように変更して下さい。 for( t = MA.length-1; 1<=t; t--){

回答No.5

> (ガウスの消去法にしろ、ガウス・ジョルダン法にしろ)向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロの場合は計算不能 向かって左から袈裟懸けになる行列の対角成分:1にしたい対角要素がゼロにならないように行を交換する手法があるようです。

回答No.4

> GJ = GaussJordan(MA,MB); > document.write('GaussJordan(MA,MB);<br>'); > function GaussJordan(MA,MB){ 「GaussJordan」を「Gauss」に変更して下さい。

回答No.3

これはガウス(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>

回答No.2

> function GaussJordan(MA,MB){ の次に下記を追加して下さい。 var i,j,t,tg;

回答No.1

これはガウス・ジョルダン(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>

関連するQ&A

専門家に質問してみよう