Сгенерируйте символьный интерполирующий полином в Scilab

Я сделал код для вычисления результата метода разделенных разностей и метода Лагранжа путем интерполяции точек. Я также хотел бы построить многочлен с использованием символьных переменных, но как я могу это сделать?

function dividedDifferences(X,Y,x)
    ddMatrix = X'
    ddMatrix(:,2) = Y'
    for j=3:length(Y)+3
        for i=1:length(Y)+2-j
            ddMatrix(i,j) = (ddMatrix(i,j-1)-ddMatrix(i+1,j-1))/(ddMatrix(i,1)-ddMatrix(i+j-2,1))
        end
    end
    disp(ddMatrix)

    Px = 0
    for j=2:length(Y)+1
        prd = 1
        for i=1:j-2
            prd = prd * (x - ddMatrix(i,1))
        end
        Px = Px + ddMatrix(1,j)*prd
    end
    disp(Px)   
    endfunction

    function lagrange(X,Y,x)
    for i=1:length(Y)
        l(i)=1
        for j=1:length(Y)
            if i~=j
                l(i) = l(i)*(x-X(j))/(X(i)-X(j))
            end
        end
    end
    disp(l')

    L=0
    for i=1:length(Y)
        L = L+Y(i)*l(i)
    end
    disp(L)
endfunction

//example instance
X = [0 1 5 8]
Y = [0 1 8 16.4]
x = 7

dividedDifferences(X,Y,x)
lagrange(X,Y,x)

person 0rkan    schedule 21.12.2015    source источник


Ответы (1)


Чтобы создать символьный полином, инициализируйте символьную переменную с помощью x = poly(0,"x"), где x — это имя переменной, используемой в полиноме. Затем приступайте к вычислениям точно так же, как вы делали это в функции lagrange. По сути, я скопировал вашу функцию на symboliclagrange ниже, вырезав числовой параметр и промежуточный дисплей:

function symboliclagrange(X,Y)
    x = poly(0,"x")
    for i=1:length(Y)
        l(i)=1
        for j=1:length(Y)
            if i~=j
                l(i) = l(i)*(x-X(j))/(X(i)-X(j))
            end
        end
    end
    L=0
    for i=1:length(Y)
        L = L+Y(i)*l(i)
    end
    disp(L)
endfunction

С вашими входными данными X = [0 1 5 8], Y = [0 1 8 16.4] на выходе будет 0,85x+0,15x2, что является правильным интерполяционным полиномом.

person Community    schedule 01.01.2016
comment
Спасибо! Не могли бы вы просто изменить использование x в l(i)= на p? То, как это написано, дает Undefined variable: x в строке 7. - person 0rkan; 01.01.2016
comment
Точно, была опечатка. Исправлено - person ; 01.01.2016
comment
После того, как я создам этот символический многочлен, есть ли способ решить его с учетом дискретного x? e.g.: x=7 - person 0rkan; 02.01.2016
comment
Да: используйте horner. Если L — это символьный многочлен, то horner(L, 7) — это его значение в 7. - person ; 02.01.2016