Javascript эквивалентные функции для Matlab Функции: Polyfit / Polyval? - PullRequest
4 голосов
/ 26 июля 2011

Очень нужен Javascript, эквивалентный функциям polyval и polyfit, которые существуют в Matlab. По сути, эти функции в Matlab выполняют подбор кривой на основе двух массивов одинакового размера в зависимости от заданного полинома. Мне нужно сделать некоторые вычисления, которые включают подгонку кривой в javascript и не могут за всю жизнь найти эквивалентную функцию.

Это объяснение MatLab функции polyfit

"P = POLYFIT (X, Y, N) находит коэффициенты полинома P (X) степень N, которая лучше всего соответствует данным Y в смысле наименьших квадратов. P это вектор строки длины N + 1, содержащий полиномиальные коэффициенты в нисходящие способности, P (1) * X ^ N + P (2) * X ^ (N-1) + ... + P (N) * X + P (N + 1). "

Это объяснение MatLab для polyval.

"ПОЛИВАЛ" Оценить полином. Y = POLYVAL (P, X) возвращает значение многочлена P, оцененного в X. P вектор длины N + 1, элементами которого являются коэффициенты полином по убыванию.

    Y = P(1)*X^N + P(2)*X^(N-1) + ... + P(N)*X + P(N+1)"

Любая помощь будет супер.

С уважением,

Ответы [ 3 ]

2 голосов
/ 25 февраля 2012

numericjs может помочь вам начать работу.

2 голосов
/ 26 июля 2011

POLYFIT выполняет наименьших квадратов полиномиальной подгонки , что сводится к решению системы линейных уравнений .Я сделал быстрый поиск, но не смог найти базовую библиотеку Javascript для линейной алгебры, которая бы решала такие системы ... Самым простым способом было бы реализовать алгоритм Gaussian elission самостоятельно.

POLYVAL просто вычисляет многочлен в точках X, подставляя коэффициенты в уравнение.

0 голосов
/ 17 января 2016

возможно, этот код может кому-то помочь

function _prepare(_mat) {
_mat=[[]].concat(_mat)
for(i=0;i<_mat.length;++i)
    _mat[i]=[0].concat(_mat[i])
return _mat
}

function linear(_mat){
_mat=_prepare(_mat)
return _solve(_mat)
}


function _solve(_mat){
var c=new Array(),d=new Array()
var n=_mat.length-1

for(i=0;i<=n+1;i++) {
    d[i]=new Array();
    c[i]=0
    for(j=0;j<=n+1;++j)
        d[i][j]=0
}

// mission impossible
// calculate all the determinants of the system
for(m=2; m<=n ; ++m) {
    for(i=m;i<=n;++i)
        for(j = m-1;j<=n+1;++j)
            d[i][j] = [_mat[i][j] * _mat[m-1][m-1] , _mat[i][m-1]]
        for(i=m;i<=n;++i)
            for(j=m-1;j<=n+1;++j) {
                _mat[i][j] = d[i][j][0]-d[i][j][1]*_mat[m-1][j] 
                if(Math.abs(_mat[i][j])<1e-25) _mat[i][j]=0  // i have to add this line
            }
}
// now the coefficients of equation (not exactly)

for(i=n;i>=1;--i) {
    c[i-1] = _mat[i][n+1]
    if (i!=n)
    for(j=n; j>=i+1;--j)
        c[i-1] = c[i-1] -_mat[i][j] * c[j-1]
    if(_mat[i][i]!=0)
        c[i-1]=c[i-1] / _mat[i][i]
    else
        c[i-1]=0
    if(Math.abs(c[i-1])<1e-25)
        c[i-1]=0
}
c.length=n
return c
}

function fitpoly(e,b){
var a=new Array()
var n = 1+b,e=[[0,0]].concat(e),ns=e.length-1
for(i=0;i<=n+1;i++) {
    a[i]=new Array();
    for(j=0;j<=n+1;++j)
        a[i][j]=0
}
for(m=1;m <= n;m++)
    for(i=1;i<= m;i++) {
        j = m - i + 1; 
        for(ii=1;ii <= ns;ii++)
            a[i][j] = a[i][j] + Math.pow(e[ii][0], m-1)
    }  
for(i=1;i<= n;++i)
    for(ii=1;ii<=ns;++ii)
        a[i][n+1] = a[i][n+1] +e[ii][1]*Math.pow(e[ii][0],i-1) 
for(m = n+2 ; m <= 2*n ; ++m)
    for(i = m-n; i<= n;++i) {
        j= m -i 
        for(ii=1; ii<=ns;++ii)
            a[i][j] = a[i][j] + Math.pow(e[ii][0],m-2) // coefficients of system
    }
a.length=a.length-1  
return _solve(a)
}


//and then
poly_degree = 6
points= [[2,2],[2,4],[4,6],[6,4],[8,2]]
// coefficients of polynome 
console.log(fitpoly(points, poly_degree))

// or solve a linear system. Here with six variables
solution = linear([[1,2,3,-2,-3,-26,52],[3,2,5,-2,4,30,-60],[6,1,-4,-1,5,94,-188],[-1,2,4,3,4,30,-60],[-1,4,2,-1,2,26,-52],[3,-3,11,-7,-2,-1,-95]])
console.log(solution)
...