2013-06-27 9 views
2

Мне, должно быть, здесь не хватает чего-то очень простого. У меня есть JS-код, который создает простые линейные системы (я пытаюсь создать кратчайшую линию между двумя линиями перекоса). Я дошел до того, что у меня есть Ax = b, и вам нужно решить x. А представляет собой матрицу 3 х 2, Ь 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) 
} 

Числовой возвращает матрицу 1 х 3 из NaNs, даже когда есть решение.

ответ

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); 

р = [1, 2.55351295663786e-15]

Я использовал этот метод, чтобы воссоздать polyfit MATLAB для использования в Javascript.

+0

возможно, numericjs просто решает системы Ax = b, где A является квадратным ... –