2013-06-27 251 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是方形的... –