見出し画像

max msp gen~で連立方程式を解く


ガウスジョルダン法を用いてmax/msp gen~で連立方程式を解きます。


以下のように係数を入力すると解をオーディオで出力してくれます。
2x-4y+6z=6
-x+7y+8z=-3
x+y-2z=2
の三元連立方程式を解いて
x=2.1724…
y=-0.1379…
z=0.01724…
と出力しています。

以下が連立方程式の解を求めるサイトで計算した結果です。
ほぼ同じような解になっています。

以下がgen~の中身です。ここではピボット選択無しのバージョンでガウスジョルダン法を書いています。

以下がgen~の中身です。コピペすると使えます。

Data a(5,5);

poke(a,in1,0,0);poke(a,in2,0,1); poke(a,in3,0,2);  poke(a,in4,0,3);
poke(a,in5,1,0);poke(a,in6,1,1); poke(a,in7,1,2);  poke(a,in8,1,3);
poke(a,in9,2,0);poke(a,in10,2,1);poke(a,in11,2,2);poke(a,in12,2,3);

n=3;q=0;i=0;g=0;j=0;k=0;

for(i=0;i<n;i+=1){
 q=peek(a,i,i);
 for(j=0;j<n+1;j+=1){
   poke(a,(peek(a,i,j)/q),i,j);
 }
 for(k=0;k<n;k+=1){
   g=peek(a,k,i);
   if(k != i){
    for(j=0;j<n+1;j+=1){
      poke(a,peek(a,k,j)-g*peek(a,i,j),k,j);
    }
   }
 } 
}


out1=peek(a,0,0);out2=peek(a,0,1);out3=peek(a,0,2);out4=peek(a,0,3);
out5=peek(a,1,0);out6=peek(a,1,1);out7=peek(a,1,2);out8=peek(a,1,3);
out9=peek(a,2,0);out10=peek(a,2,1);out11=peek(a,2,2);out12=peek(a,2,3);  


以下がガウスジョルダン法 ピボット選択有り 解の判別有り版です

以下がgen~

以下がgen~の中身です。

Data a(5,5);

poke(a,in1,0,0);poke(a,in2,0,1); poke(a,in3,0,2);  poke(a,in4,0,3);
poke(a,in5,1,0);poke(a,in6,1,1); poke(a,in7,1,2);  poke(a,in8,1,3);
poke(a,in9,2,0);poke(a,in10,2,1);poke(a,in11,2,2);poke(a,in12,2,3);

n=3;  //dimension 
m=1; 
epsl=0.00000001;isw=0; i=0;j=0;
nplsm=n+m; nn=0; ip=0; p=0; w=0;
for(nn=0;nn<n;nn+=1){
 p=0;
 for(i=nn;i<n;i+=1){
   if(p<abs(peek(a,i,nn))){
     p= peek(a,i,nn) ;
     p=abs(p);
     ip=i;
   }
 }
 if(p<=epsl){
     isw=1;
 }
 for(j=nn;j<=nplsm;j+=1){
   w=peek(a,nn,j);
   poke(a,peek(a,ip,j),nn,j);
   poke(a,w,ip,j);
 }
 for(j=nn+1;j<nplsm;j+=1){
    poke(a, peek(a,nn,j)/peek(a,nn,nn),nn,j);
 }
 for(i=0;i<n;i+=1 ){
   if(i != nn){
     for(j=nn+1;j<nplsm;j+=1){
       poke(a,peek(a,i,j)-peek(a,i,nn)*peek(a,nn,j),i,j);
     }
   }
 }
}

//out1=peek(a,0,0);out2=peek(a,0,1);out3=peek(a,0,2);out4=peek(a,0,3);
//out5=peek(a,1,0);out6=peek(a,1,1);out7=peek(a,1,2);out8=peek(a,1,3);
//out9=peek(a,2,0);out10=peek(a,2,1);out11=peek(a,2,2);out12=peek(a,2,3);

out1=peek(a,0,3);out2=peek(a,1,3);out3=peek(a,2,3);
out4=isw;







よろしければサポートお願いします!