2013-06-27 249 views
2

我必須在這裏丟失一些非常簡單的東西。我有一些創建簡單線性系統的JS代碼(我試圖創建兩條傾斜線之間的最短線)。我已經到了Ax = b的地步,需要爲x解決問題。 A是一個3×2的矩陣中,b爲3×1用numeric.js求解線性方程

我有:

function build_equation_system(v1, v2, b) { 
    var a = [ [v1.x, v2.x], [v1.y, v2.y], [v1.z, v2.z] ]; 
    var b = [ [b.x], [b.y], [b.z]]; 
    return numeric.solve(a,b) 
} 

數值返回NaN的一種1×3矩陣,即使當有一個解決方案。

回答

2

使用數字,你可以做到以下幾點:

創建它計算你的矩陣的僞逆函數:

function pinv(A) { 
    return numeric.dot(numeric.inv(numeric.dot(numeric.transpose(A),A)),numeric.transpose(A)); 
} 

使用該功能,解決您的線性最小二乘方程得到的係數。

var p = numeric.dot(pinv(a),b); 

我想你使用numeric.solve的初始方法,無法得到它的工作,要麼讓我很想知道是什麼問題。

一個簡單的測試......

var x = new Array(10); 
var y = new Array(10); 
for (var i = 0; i < 10; ++i) { 
    x[i] = i; 
    y[i] = i; 
} 
// Solve for the first order equation representing this data 
var n = 1; 
// Construct Vandermonde matrix. 
var A = numeric.rep([x.length, n + 1], 1); 
for (var i = 0; i < x.length; ++i) { 
    for (var j = n-1; j >= 0; --j) { 
     A[i][j] = x[i] * A[i][j+1]; 
    } 
} 

// Solves the system Ap = y 
var p = numeric.dot(pinv(A),y); 

P = [1,2.55351295663786e-15]我用這個方法來重建MATLAB對JavaScript中使用polyfit

+0

也許numericjs只是解決Ax = b系統,其中A是方形的... –