Вычисление полинома в SciLab

Не могли бы вы помочь мне найти ошибку в моем коде? Мне нужно вычислить многочлен с параметрами вектор и значение переменной. Мне не разрешено использовать знак силы (^). У меня есть этот код, но он не работает, и я не вижу, что делаю неправильно.

function f=veelTermEvaluatie(V,x)
        f=V(1);
        for i=2:length(V)
            for j=0:i-1
                if j=0 then x=x
                    else x=x*x
                end
                f=V(i)*x
            end
        end
    endfunction

    V=[1 2 3 4 5 6]
    x=3

person javaniewbie    schedule 25.02.2014    source источник
comment
Поскольку код так далек от полиномиального вычисления, пожалуйста, объясните в абстрактных терминах, что именно вы хотите вычислить. f=sum(i=1 to n) V(i)*x^(i-1) или f=sum(i=1 to n) V(i)*x^(n-i) или что-то совсем другое?   -  person Lutz Lehmann    schedule 03.03.2014


Ответы (3)


Сначала я провел рефакторинг вашего кода, чтобы удалить ситуацию с j = 0, поскольку это ничего не меняет, поскольку x=x его можно пропустить, начав с j = 1. Я также добавил отладочную печать:

function f=veelTermEvaluatie(V,x)
    f=V(1);

    for i=2:length(V)

        printf("\nI: %d --> ", i)            
        for j=1:i-1                
            x = x * x
            printf("j: %d, x=%d ",j,x)
        end

        f=V(i)*x
    end

    return f
endfunction

После этого стало ясно, что вы каждый раз умножаете один и тот же x:

I: 2 --> j: 1, x=9 
I: 3 --> j: 1, x=81 j: 2, x=6561 
I: 4 --> j: 1, x=43046721 j: 2, x=-501334399 j: 3, x=0 
I: 5 --> j: 1, x=0 j: 2, x=0 j: 3, x=0 j: 4, x=Inf 
I: 6 --> j: 1, x=Inf j: 2, x=Inf j: 3, x=Inf j: 4, x=Inf j: 5, x=Inf 

Также происходит то, что вы обновляете значение f до самого высокого члена, игнорируя любые другие члены. Я думаю, ваш смысл в том, чтобы вернуть все термины

Поэтому вы должны создать локальный x, который сбрасывается для каждого термина.

Рабочий пример

function f=veelTermEvaluatie(V,x)

    //Initialize the result to be a copy of the input
    f=V;

    // For each element in the input (except the first)
    for i=2:length(V)

        printf("\nI: %d --> ", i);
        //Initialize a local x variable to the global x
        new_x = x;

        for j=1:i-1
            // Update only the local x                 
            new_x = new_x * x;
            printf("j: %d, x=%d ",j,x);
        end

        // Multiply the value in the array with the local x value
        f(i)=V(i)*new_x;
    end

    return f
endfunction

V=[1 2 3 4 5 6]
x=3

result = veelTermEvaluatie(V,x)

disp(result)
disp(sum(result))
person spoorcc    schedule 25.02.2014
comment
Это все еще кажется неправильным с точки зрения оценки многочлена с коэффициентами V при x. Возвращаемый массив не является значением полинома. - person Lutz Lehmann; 03.03.2014
comment
Предлагаемый код крайне уродлив и неэффективен. - person Stéphane Mottelet; 12.04.2019

В Scilab уже есть функция horner, поэтому вам не нужно изобретать велосипед. Например, чтобы оценить полином 1+2*x+4*x^2+8*x^3 в x=-1,0,1, вы можете действовать следующим образом:

p = poly([1 2 4 8],'x','coeff')
pval = horner(p,[-1 0 1])

что дает следующий вывод

--> p = poly([1 2 4 8],'x','coeff')
 p  = 
            2    3
   1 +2x +4x  +8x

--> pval = horner(p,[-1 0 1])
 pval  = 

  -5.   1.   15.
person Stéphane Mottelet    schedule 12.04.2019

Что вам нужно сделать, так это реализовать схему Хорнера.

f=V(n)
for i from n-1 down to 0 do
    f = f*x
    f = f+V(i)
end for
return f

В вопросе вы возвращаете массив значений V(i)*x^(2^i), в предыдущем ответе возвращается массив оцененных термов V(i)*x^i, но значение полинома является суммой по этим терминам.

Пожалуйста, уточните формат ввода. Является ли V массивом с диапазоном индексов 1:n? Какова предполагаемая связь между индексом и степенью?

person Lutz Lehmann    schedule 03.03.2014