Gaussの消去法

by uwi
♥2 | Line 76 | Modified 2009-10-07 04:51:35 | MIT License
play

ActionScript3 source code

/**
 * Copyright uwi ( http://wonderfl.net/user/uwi )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/bY3c
 */

package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.utils.getTimer;
    public class Test extends Sprite {
        private var _tf : TextField;
  
        public function Test() {
            _tf = new TextField();
            _tf.width = 465;
            _tf.height = 465;
            addChild(_tf);
            
            var s : int = getTimer();
            
            tr(gaussEliminate([
                3, -1, 1,
                3, 6, 2,
                3, 3, 7
                ], [
                1, 0, 4
                ]).join('\n'));
            
            var g : int = getTimer();
            tr((g - s) + " ms");
        }
        
        private function gaussEliminate(a : Array, b : Array) : Array
        {
            var n : int = b.length;
            if(n == 0 || a.length != n * n)return null;
            
            var i : int, j : int, k : int;
            for(i = 0;i < n;i++){
                var pmin : Number = Number.MAX_VALUE;
                var p : int = -1;
                for(j = i;j < n;j++){
                    var aji : Number = a[j * n + i];
                    if(aji != 0.0 && Math.abs(aji) < pmin){
                        pmin = aji;
                        p = j;
                    }
                }
                if(p == -1)return null;
                
                if(p != i){
                    var d : Number;
                    for(j = 0;j < n;j++){
                        d = a[i * n + j];
                        a[i * n + j] = a[p * n + j];
                        a[p * n + j] = d;
                    }
                    d = b[i];
                    b[i] = b[p];
                    b[p] = d;
                }
                
                for(j = i + 1;j < n;j++){
                    var m : Number = a[j * n + i] / a[i * n + i];
                    a[j * n + i] = 0;
                    for(k = i + 1;k < n;k++){
                        a[j * n + k] -= a[i * n + k] * m;
                    }
                    b[j] -= b[i] * m;
                }
            }
                
            if(a[n * n - 1] == 0.0)return null;
            var x : Array = new Array(n);
            x[n - 1] = b[n - 1] / a[n * n - 1];
            for(i = n - 2;i >= 0;i--){
                x[i] = b[i];
                for(j = i + 1;j < n;j++){
                    x[i] -= a[i * n + j] * x[j];
                }
                x[i] /= a[i * n + i];
            }
            return x;
        }

        private function tr(...o : Array) : void
        {
            _tf.appendText(o + "\n");
        }
    }
}