我必须在这里找到一些非常简单的东西。我有一些JS代码可以创建简单的线性系统(我试图创建两条偏斜线之间的最短线)。我已经到了Ax = b的地步,需要求解x。 A是3 x 2矩阵,b是3 x 1。
我有:
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)
}
Numeric返回一个1 x 3的NaN矩阵,即使有解决方案。
答案 0 :(得分:2)
使用数字可以执行以下操作:
创建一个计算A矩阵的伪逆的函数:
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的polyfit以供Javascript使用。